cubicweb/devtools/devctl.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Wed, 26 Oct 2016 08:34:34 +0200
changeset 11751 b57b76091481
parent 11735 7a170207acbf
child 11818 fdc0a8260fd2
permissions -rw-r--r--
[devtools] Make dependency on backports.tempfile (Python2) optional The package may not be available in all systems (e.g. no Debian package exist at the moment), and we should not crash with ImportError when importing testlib from client code. Follow up on a6dc650bc230 where the dependency was introduced.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
     1
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5375
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5545
diff changeset
    18
"""additional cubicweb-ctl commands and command handlers for cubicweb and
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5545
diff changeset
    19
cubicweb's cubes development
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5545
diff changeset
    20
"""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
    21
from __future__ import print_function
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
    23
# *ctl module should limit the number of import to be imported as quickly as
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
    24
# possible (for cubicweb-ctl reactivity, necessary for instance for usable bash
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
    25
# completion). So import locally in command helpers.
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    26
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    27
import shutil
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    28
import tempfile
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
import sys
10963
9b1c7f337eb3 [devtools] stop using datetime.now() in cwctl newcube and i18ncube
Julien Cristau <julien.cristau@logilab.fr>
parents: 10686
diff changeset
    30
from datetime import datetime, date
6749
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    31
from os import mkdir, chdir, path as osp
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
    32
import pkg_resources
2551
91f579b7a1e1 [F bw compat] warn if entities.pot exists but consider it anyway
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2534
diff changeset
    33
from warnings import warn
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
11716
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
    35
from pytz import UTC
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
    36
10967
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
    37
from six.moves import input
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
    38
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
from logilab.common import STD_BLACKLIST
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    40
from logilab.common.fileutils import ensure_fs_mode
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    41
from logilab.common.shellutils import find
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
    42
3978
2c95e3033f64 finish yesterday work on rql constraints:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3858
diff changeset
    43
from cubicweb.__pkginfo__ import version as cubicwebversion
8247
65b0d2587fb5 [cubicweb-ctl] i18ncube return 2 (failed command) on failure (closes #2192336)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7990
diff changeset
    44
from cubicweb import CW_SOFTWARE_ROOT as BASEDIR, BadCommandUsage, ExecutionError
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    45
from cubicweb.i18n import extract_from_tal, execute2
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
    46
from cubicweb.cwctl import CWCTL
6749
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    47
from cubicweb.cwconfig import CubicWebNoAppConfiguration
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
    48
from cubicweb.toolsutils import (SKEL_EXCLUDE, Command, copy_skeleton,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
    49
                                 underline_title)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
from cubicweb.web.webconfig import WebConfiguration
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
from cubicweb.server.serverconfig import ServerConfiguration
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
2790
968108e16066 move underline_title to toolsutils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2773
diff changeset
    53
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    54
__docformat__ = "restructuredtext en"
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    55
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
    56
11088
b62b9d78b533 ensure .tox is blacklisted when recursing on the fs to get some files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10967
diff changeset
    57
STD_BLACKLIST = set(STD_BLACKLIST)
b62b9d78b533 ensure .tox is blacklisted when recursing on the fs to get some files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10967
diff changeset
    58
STD_BLACKLIST.add('.tox')
b62b9d78b533 ensure .tox is blacklisted when recursing on the fs to get some files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10967
diff changeset
    59
STD_BLACKLIST.add('test')
11727
2efe0bf90ebb i18ncube should ignore node_modules directory by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11726
diff changeset
    60
STD_BLACKLIST.add('node_modules')
11088
b62b9d78b533 ensure .tox is blacklisted when recursing on the fs to get some files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10967
diff changeset
    61
b62b9d78b533 ensure .tox is blacklisted when recursing on the fs to get some files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10967
diff changeset
    62
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    63
class DevConfiguration(ServerConfiguration, WebConfiguration):
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    64
    """dummy config to get full library schema and appobjects for
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    65
    a cube or for cubicweb (without a home)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    66
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
    creating = True
9258
4e79f587c6ab Rename cleanup_interface_sobjects into cleanup_unused_appobjects
Julien Cristau <julien.cristau@logilab.fr>
parents: 9231
diff changeset
    68
    cleanup_unused_appobjects = False
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    69
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    70
    cubicweb_appobject_path = (ServerConfiguration.cubicweb_appobject_path
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    71
                               | WebConfiguration.cubicweb_appobject_path)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    72
    cube_appobject_path = (ServerConfiguration.cube_appobject_path
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    73
                           | WebConfiguration.cube_appobject_path)
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    74
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
    75
    def __init__(self, *cubes):
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    76
        super(DevConfiguration, self).__init__(cubes and cubes[0] or None)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    77
        if cubes:
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    78
            self._cubes = self.reorder_cubes(
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    79
                self.expand_cubes(cubes, with_recommends=True))
5534
b75aa6ce0c04 [i18ncube] we must load site_cubicweb file before calling set_schema, else we may miss some options or other initialization stuff necessary to appobject loading
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5456
diff changeset
    80
            self.load_site_cubicweb()
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    81
        else:
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
    82
            self._cubes = ()
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
    83
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
    @property
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    85
    def apphome(self):
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    86
        return None
6749
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    87
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    88
    def available_languages(self):
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    89
        return self.cw_languages()
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
    90
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    91
    def main_config_file(self):
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    92
        return None
5442
3ed8afbbdf70 [webconfig] refactor/cleanup debug mode management on startup: simply use config.debugmode instead of debug argument everywhere...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    93
    def init_log(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    94
        pass
10474
1dcc52f5e340 [cwctl] allow overriding config settings from the command line (closes #5557656)
David Douard <david.douard@logilab.fr>
parents: 10413
diff changeset
    95
    def load_configuration(self, **kw):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    96
        pass
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    97
    def default_log_file(self):
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
    98
        return None
10308
3f94034cc972 [hooks] add a looping task that dumps the stats regularly in a file
David Douard <david.douard@logilab.fr>
parents: 10301
diff changeset
    99
    def default_stats_file(self):
3f94034cc972 [hooks] add a looping task that dumps the stats regularly in a file
David Douard <david.douard@logilab.fr>
parents: 10301
diff changeset
   100
        return None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   103
def cleanup_sys_modules(config):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   104
    # cleanup sys.modules, required when we're updating multiple cubes
10686
a08d5a657836 [py3k] add list() around dict methods
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   105
    for name, mod in list(sys.modules.items()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
        if mod is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
            # duh ? logilab.common.os for instance
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
            del sys.modules[name]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
            continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
        if not hasattr(mod, '__file__'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
            continue
7752
df91baa5b837 [devctl] do not crash in the (rare, odd) case where mod.__file__ is None (closes #1908664)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7745
diff changeset
   112
        if mod.__file__ is None:
df91baa5b837 [devctl] do not crash in the (rare, odd) case where mod.__file__ is None (closes #1908664)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7745
diff changeset
   113
            # odd/rare but real
df91baa5b837 [devctl] do not crash in the (rare, odd) case where mod.__file__ is None (closes #1908664)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7745
diff changeset
   114
            continue
8537
e30d0a7f0087 [config] turn internal configuration methods building appobjects search path into normal method rather than class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8454
diff changeset
   115
        for path in config.appobjects_path():
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
            if mod.__file__.startswith(path):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
                del sys.modules[name]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
                break
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   119
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   120
def generate_schema_pot(w, cubedir=None):
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   121
    """generate a pot file with schema specific i18n messages
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   122
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   123
    notice that relation definitions description and static vocabulary
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   124
    should be marked using '_' and extracted using xgettext
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   125
    """
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7990
diff changeset
   126
    from cubicweb.cwvreg import CWRegistryStore
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   127
    if cubedir:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   128
        cube = osp.split(cubedir)[-1]
11460
5be729810695 [devtools] Handle i18ncube command for "cubes as packages"
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11454
diff changeset
   129
        if cube.startswith('cubicweb_'):
5be729810695 [devtools] Handle i18ncube command for "cubes as packages"
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11454
diff changeset
   130
            cube = cube[len('cubicweb_'):]
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   131
        config = DevConfiguration(cube)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   132
        depcubes = list(config._cubes)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   133
        depcubes.remove(cube)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   134
        libconfig = DevConfiguration(*depcubes)
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   135
    else:
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   136
        config = DevConfiguration()
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   137
        cube = libconfig = None
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   138
    cleanup_sys_modules(config)
1665
14a8f9d434c8 more i18nupdate fixes
sylvain.thenault@logilab.fr
parents: 1662
diff changeset
   139
    schema = config.load_schema(remove_unused_rtypes=False)
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7990
diff changeset
   140
    vreg = CWRegistryStore(config)
373
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   141
    # set_schema triggers objects registrations
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   142
    vreg.set_schema(schema)
0c931b2e2a68 fix i18n catalog generation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 365
diff changeset
   143
    w(DEFAULT_POT_HEAD)
4722
9c13d5db03d9 pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   144
    _generate_schema_pot(w, vreg, schema, libconfig=libconfig)
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   145
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   146
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   147
def _generate_schema_pot(w, vreg, schema, libconfig=None):
4021
280c910c8710 move i18n / migration modules from cw.common to cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   148
    from cubicweb.i18n import add_msg
6481
103774c8c215 [schema categorization] new NO_I18NCONTEXT set usable to somewhat control c-c i18n
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6460
diff changeset
   149
    from cubicweb.schema import NO_I18NCONTEXT, CONSTRAINTS
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   150
    w('# schema pot file, generated on %s\n'
10963
9b1c7f337eb3 [devtools] stop using datetime.now() in cwctl newcube and i18ncube
Julien Cristau <julien.cristau@logilab.fr>
parents: 10686
diff changeset
   151
      % datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   152
    w('# \n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
    w('# singular and plural forms for each entity type\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
    w('\n')
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   155
    vregdone = set()
9154
e713c47a993d [devctl] properly generate i18n messsages for cubes that uses uicfg instances (closes #2811282)
David Douard <david.douard@logilab.fr>
parents: 8866
diff changeset
   156
    afss = vreg['uicfg']['autoform_section']
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   157
    aiams = vreg['uicfg']['actionbox_appearsin_addmenu']
1470
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   158
    if libconfig is not None:
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   159
        # processing a cube, libconfig being a config with all its dependencies
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   160
        # (cubicweb incl.)
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8665
diff changeset
   161
        from cubicweb.cwvreg import CWRegistryStore
1665
14a8f9d434c8 more i18nupdate fixes
sylvain.thenault@logilab.fr
parents: 1662
diff changeset
   162
        libschema = libconfig.load_schema(remove_unused_rtypes=False)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   163
        cleanup_sys_modules(libconfig)
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7990
diff changeset
   164
        libvreg = CWRegistryStore(libconfig)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   165
        libvreg.set_schema(libschema) # trigger objects registration
9154
e713c47a993d [devctl] properly generate i18n messsages for cubes that uses uicfg instances (closes #2811282)
David Douard <david.douard@logilab.fr>
parents: 8866
diff changeset
   166
        libafss = libvreg['uicfg']['autoform_section']
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   167
        libaiams = libvreg['uicfg']['actionbox_appearsin_addmenu']
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   168
        # prefill vregdone set
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   169
        list(_iter_vreg_objids(libvreg, vregdone))
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   170
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   171
        def is_in_lib(rtags, eschema, rschema, role, tschema, predicate=bool):
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   172
            return any(predicate(rtag.etype_get(eschema, rschema, role, tschema))
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   173
                       for rtag in rtags)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
    else:
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   175
        # processing cubicweb itself
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   176
        libschema = {}
3978
2c95e3033f64 finish yesterday work on rql constraints:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3858
diff changeset
   177
        for cstrtype in CONSTRAINTS:
2c95e3033f64 finish yesterday work on rql constraints:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3858
diff changeset
   178
            add_msg(w, cstrtype)
9231
d2edd8ac5f33 [c-c i18ncubicweb] fix crash, closes #3096647
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9203
diff changeset
   179
        libafss = libaiams = None
d2edd8ac5f33 [c-c i18ncubicweb] fix crash, closes #3096647
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9203
diff changeset
   180
        is_in_lib = lambda *args: False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   181
    done = set()
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   182
    for eschema in sorted(schema.entities()):
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   183
        if eschema.type in libschema:
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   184
            done.add(eschema.description)
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   185
    for eschema in sorted(schema.entities()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   186
        etype = eschema.type
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   187
        if etype not in libschema:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   188
            add_msg(w, etype)
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   189
            add_msg(w, '%s_plural' % etype)
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3638
diff changeset
   190
            if not eschema.final:
10163
4001cfe2f44d [web/views] Stop mishandling the fieldset name in the default form renderer
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9543
diff changeset
   191
                add_msg(w, 'This %s:' % etype)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   192
                add_msg(w, 'New %s' % etype)
10217
75cd7df5c32e [i18n generation] add missing 'add a EntityType' message to generated catalogs. Closes #5012581
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9543
diff changeset
   193
                add_msg(w, 'add a %s' % etype) # AddNewAction
10174
7e1c8fb9c407 [devtools] restore i18n of string removed in 4001cfe2f44d
Julien Cristau <julien.cristau@logilab.fr>
parents: 10163
diff changeset
   194
                if libconfig is not None:  # processing a cube
7e1c8fb9c407 [devtools] restore i18n of string removed in 4001cfe2f44d
Julien Cristau <julien.cristau@logilab.fr>
parents: 10163
diff changeset
   195
                    # As of 3.20.3 we no longer use it, but keeping this string
7e1c8fb9c407 [devtools] restore i18n of string removed in 4001cfe2f44d
Julien Cristau <julien.cristau@logilab.fr>
parents: 10163
diff changeset
   196
                    # allows developers to run i18ncube with new cubicweb and still
7e1c8fb9c407 [devtools] restore i18n of string removed in 4001cfe2f44d
Julien Cristau <julien.cristau@logilab.fr>
parents: 10163
diff changeset
   197
                    # have the right translations at runtime for older versions
7e1c8fb9c407 [devtools] restore i18n of string removed in 4001cfe2f44d
Julien Cristau <julien.cristau@logilab.fr>
parents: 10163
diff changeset
   198
                    add_msg(w, 'This %s' % etype)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   199
            if eschema.description and not eschema.description in done:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   200
                done.add(eschema.description)
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   201
                add_msg(w, eschema.description)
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3638
diff changeset
   202
        if eschema.final:
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   203
            continue
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   204
        for rschema, targetschemas, role in eschema.relation_definitions(True):
4399
bc8d7ac70347 skip final relations at this point
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4380
diff changeset
   205
            if rschema.final:
bc8d7ac70347 skip final relations at this point
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4380
diff changeset
   206
                continue
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   207
            for tschema in targetschemas:
9154
e713c47a993d [devctl] properly generate i18n messsages for cubes that uses uicfg instances (closes #2811282)
David Douard <david.douard@logilab.fr>
parents: 8866
diff changeset
   208
9201
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   209
                for afs in afss:
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   210
                    fsections = afs.etype_get(eschema, rschema, role, tschema)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   211
                    if 'main_inlined' in fsections and not \
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   212
                            is_in_lib(libafss, eschema, rschema, role, tschema,
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   213
                                      lambda x: 'main_inlined' in x):
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   214
                        add_msg(w, 'add a %s' % tschema,
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   215
                                'inlined:%s.%s.%s' % (etype, rschema, role))
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   216
                        add_msg(w, str(tschema),
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   217
                                'inlined:%s.%s.%s' % (etype, rschema, role))
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   218
                        break
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   219
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   220
                for aiam in aiams:
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   221
                    if aiam.etype_get(eschema, rschema, role, tschema) and not \
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   222
                            is_in_lib(libaiams, eschema, rschema, role, tschema):
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   223
                        if role == 'subject':
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   224
                            label = 'add %s %s %s %s' % (eschema, rschema,
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   225
                                                         tschema, role)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   226
                            label2 = "creating %s (%s %%(linkto)s %s %s)" % (
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   227
                                tschema, eschema, rschema, tschema)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   228
                        else:
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   229
                            label = 'add %s %s %s %s' % (tschema, rschema,
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   230
                                                         eschema, role)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   231
                            label2 = "creating %s (%s %s %s %%(linkto)s)" % (
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   232
                                tschema, tschema, rschema, eschema)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   233
                        add_msg(w, label)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   234
                        add_msg(w, label2)
b0f6e8c14e7f [i18ncube] fix crash due to duplicated messages in generated schema.pot
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9157
diff changeset
   235
                        break
3858
ba96e4607e67 add XX reminder
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   236
            # XXX also generate "creating ...' messages for actions in the
ba96e4607e67 add XX reminder
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   237
            # addrelated submenu
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   238
    w('# subject and object forms for each relation type\n')
4467
0e73d299730a fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4439
diff changeset
   239
    w('# (no object form for final or symmetric relation types)\n')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   240
    w('\n')
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   241
    for rschema in sorted(schema.relations()):
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   242
        if rschema.type in libschema:
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   243
            done.add(rschema.type)
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   244
            done.add(rschema.description)
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   245
    for rschema in sorted(schema.relations()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   246
        rtype = rschema.type
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   247
        if rtype not in libschema:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   248
            # bw compat, necessary until all translation of relation are done
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   249
            # properly...
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   250
            add_msg(w, rtype)
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   251
            done.add(rtype)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   252
            if rschema.description and rschema.description not in done:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   253
                add_msg(w, rschema.description)
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   254
            done.add(rschema.description)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   255
            librschema = None
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   256
        else:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   257
            librschema = libschema.rschema(rtype)
3281
bea1bde00fbc [i18n] do not add context information for metadata relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3280
diff changeset
   258
        # add context information only for non-metadata rtypes
6481
103774c8c215 [schema categorization] new NO_I18NCONTEXT set usable to somewhat control c-c i18n
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6460
diff changeset
   259
        if rschema not in NO_I18NCONTEXT:
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   260
            libsubjects = librschema and librschema.subjects() or ()
3281
bea1bde00fbc [i18n] do not add context information for metadata relations
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3280
diff changeset
   261
            for subjschema in rschema.subjects():
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   262
                if not subjschema in libsubjects:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   263
                    add_msg(w, rtype, subjschema.type)
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   264
        if not (rschema.final or rschema.symmetric):
6481
103774c8c215 [schema categorization] new NO_I18NCONTEXT set usable to somewhat control c-c i18n
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6460
diff changeset
   265
            if rschema not in NO_I18NCONTEXT:
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   266
                libobjects = librschema and librschema.objects() or ()
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   267
                for objschema in rschema.objects():
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   268
                    if not objschema in libobjects:
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   269
                        add_msg(w, '%s_object' % rtype, objschema.type)
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   270
            if rtype not in libschema:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   271
                # bw compat, necessary until all translation of relation are
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   272
                # done properly...
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   273
                add_msg(w, '%s_object' % rtype)
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10662
diff changeset
   274
        for rdef in rschema.rdefs.values():
7745
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   275
            if not rdef.description or rdef.description in done:
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   276
                continue
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   277
            if (librschema is None or
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   278
                (rdef.subject, rdef.object) not in librschema.rdefs or
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   279
                librschema.rdefs[(rdef.subject, rdef.object)].description != rdef.description):
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   280
                add_msg(w, rdef.description)
1013c31bfbee [.po generation] closes #1902315: c i18ncube doesn't consider relation definition description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   281
            done.add(rdef.description)
3285
fa3dc35b564f fix .po generation: ensure we get all msgids when building a cube catalog
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3281
diff changeset
   282
    for objid in _iter_vreg_objids(vreg, vregdone):
1470
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   283
        add_msg(w, '%s_description' % objid)
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   284
        add_msg(w, objid)
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   285
3293
69c0ba095536 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3230 3287
diff changeset
   286
4722
9c13d5db03d9 pylint suggested refactorings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   287
def _iter_vreg_objids(vreg, done):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   288
    for reg, objdict in vreg.items():
6443
a5bed0cd3956 [i18n cube] skip bw compat registries boxes and contentnavigation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6356
diff changeset
   289
        if reg in ('boxes', 'contentnavigation'):
a5bed0cd3956 [i18n cube] skip bw compat registries boxes and contentnavigation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6356
diff changeset
   290
            continue
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10662
diff changeset
   291
        for objects in objdict.values():
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   292
            for obj in objects:
3677
acdba524bb8f fix i18ncube
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3674
diff changeset
   293
                objid = '%s_%s' % (reg, obj.__regid__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   294
                if objid in done:
1470
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   295
                    break
7990
a673d1d9a738 [diet] drop pre 3.6 API compatibility (but attempt to keep data cmopatibility). Closes #2017916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7752
diff changeset
   296
                pdefs = getattr(obj, 'cw_property_defs', {})
3677
acdba524bb8f fix i18ncube
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3674
diff changeset
   297
                if pdefs:
1470
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   298
                    yield objid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   299
                    done.add(objid)
1470
fbdf66a08fbb don't add to cube i18n catalog msg id for components redefined from cw or from a depending cube
sylvain.thenault@logilab.fr
parents: 1451
diff changeset
   300
                    break
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   301
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   302
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   303
DEFAULT_POT_HEAD = r'''msgid ""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   304
msgstr ""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   305
"Project-Id-Version: cubicweb %s\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   306
"PO-Revision-Date: 2008-03-28 18:14+0100\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   307
"Last-Translator: Logilab Team <contact@logilab.fr>\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   308
"Language-Team: fr <contact@logilab.fr>\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   309
"MIME-Version: 1.0\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   310
"Content-Type: text/plain; charset=UTF-8\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   311
"Content-Transfer-Encoding: 8bit\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   312
"Generated-By: cubicweb-devtools\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   313
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   314
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   315
''' % cubicwebversion
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   316
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   317
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   318
class UpdateCubicWebCatalogCommand(Command):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   319
    """Update i18n catalogs for cubicweb library.
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   320
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   321
    It will regenerate cubicweb/i18n/xx.po files. You'll have then to edit those
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   322
    files to add translations of newly added messages.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   323
    """
1898
39b37f90a8a4 [cw-ctl] rename i18n commands (see #342889)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1850
diff changeset
   324
    name = 'i18ncubicweb'
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   325
    min_args = max_args = 0
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   326
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   327
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   328
        """run the command with its specific arguments"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   329
        import shutil
2446
440cb4ea7e5c [refactor] #342855: replace uses of (deprecated) mktemp
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2092
diff changeset
   330
        import tempfile
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   331
        import yams
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   332
        from logilab.common.fileutils import ensure_fs_mode
58
c7c22b210372 only try to internationalize our own js files
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 57
diff changeset
   333
        from logilab.common.shellutils import globfind, find, rm
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   334
        from logilab.common.modutils import get_module_files
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   335
        from cubicweb.i18n import extract_from_tal, execute2
8257
d54fc706d623 [test] create temporary directory with meaningfull prefix
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8247
diff changeset
   336
        tempdir = tempfile.mkdtemp(prefix='cw-')
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   337
        cwi18ndir = WebConfiguration.i18n_lib_dir()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   338
        print('-> extract messages:', end=' ')
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   339
        print('schema', end=' ')
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   340
        schemapot = osp.join(tempdir, 'schema.pot')
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   341
        potfiles = [schemapot]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   342
        potfiles.append(schemapot)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   343
        # explicit close necessary else the file may not be yet flushed when
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   344
        # we'll using it below
10614
57dfde80df11 [py3k] file → open
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10601
diff changeset
   345
        schemapotstream = open(schemapot, 'w')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   346
        generate_schema_pot(schemapotstream.write, cubedir=None)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   347
        schemapotstream.close()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   348
        print('TAL', end=' ')
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   349
        tali18nfile = osp.join(tempdir, 'tali18n.py')
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   350
        extract_from_tal(find(osp.join(BASEDIR, 'web'), ('.py', '.pt')),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   351
                         tali18nfile)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   352
        print('-> generate .pot files.')
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   353
        pyfiles = get_module_files(BASEDIR)
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   354
        pyfiles += globfind(osp.join(BASEDIR, 'misc', 'migration'), '*.py')
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   355
        schemafiles = globfind(osp.join(BASEDIR, 'schemas'), '*.py')
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   356
        jsfiles = globfind(osp.join(BASEDIR, 'web'), 'cub*.js')
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   357
        for id, files, lang in [('pycubicweb', pyfiles, None),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   358
                                ('schemadescr', schemafiles, None),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   359
                                ('yams', get_module_files(yams.__path__[0]), None),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   360
                                ('tal', [tali18nfile], None),
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   361
                                ('js', jsfiles, 'java'),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   362
                                ]:
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   363
            potfile = osp.join(tempdir, '%s.pot' % id)
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   364
            cmd = ['xgettext', '--no-location', '--omit-header', '-k_']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   365
            if lang is not None:
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   366
                cmd.extend(['-L', lang])
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   367
            cmd.extend(['-o', potfile])
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   368
            cmd.extend(files)
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   369
            execute2(cmd)
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   370
            if osp.exists(potfile):
1502
e25be3c82947 fix i18n catalog compilation
sylvain.thenault@logilab.fr
parents: 1470
diff changeset
   371
                potfiles.append(potfile)
e25be3c82947 fix i18n catalog compilation
sylvain.thenault@logilab.fr
parents: 1470
diff changeset
   372
            else:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   373
                print('-> WARNING: %s file was not generated' % potfile)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   374
        print('-> merging %i .pot files' % len(potfiles))
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   375
        cubicwebpot = osp.join(tempdir, 'cubicweb.pot')
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   376
        cmd = ['msgcat', '-o', cubicwebpot] + potfiles
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   377
        execute2(cmd)
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   378
        print('-> merging main pot file with existing translations.')
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   379
        chdir(cwi18ndir)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   380
        toedit = []
6749
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6356
diff changeset
   381
        for lang in CubicWebNoAppConfiguration.cw_languages():
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   382
            target = '%s.po' % lang
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   383
            cmd = ['msgmerge', '-N', '--sort-output', '-o',
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   384
                   target+'new', target, cubicwebpot]
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   385
            execute2(cmd)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   386
            ensure_fs_mode(target)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   387
            shutil.move('%snew' % target, target)
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   388
            toedit.append(osp.abspath(target))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   389
        # cleanup
60
dc90556488d8 oops, bad changeset review, revert debug changes
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 58
diff changeset
   390
        rm(tempdir)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   391
        # instructions pour la suite
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   392
        print('-> regenerated CubicWeb\'s .po catalogs.')
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   393
        print('\nYou can now edit the following files:')
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   394
        print('* ' + '\n* '.join(toedit))
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   395
        print('when you are done, run "cubicweb-ctl i18ncube yourcube".')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   396
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   397
6444
cc091175d3da [c-c i18ncube] proper command class name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6443
diff changeset
   398
class UpdateCubeCatalogCommand(Command):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   399
    """Update i18n catalogs for cubes. If no cube is specified, update
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   400
    catalogs of all registered cubes.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   401
    """
1898
39b37f90a8a4 [cw-ctl] rename i18n commands (see #342889)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1850
diff changeset
   402
    name = 'i18ncube'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   403
    arguments = '[<cube>...]'
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   404
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   405
    def run(self, args):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   406
        """run the command with its specific arguments"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   407
        if args:
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   408
            cubes = [DevConfiguration.cube_dir(cube) for cube in args]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
        else:
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   410
            cubes = [DevConfiguration.cube_dir(cube)
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   411
                     for cube in DevConfiguration.available_cubes()]
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   412
            cubes = [cubepath for cubepath in cubes
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   413
                     if osp.exists(osp.join(cubepath, 'i18n'))]
8247
65b0d2587fb5 [cubicweb-ctl] i18ncube return 2 (failed command) on failure (closes #2192336)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7990
diff changeset
   414
        if not update_cubes_catalogs(cubes):
65b0d2587fb5 [cubicweb-ctl] i18ncube return 2 (failed command) on failure (closes #2192336)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7990
diff changeset
   415
            raise ExecutionError("update cubes i18n catalog failed")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   416
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   417
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   418
def update_cubes_catalogs(cubes):
8620
61c4bdd70dd8 [cw-ctl] silence msgcat and msgfmt (closes #2527594)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8544
diff changeset
   419
    from subprocess import CalledProcessError
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   420
    for cubedir in cubes:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   421
        if not osp.isdir(cubedir):
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   422
            print('-> ignoring %s that is not a directory.' % cubedir)
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   423
            continue
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   424
        try:
5537
2889091bd1bf [i18ncube] do not crash if cube has nothing to translate
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5534
diff changeset
   425
            toedit = update_cube_catalogs(cubedir)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8666
diff changeset
   426
        except CalledProcessError as exc:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   427
            print('\n*** error while updating catalogs for cube', cubedir)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   428
            print('cmd:\n%s' % exc.cmd)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   429
            print('stdout:\n%s\nstderr:\n%s' % exc.data)
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   430
        except Exception:
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   431
            import traceback
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   432
            traceback.print_exc()
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   433
            print('*** error while updating catalogs for cube', cubedir)
8247
65b0d2587fb5 [cubicweb-ctl] i18ncube return 2 (failed command) on failure (closes #2192336)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7990
diff changeset
   434
            return False
2527
e60db6312aa0 per cube message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2458
diff changeset
   435
        else:
e60db6312aa0 per cube message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2458
diff changeset
   436
            # instructions pour la suite
5537
2889091bd1bf [i18ncube] do not crash if cube has nothing to translate
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5534
diff changeset
   437
            if toedit:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   438
                print('-> regenerated .po catalogs for cube %s.' % cubedir)
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   439
                print('\nYou can now edit the following files:')
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   440
                print('* ' + '\n* '.join(toedit))
5537
2889091bd1bf [i18ncube] do not crash if cube has nothing to translate
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5534
diff changeset
   441
                print ('When you are done, run "cubicweb-ctl i18ninstance '
2889091bd1bf [i18ncube] do not crash if cube has nothing to translate
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5534
diff changeset
   442
                       '<yourinstance>" to see changes in your instances.')
8247
65b0d2587fb5 [cubicweb-ctl] i18ncube return 2 (failed command) on failure (closes #2192336)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7990
diff changeset
   443
            return True
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   444
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   445
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   446
class I18nCubeMessageExtractor(object):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   447
    """This class encapsulates all the xgettext extraction logic
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   448
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   449
    ``generate_pot_file`` is the main entry point called by the ``i18ncube``
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   450
    command. A cube might decide to customize extractors to ignore a given
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   451
    directory or to extract messages from a new file type (e.g. .jinja2 files)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   452
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   453
    For each file type, the class must define two methods:
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   454
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   455
    - ``collect_{filetype}()`` that must return the list of files
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   456
      xgettext should inspect,
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   457
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   458
    - ``extract_{filetype}(files)`` that calls xgettext and returns the
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   459
      path to the generated ``pot`` file
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   460
    """
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   461
    blacklist = STD_BLACKLIST
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   462
    formats = ['tal', 'js', 'py']
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   463
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   464
    def __init__(self, workdir, cubedir):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   465
        self.workdir = workdir
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   466
        self.cubedir = cubedir
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   467
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   468
    def generate_pot_file(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   469
        """main entry point: return the generated ``cube.pot`` file
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   470
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   471
        This function first generates all the pot files (schema, tal,
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   472
        py, js) and then merges them in a single ``cube.pot`` that will
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   473
        be used to eventually update the ``i18n/*.po`` files.
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   474
        """
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   475
        potfiles = self.generate_pot_files()
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   476
        potfile = osp.join(self.workdir, 'cube.pot')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   477
        print('-> merging %i .pot files' % len(potfiles))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   478
        cmd = ['msgcat', '-o', potfile]
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   479
        cmd.extend(potfiles)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   480
        execute2(cmd)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   481
        return potfile if osp.exists(potfile) else None
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   482
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   483
    def find(self, exts, blacklist=None):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   484
        """collect files with extensions ``exts`` in the cube directory
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   485
        """
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   486
        if blacklist is None:
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   487
            blacklist = self.blacklist
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   488
        return find(self.cubedir, exts, blacklist=blacklist)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   489
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   490
    def generate_pot_files(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   491
        """generate and return the list of all ``pot`` files for the cube
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   492
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   493
        - static-messages.pot,
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   494
        - schema.pot,
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   495
        - one ``pot`` file for each inspected format (.py, .js, etc.)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   496
        """
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   497
        print('-> extracting messages:', end=' ')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   498
        potfiles = []
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   499
        # static messages
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   500
        if osp.exists(osp.join('i18n', 'entities.pot')):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   501
            warn('entities.pot is deprecated, rename file '
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   502
                 'to static-messages.pot (%s)'
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   503
                 % osp.join('i18n', 'entities.pot'), DeprecationWarning)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   504
            potfiles.append(osp.join('i18n', 'entities.pot'))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   505
        elif osp.exists(osp.join('i18n', 'static-messages.pot')):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   506
            potfiles.append(osp.join('i18n', 'static-messages.pot'))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   507
        # messages from schema
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   508
        potfiles.append(self.schemapot())
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   509
        # messages from sourcecode
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   510
        for fmt in self.formats:
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   511
            collector = getattr(self, 'collect_{0}'.format(fmt))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   512
            extractor = getattr(self, 'extract_{0}'.format(fmt))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   513
            files = collector()
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   514
            if files:
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   515
                potfile = extractor(files)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   516
                if potfile:
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   517
                    potfiles.append(potfile)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   518
        return potfiles
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   519
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   520
    def schemapot(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   521
        """generate the ``schema.pot`` file"""
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   522
        schemapot = osp.join(self.workdir, 'schema.pot')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   523
        print('schema', end=' ')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   524
        # explicit close necessary else the file may not be yet flushed when
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   525
        # we'll using it below
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   526
        schemapotstream = open(schemapot, 'w')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   527
        generate_schema_pot(schemapotstream.write, self.cubedir)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   528
        schemapotstream.close()
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   529
        return schemapot
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   530
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   531
    def _xgettext(self, files, output, k='_', extraopts=''):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   532
        """shortcut to execute the xgettext command and return output file
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   533
        """
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   534
        tmppotfile = osp.join(self.workdir, output)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   535
        cmd = ['xgettext', '--no-location', '--omit-header', '-k' + k,
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   536
               '-o', tmppotfile] + extraopts.split() + files
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   537
        execute2(cmd)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   538
        if osp.exists(tmppotfile):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   539
            return tmppotfile
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   540
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   541
    def collect_tal(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   542
        print('TAL', end=' ')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   543
        return self.find(('.py', '.pt'))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   544
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   545
    def extract_tal(self, files):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   546
        tali18nfile = osp.join(self.workdir, 'tali18n.py')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   547
        extract_from_tal(files, tali18nfile)
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   548
        return self._xgettext(files, output='tal.pot')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   549
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   550
    def collect_js(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   551
        print('Javascript')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   552
        return [jsfile for jsfile in self.find('.js')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   553
                if osp.basename(jsfile).startswith('cub')]
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   554
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   555
    def extract_js(self, files):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   556
        return self._xgettext(files, output='js.pot',
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   557
                              extraopts='-L java --from-code=utf-8')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   558
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   559
    def collect_py(self):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   560
        print('-> creating cube-specific catalog')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   561
        return self.find('.py')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   562
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   563
    def extract_py(self, files):
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   564
        return self._xgettext(files, output='py.pot')
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   565
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   566
1770
8bd788149f85 refactor and don't crash on error while generating a cube's catalogs
sylvain.thenault@logilab.fr
parents: 1769
diff changeset
   567
def update_cube_catalogs(cubedir):
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   568
    cubedir = osp.abspath(osp.normpath(cubedir))
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   569
    workdir = tempfile.mkdtemp()
11728
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   570
    try:
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   571
        distname = osp.basename(cubedir)
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   572
        cubename = distname.split('_')[-1]
11728
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   573
        print('cubedir', cubedir)
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   574
        extract_cls = I18nCubeMessageExtractor
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   575
        try:
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   576
            extract_cls = pkg_resources.load_entry_point(
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   577
                distname, 'cubicweb.i18ncube', cubename)
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   578
        except (pkg_resources.DistributionNotFound, ImportError):
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   579
            pass  # no customization found
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   580
        print(underline_title('Updating i18n catalogs for cube %s' % cubename))
11728
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   581
        chdir(cubedir)
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   582
        extractor = extract_cls(workdir, cubedir)
11728
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   583
        potfile = extractor.generate_pot_file()
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   584
        if potfile is None:
11735
7a170207acbf [devtools] make i18ncube customizable in a cube
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11728
diff changeset
   585
            print('no message catalog for cube', cubename, 'nothing to translate')
11728
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   586
            return ()
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   587
        print('-> merging main pot file with existing translations:', end=' ')
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   588
        chdir('i18n')
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   589
        toedit = []
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   590
        for lang in CubicWebNoAppConfiguration.cw_languages():
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   591
            print(lang, end=' ')
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   592
            cubepo = '%s.po' % lang
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   593
            if not osp.exists(cubepo):
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   594
                shutil.copy(potfile, cubepo)
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   595
            else:
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   596
                cmd = ['msgmerge', '-N', '-s', '-o', cubepo + 'new',
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   597
                       cubepo, potfile]
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   598
                execute2(cmd)
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   599
                ensure_fs_mode(cubepo)
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   600
                shutil.move('%snew' % cubepo, cubepo)
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   601
            toedit.append(osp.abspath(cubepo))
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   602
        print()
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   603
        return toedit
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   604
    finally:
b96bed36765d [devctl] make sure i18ncube always delete its tempdir
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11727
diff changeset
   605
        # cleanup
11726
a599e23c5712 refactor i18n messages extraction
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 11716
diff changeset
   606
        shutil.rmtree(workdir)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   607
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   608
132
561671b87c22 rename NewTemplateCommand class into NewCubeCommand
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 61
diff changeset
   609
class NewCubeCommand(Command):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   610
    """Create a new cube.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   611
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   612
    <cubename>
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   613
      the name of the new cube. It should be a valid python module name.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   614
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   615
    name = 'newcube'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   616
    arguments = '<cubename>'
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   617
    min_args = max_args = 1
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   618
    options = (
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   619
        ("layout",
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   620
         {'short': 'L', 'type' : 'choice', 'metavar': '<cube layout>',
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   621
          'default': 'simple', 'choices': ('simple', 'full'),
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   622
          'help': 'cube layout. You\'ll get a minimal cube with the "simple" \
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   623
layout, and a full featured cube with "full" layout.',
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   624
          }
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   625
         ),
1106
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   626
        ("directory",
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   627
         {'short': 'd', 'type' : 'string', 'metavar': '<cubes directory>',
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   628
          'help': 'directory where the new cube should be created',
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   629
          }
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   630
         ),
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   631
        ("verbose",
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   632
         {'short': 'v', 'type' : 'yn', 'metavar': '<verbose>',
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   633
          'default': 'n',
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   634
          'help': 'verbose mode: will ask all possible configuration questions',
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   635
          }
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   636
         ),
365
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   637
        ("author",
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   638
         {'short': 'a', 'type' : 'string', 'metavar': '<author>',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   639
          'default': 'LOGILAB S.A. (Paris, FRANCE)',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   640
          'help': 'cube author',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   641
          }
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   642
         ),
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   643
        ("author-email",
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   644
         {'short': 'e', 'type' : 'string', 'metavar': '<email>',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   645
          'default': 'contact@logilab.fr',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   646
          'help': 'cube author\'s email',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   647
          }
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   648
         ),
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   649
        ("author-web-site",
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   650
         {'short': 'w', 'type' : 'string', 'metavar': '<web site>',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   651
          'default': 'http://www.logilab.fr',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   652
          'help': 'cube author\'s web site',
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   653
          }
5d8336b70aa7 make author information configurable
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 264
diff changeset
   654
         ),
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   655
        ("license",
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   656
         {'short': 'l', 'type' : 'choice', 'metavar': '<license>',
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   657
          'default': 'LGPL', 'choices': ('GPL', 'LGPL', ''),
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   658
          'help': 'cube license',
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   659
          }
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   660
         ),
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   661
        )
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   662
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   663
    LICENSES = {
5423
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   664
        'LGPL': '''\
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   665
# This program is free software: you can redistribute it and/or modify it under
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   666
# the terms of the GNU Lesser General Public License as published by the Free
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   667
# Software Foundation, either version 2.1 of the License, or (at your option)
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   668
# any later version.
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   669
#
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   670
# This program is distributed in the hope that it will be useful, but WITHOUT
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   671
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   672
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   673
# details.
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   674
#
10214
88f60d4b9952 [newcube] Make the generated code PEP-8 compliant
Christophe de Vienne <christophe@unlish.com>
parents: 10174
diff changeset
   675
# You should have received a copy of the GNU Lesser General Public License
88f60d4b9952 [newcube] Make the generated code PEP-8 compliant
Christophe de Vienne <christophe@unlish.com>
parents: 10174
diff changeset
   676
# along with this program. If not, see <http://www.gnu.org/licenses/>.
5423
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   677
''',
5537
2889091bd1bf [i18ncube] do not crash if cube has nothing to translate
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5534
diff changeset
   678
5423
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   679
        'GPL': '''\
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   680
# This program is free software: you can redistribute it and/or modify it under
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   681
# the terms of the GNU General Public License as published by the Free Software
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   682
# Foundation, either version 2.1 of the License, or (at your option) any later
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   683
# version.
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   684
#
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   685
# This program is distributed in the hope that it will be useful, but WITHOUT
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   686
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10214
88f60d4b9952 [newcube] Make the generated code PEP-8 compliant
Christophe de Vienne <christophe@unlish.com>
parents: 10174
diff changeset
   687
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
88f60d4b9952 [newcube] Make the generated code PEP-8 compliant
Christophe de Vienne <christophe@unlish.com>
parents: 10174
diff changeset
   688
# details.
5423
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   689
#
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   690
# You should have received a copy of the GNU General Public License along with
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   691
# this program. If not, see <http://www.gnu.org/licenses/>.
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   692
''',
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5385 5421
diff changeset
   693
        '': '# INSERT LICENSE HERE'
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   694
        }
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   695
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   696
    def run(self, args):
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   697
        import re
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   698
        from logilab.common.shellutils import ASK
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   699
        cubename = args[0]
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   700
        if not re.match('[_A-Za-z][_A-Za-z0-9]*$', cubename):
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   701
            raise BadCommandUsage(
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   702
                'cube name must be a valid python module name')
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   703
        verbose = self.get('verbose')
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   704
        destdir = self.get('directory')
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   705
        if not destdir:
1116
163e6a65d488 fix dumb name error, should call cubes_search_path, not cubes_path
sylvain.thenault@logilab.fr
parents: 1106
diff changeset
   706
            cubespath = ServerConfiguration.cubes_search_path()
1106
de873146183a fix newcube command to deal with cubes path
sylvain.thenault@logilab.fr
parents: 1105
diff changeset
   707
            if len(cubespath) > 1:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   708
                raise BadCommandUsage(
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   709
                    "can't guess directory where to put the new cube."
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   710
                    " Please specify it using the --directory option")
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   711
            destdir = cubespath[0]
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   712
        if not osp.isdir(destdir):
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   713
            print("-> creating cubes directory", destdir)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   714
            try:
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   715
                mkdir(destdir)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8666
diff changeset
   716
            except OSError as err:
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   717
                self.fail("failed to create directory %r\n(%s)"
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   718
                          % (destdir, err))
5297
cc747dcef851 [c-c newcube] finish #676915: cubicweb-ctl newcube must be aware of python modules and debian package convention (python part already implemented)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5184
diff changeset
   719
        default_name = 'cubicweb-%s' % cubename.lower().replace('_', '-')
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   720
        if verbose:
10967
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
   721
            distname = input('Debian name for your cube ? [%s]): '
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   722
                             % default_name).strip()
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   723
            if not distname:
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   724
                distname = default_name
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   725
            elif not distname.startswith('cubicweb-'):
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   726
                if ASK.confirm('Do you mean cubicweb-%s ?' % distname):
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   727
                    distname = 'cubicweb-' + distname
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   728
        else:
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   729
            distname = default_name
5297
cc747dcef851 [c-c newcube] finish #676915: cubicweb-ctl newcube must be aware of python modules and debian package convention (python part already implemented)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5184
diff changeset
   730
        if not re.match('[a-z][-a-z0-9]*$', distname):
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   731
            raise BadCommandUsage(
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   732
                'cube distname should be a valid debian package name')
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   733
        cubedir = osp.join(destdir, distname)
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   734
        if osp.exists(cubedir):
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   735
            self.fail("%s already exists!" % cubedir)
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   736
        skeldir = osp.join(BASEDIR, 'skeleton')
10967
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
   737
        longdesc = shortdesc = input(
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   738
            'Enter a short description for your cube: ')
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   739
        if verbose:
10967
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
   740
            longdesc = input(
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   741
                'Enter a long description (leave empty to reuse the short one): ')
11454
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   742
        dependencies = {
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   743
            'six': '>= 1.4.0',
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   744
            'cubicweb': '>= %s' % cubicwebversion,
7770559e3945 [devtools] Update skeleton and newcube command to cube as package layout
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11129
diff changeset
   745
        }
133
6ad5e7eb06ff provide a --verbose option to the newcube command and only ask for a short description by default
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 132
diff changeset
   746
        if verbose:
5347
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   747
            dependencies.update(self._ask_for_dependencies())
11716
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   748
        context = {
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   749
            'cubename': cubename,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   750
            'distname': distname,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   751
            'shortdesc': shortdesc,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   752
            'longdesc': longdesc or shortdesc,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   753
            'dependencies': dependencies,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   754
            'version': cubicwebversion,
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   755
            'year': str(date.today().year),
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   756
            'author': self['author'],
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   757
            'author-email': self['author-email'],
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   758
            'rfc2822-date': datetime.now(tz=UTC).strftime('%a, %d %b %Y %T %z'),
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   759
            'author-web-site': self['author-web-site'],
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   760
            'license': self['license'],
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   761
            'long-license': self.LICENSES[self['license']],
c7de052ee288 [skeleton] Properly format debian/changelog using current datetime and author information
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11468
diff changeset
   762
        }
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   763
        exclude = SKEL_EXCLUDE
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   764
        if self['layout'] == 'simple':
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   765
            exclude += ('sobjects.py*', 'precreate.py*', 'realdb_test*',
5466
b5af2ac0c43c [uiprops] test and fix reloading of modified css files; update c-c newcube; deprecates config.has_resource.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5442
diff changeset
   766
                        'cubes.*', 'uiprops.py*')
5184
955ee1b24756 [c-c newcube] #1192: simpler cubicweb-ctl newcube, and more
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4722
diff changeset
   767
        copy_skeleton(skeldir, cubedir, context, exclude=exclude)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   768
5344
ed4cd1ca96d6 [skeleton/dependencies] fix typo & new cube generation from template
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4722
diff changeset
   769
    def _ask_for_dependencies(self):
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   770
        from logilab.common.shellutils import ASK
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   771
        from logilab.common.textutils import splitstrip
5347
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   772
        depcubes = []
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   773
        for cube in ServerConfiguration.available_cubes():
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   774
            answer = ASK.ask("Depends on cube %s? " % cube,
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   775
                             ('N','y','skip','type'), 'N')
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   776
            if answer == 'y':
5347
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   777
                depcubes.append(cube)
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   778
            if answer == 'type':
10967
3f620fd1ed18 [devtools] Fix 'newcube' on py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10963
diff changeset
   779
                depcubes = splitstrip(input('type dependencies: '))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   780
                break
2615
1ea41b7c0836 F [dialog] offer to create backup. refactor to use l.c.shellutils.ASK
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2551
diff changeset
   781
            elif answer == 'skip':
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   782
                break
5347
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   783
        return dict(('cubicweb-' + cube, ServerConfiguration.cube_version(cube))
8ebed973819b merge stable, fixing dependencies generation on c-c newcube on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5297 5344
diff changeset
   784
                    for cube in depcubes)
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   785
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   786
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   787
class ExamineLogCommand(Command):
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   788
    """Examine a rql log file.
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   789
8857
5d08086c3e6d [cmd] fix exlog documentation (closes #2715913)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8454
diff changeset
   790
    Will print out the following table
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   791
8857
5d08086c3e6d [cmd] fix exlog documentation (closes #2715913)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8454
diff changeset
   792
      Percentage; Cumulative Time (clock); Cumulative Time (CPU); Occurences; Query
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   793
8857
5d08086c3e6d [cmd] fix exlog documentation (closes #2715913)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8454
diff changeset
   794
    sorted by descending cumulative time (clock). Time are expressed in seconds.
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   795
8857
5d08086c3e6d [cmd] fix exlog documentation (closes #2715913)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8454
diff changeset
   796
    Chances are the lines at the top are the ones that will bring the higher
4708
2bd3d03721f3 #687194: cubicweb-ctl exlog : fix help message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4479
diff changeset
   797
    benefit after optimisation. Start there.
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   798
    """
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   799
    arguments = 'rql.log'
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   800
    name = 'exlog'
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   801
    options = ()
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   802
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   803
    def run(self, args):
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   804
        import re
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   805
        requests = {}
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   806
        for filepath in args:
1188
6937dfb242fb [devtools] ExamineLog command does not fail on strange input and outputs to csv
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1116
diff changeset
   807
            try:
10614
57dfde80df11 [py3k] file → open
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10601
diff changeset
   808
                stream = open(filepath)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8666
diff changeset
   809
            except OSError as ex:
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   810
                raise BadCommandUsage("can't open rql log file %s: %s"
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   811
                                      % (filepath, ex))
5755
ca9e1c9123d7 [c-c exlog] fix code and documentation
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 5608
diff changeset
   812
            for lineno, line in enumerate(stream):
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   813
                if not ' WHERE ' in line:
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   814
                    continue
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   815
                try:
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   816
                    rql, time = line.split('--')
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   817
                    rql = re.sub("(\'\w+': \d*)", '', rql)
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   818
                    if '{' in rql:
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   819
                        rql = rql[:rql.index('{')]
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   820
                    req = requests.setdefault(rql, [])
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   821
                    time.strip()
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   822
                    chunks = time.split()
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   823
                    clocktime = float(chunks[0][1:])
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   824
                    cputime = float(chunks[-3])
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   825
                    req.append( (clocktime, cputime) )
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8666
diff changeset
   826
                except Exception as exc:
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   827
                    sys.stderr.write('Line %s: %s (%s)\n' % (lineno, exc, line))
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   828
        stat = []
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   829
        for rql, times in requests.items():
2092
f5102472243d [exlog] print clocktime in addition to cputime
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1977
diff changeset
   830
            stat.append( (sum(time[0] for time in times),
f5102472243d [exlog] print clocktime in addition to cputime
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1977
diff changeset
   831
                          sum(time[1] for time in times),
f5102472243d [exlog] print clocktime in addition to cputime
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1977
diff changeset
   832
                          len(times), rql) )
374
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   833
        stat.sort()
89225b187eb8 turn exlog into a cw-ctl command
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 373
diff changeset
   834
        stat.reverse()
5375
962e13ab0930 [c-c exlog] #687204: cubicweb-ctl exlog: use a proper file and not stdin for input
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5344
diff changeset
   835
        total_time = sum(clocktime for clocktime, cputime, occ, rql in stat) * 0.01
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   836
        print('Percentage;Cumulative Time (clock);Cumulative Time (CPU);Occurences;Query')
2092
f5102472243d [exlog] print clocktime in addition to cputime
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1977
diff changeset
   837
        for clocktime, cputime, occ, rql in stat:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   838
            print('%.2f;%.2f;%.2f;%s;%s' % (clocktime/total_time, clocktime,
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10474
diff changeset
   839
                                            cputime, occ, rql))
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1415
diff changeset
   840
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   841
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   842
class GenerateSchema(Command):
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   843
    """Generate schema image for the given cube"""
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   844
    name = "schema"
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   845
    arguments = '<cube>'
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   846
    min_args = max_args = 1
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   847
    options = [
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   848
        ('output-file',
8451
49e965bba1ec [c-c schema] devtools: the output file for cw-ctl schema is not supposed to exist
Julien Cristau <julien.cristau@logilab.fr>
parents: 8257
diff changeset
   849
         {'type':'string', 'default': None,
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   850
          'metavar': '<file>', 'short':'o', 'help':'output image file',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   851
          'input':False,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   852
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   853
        ('viewer',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   854
         {'type': 'string', 'default':None,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   855
          'short': "d", 'metavar':'<cmd>',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   856
          'help':'command use to view the generated file (empty for none)',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   857
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   858
        ('show-meta',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   859
         {'action': 'store_true', 'default':False,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   860
          'short': "m", 'metavar': "<yN>",
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   861
          'help':'include meta and internal entities in schema',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   862
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   863
        ('show-workflow',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   864
         {'action': 'store_true', 'default':False,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   865
          'short': "w", 'metavar': "<yN>",
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   866
          'help':'include workflow entities in schema',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   867
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   868
        ('show-cw-user',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   869
         {'action': 'store_true', 'default':False,
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   870
          'metavar': "<yN>",
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   871
          'help':'include cubicweb user entities in schema',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   872
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   873
        ('exclude-type',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   874
         {'type':'string', 'default':'',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   875
          'short': "x", 'metavar': "<types>",
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   876
          'help':'coma separated list of entity types to remove from view',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   877
          }),
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   878
        ('include-type',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   879
         {'type':'string', 'default':'',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   880
          'short': "i", 'metavar': "<types>",
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   881
          'help':'coma separated list of entity types to include in view',
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   882
          }),
9470
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   883
        ('show-etype',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   884
         {'type':'string', 'default':'',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   885
          'metavar': '<etype>',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   886
          'help':'show graph of this etype and its neighbours'
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   887
          }),
6356
e89f71a41e20 [c-c i18n] namespace/line wrap cleanup + dynamically compute available language + make it works in installed mode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6138
diff changeset
   888
        ]
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   889
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   890
    def run(self, args):
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   891
        from subprocess import Popen
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   892
        from tempfile import NamedTemporaryFile
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   893
        from logilab.common.textutils import splitstrip
9470
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   894
        from logilab.common.graph import GraphGenerator, DotBackend
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   895
        from yams import schema2dot as s2d, BASE_TYPES
4718
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   896
        from cubicweb.schema import (META_RTYPES, SCHEMA_TYPES, SYSTEM_RTYPES,
3dc3ad02d091 avoid module import in c-c plugins module, and remind it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4708
diff changeset
   897
                                     WORKFLOW_TYPES, INTERNAL_TYPES)
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   898
        cubes = splitstrip(args[0])
4479
f25e61a93c42 replace DevCubeConfiguration/DevDepsConfiguration by a single DevConfiguration, fixing recently introduced by w/ i18ncube command on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4467
diff changeset
   899
        dev_conf = DevConfiguration(*cubes)
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   900
        schema = dev_conf.load_schema()
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   901
        out, viewer = self['output-file'], self['viewer']
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   902
        if out is None:
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   903
            tmp_file = NamedTemporaryFile(suffix=".svg")
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   904
            out = tmp_file.name
4434
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   905
        skiptypes = BASE_TYPES | SCHEMA_TYPES
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   906
        if not self['show-meta']:
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   907
            skiptypes |=  META_RTYPES | SYSTEM_RTYPES | INTERNAL_TYPES
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   908
        if not self['show-workflow']:
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   909
            skiptypes |= WORKFLOW_TYPES
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   910
        if not self['show-cw-user']:
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   911
            skiptypes |= set(('CWUser', 'CWGroup', 'EmailAddress'))
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   912
        skiptypes |= set(self['exclude-type'].split(','))
101344a6ff9b Improve the schema command with filtering option.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4428
diff changeset
   913
        skiptypes -= set(self['include-type'].split(','))
9470
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   914
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   915
        if not self['show-etype']:
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   916
            s2d.schema2dot(schema, out, skiptypes=skiptypes)
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   917
        else:
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   918
            etype = self['show-etype']
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   919
            visitor = s2d.OneHopESchemaVisitor(schema[etype], skiptypes=skiptypes)
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   920
            propshdlr = s2d.SchemaDotPropsHandler(visitor)
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   921
            backend = DotBackend('schema', 'BT',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   922
                                 ratio='compress',size=None,
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   923
                                 renderer='dot',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   924
                                 additionnal_param={'overlap' : 'false',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   925
                                                    'splines' : 'true',
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   926
                                                    'sep' : '0.2'})
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   927
            generator = s2d.GraphGenerator(backend)
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   928
            generator.generate(visitor, propshdlr, out)
b1ff6525ece3 [c-c schema] option to show single etype (closes #3404831)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9258
diff changeset
   929
4428
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   930
        if viewer:
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   931
            p = Popen((viewer, out))
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   932
            p.wait()
03614b377ecd Add a ``schema`` command to cmd ctrl to generate schema image.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4400
diff changeset
   933
5775
34195230dc2a [packaging] more cleanups, handle javascript test files
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5762
diff changeset
   934
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   935
for cmdcls in (UpdateCubicWebCatalogCommand,
6444
cc091175d3da [c-c i18ncube] proper command class name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6443
diff changeset
   936
               UpdateCubeCatalogCommand,
6138
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   937
               NewCubeCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   938
               ExamineLogCommand,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   939
               GenerateSchema,
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   940
               ):
65f5e488f983 update to lgc.clcommands 0.51 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5775
diff changeset
   941
    CWCTL.register(cmdcls)