Add initial support for git and gitlab

Julien LepillerSat Nov 24 14:23:38+0100 2018

1b04a3d

Add initial support for git and gitlab

guix-full.manifest

2525
   "python-neovim"
2626
   "python-polib"
2727
   "python-pyenchant"
28+
   "python-pygit2"
2829
   "python-pyqt"
2930
   "python-ruamel.yaml"
3031
   "python-sphinx"

guix.manifest

77
   "python-lxml"
88
   "python-polib"
99
   "python-pyenchant"
10+
   "python-pygit2"
1011
   "python-pyqt"
1112
   "python-ruamel.yaml"
1213
   "python-sphinx"

offlate/data.json

1-
[{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organisation": "openstreetmap"}]
1+
[{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organisation": "openstreetmap"}, {"name": "offlate", "system": 2, "site": "https://framagit.org", "project": "tyreunom/offlate", "format": 2, "locations": ["offlate/locales/offlate_%l.ts"]}]

offlate/formats/list.py unknown status 1

1+
#   Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu>
2+
#
3+
#   This program is free software: you can redistribute it and/or modify
4+
#   it under the terms of the GNU Affero General Public License as
5+
#   published by the Free Software Foundation, either version 3 of the
6+
#   License, or (at your option) any later version.
7+
#
8+
#   This program is distributed in the hope that it will be useful,
9+
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11+
#   GNU Affero General Public License for more details.
12+
#
13+
#   You should have received a copy of the GNU Affero General Public License
14+
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
15+
####
16+
""" The list of available formats. """
17+
18+
GETTEXT = 0
19+
YAML = 1
20+
21+
format_list = [
22+
        "Gettext (.po)",
23+
        "YAML (.yml)",
24+
        "Qt (.ts)"
25+
]

offlate/manager.py

1717
from pathlib import Path
1818
from .systems.tp import TPProject
1919
from .systems.transifex import TransifexProject
20+
from .systems.gitlab import GitlabProject
2021
from .formats.formatException import UnsupportedFormatException
22+
from .systems.list import *
2123
2224
import json
2325
import os

6264
            with open(self.basedir + '/projects.json') as f:
6365
                self.projects = json.load(f)
6466
                for p in self.projects:
65-
                    if p['system'] == 0:
67+
                    if p['system'] == TRANSLATION_PROJECT:
6668
                        if not "TP" in self.settings.conf:
6769
                            self.settings.conf["TP"] = {}
6870
                        self.project_list[p['name']] = \
6971
                            TPProject(self.settings.conf["TP"], p['name'], p['lang'], p['info'])
7072
                        self.project_list[p['name']].open(self.basedir+'/'+p['name'])
71-
                    if p['system'] == 1:
73+
                    if p['system'] == TRANSIFEX:
7274
                        if not "Transifex" in self.settings.conf:
7375
                            self.settings.conf['Transifex'] = {}
7476
                        self.project_list[p['name']] = \
7577
                            TransifexProject(self.settings.conf['Transifex'], p['name'], p['lang'], p['info'])
7678
                        self.project_list[p['name']].open(self.basedir+'/'+p['name'])
79+
                    if p['system'] == GITLAB:
80+
                        if not "Gitlab" in self.settings.conf:
81+
                            self.settings.conf['Gitlab'] = {}
82+
                        self.project_list[p['name']] = \
83+
                            GitlabProject(self.settings.conf['Gitlab'], p['name'], p['lang'], p['info'])
84+
                        self.project_list[p['name']].open(self.basedir+'/'+p['name'])
7785
        except Exception as e:
7886
            print(e)
7987
            with open(self.basedir + '/projects.json', 'w') as f:

8391
        projectpath = self.basedir + '/' + name
8492
        Path(projectpath).mkdir(parents=True)
8593
        try:
86-
            if system == 0: #TP
94+
            if system == TRANSLATION_PROJECT:
8795
                if not "TP" in self.settings.conf:
8896
                    self.settings.conf["TP"] = {}
8997
                proj = TPProject(self.settings.conf["TP"], name, lang)

9199
                self.project_list[name] = proj
92100
                self.projects.append({"name": name, "lang": lang, "system": system,
93101
                        "info": {"version": proj.version}})
94-
            if system == 1: #Transifex
102+
            if system == TRANSIFEX:
95103
                if not 'Transifex' in self.settings.conf:
96104
                    self.settings.conf['Transifex'] = {}
97105
                proj = TransifexProject(self.settings.conf['Transifex'], name, lang, data)

99107
                self.project_list[name] = proj
100108
                self.projects.append({"name": name, "lang": lang, "system": system,
101109
                        "info": data})
110+
            if system == GITLAB:
111+
                if not 'Gitlab' in self.settings.conf:
112+
                    self.settings.conf['Gitlab'] = {}
113+
                proj = GitlabProject(self.settings.conf['Gitlab'], name, lang, data)
114+
                proj.initialize(projectpath)
115+
                self.project_list[name] = proj
116+
                self.projects.append({"name": name, "lang": lang, "system": system,
117+
                        "info": data})
102118
        except UnsupportedFormatException:
103119
            rmdir(projectpath)
104120
        self.writeProjects()

offlate/multiplelineedit.py unknown status 1

1+
#   Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu>
2+
#
3+
#   This program is free software: you can redistribute it and/or modify
4+
#   it under the terms of the GNU Affero General Public License as
5+
#   published by the Free Software Foundation, either version 3 of the
6+
#   License, or (at your option) any later version.
7+
#
8+
#   This program is distributed in the hope that it will be useful,
9+
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11+
#   GNU Affero General Public License for more details.
12+
#
13+
#   You should have received a copy of the GNU Affero General Public License
14+
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
15+
####
16+
17+
from PyQt5.QtWidgets import *
18+
from PyQt5.QtGui import *
19+
from PyQt5.QtCore import *
20+
21+
class MultipleLineEdit(QWidget):
22+
    textChanged = pyqtSignal()
23+
24+
    def __init__(self, parent = None):
25+
        super(MultipleLineEdit, self).__init__(parent)
26+
        self.initUI()
27+
28+
    def setText(self, texts):
29+
        self.treeWidget.clear()
30+
        items = []
31+
        for text in texts:
32+
            item = QTreeWidgetItem([text])
33+
            items.append(item)
34+
        self.treeWidget.insertTopLevelItems(0, items)
35+
36+
    def addLine(self, args):
37+
        text = self.newtext.text()
38+
        items = [QTreeWidgetItem([text])]
39+
        self.treeWidget.insertTopLevelItems(0, items)
40+
41+
    def deleteLine(self, args):
42+
        self.treeWidget.takeTopLevelItem(self.treeWidget.currentIndex().row())
43+
44+
    def content(self):
45+
        number = self.treeWidget.topLevelItemCount()
46+
        items = []
47+
        for i in range(0, number):
48+
            items.append(self.treeWidget.topLevelItem(i).text(0))
49+
        return items
50+
51+
    def initUI(self):
52+
        vbox = QVBoxLayout()
53+
        hbox = QHBoxLayout()
54+
        self.setLayout(vbox)
55+
        self.treeWidget = QTreeWidget()
56+
        self.treeWidget.setColumnCount(1)
57+
        vbox.addWidget(self.treeWidget)
58+
        self.newtext = QLineEdit()
59+
        addbutton = QPushButton(self.tr("Add"))
60+
        addbutton.clicked.connect(self.addLine)
61+
        removebutton = QPushButton(self.tr("Remove"))
62+
        removebutton.clicked.connect(self.deleteLine, 0)
63+
        hbox.addWidget(self.newtext)
64+
        hbox.addWidget(addbutton)
65+
        hbox.addWidget(removebutton)
66+
        vbox.addLayout(hbox)

offlate/systems/git.py unknown status 1

1+
#   Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu>
2+
#
3+
#   This program is free software: you can redistribute it and/or modify
4+
#   it under the terms of the GNU Affero General Public License as
5+
#   published by the Free Software Foundation, either version 3 of the
6+
#   License, or (at your option) any later version.
7+
#
8+
#   This program is distributed in the hope that it will be useful,
9+
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11+
#   GNU Affero General Public License for more details.
12+
#
13+
#   You should have received a copy of the GNU Affero General Public License
14+
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
15+
####
16+
""" The git abstract system connector. """
17+
18+
import pygit2
19+
from os import rename, remove
20+
21+
class Progress(pygit2.remote.RemoteCallbacks):
22+
    def transfer_progress(self, stats):
23+
        try:
24+
            print("{}/{}\r".format(stats.received_objects, stats.total_objects), file=sys.stderr, end='')
25+
        except:
26+
            pass
27+
28+
class GitProject:
29+
    def __init__(self, conf, name, lang, data = {}):
30+
        self.conf = conf
31+
        self.name = name
32+
        self.lang = lang
33+
        self.data = data
34+
35+
    def open(self, basedir):
36+
        self.basedir = basedir
37+
        self.updateURI()
38+
39+
    def initialize(self, basedir):
40+
        self.basedir = basedir
41+
        self.updateURI()
42+
        self.clone(basedir + "/current")
43+
    
44+
    def updateURI(self):
45+
        raise Exception("Unimplemented method in concrete class: updateURI")
46+
47+
    def clone(self, directory):
48+
        print("Cloning {} in {}".format(self.uri, directory))
49+
        pygit2.clone_repository(self.uri, directory, callbacks=Progress())
50+
51+
    def update(self, callback):
52+
        os.rename(self.basedir + "/current", self.basedir + "/old")
53+
        self.clone(self.basedir + "/current")
54+
        # TODO: merge
55+
        os.remove(self.basedir + "/old")
56+
57+
    def send(self, interface):
58+
        pass
59+
60+
    def save(self):
61+
        pass
62+
63+
    def content(self):
64+
        return {'default': []}

offlate/systems/gitlab.py unknown status 1

1+
#   Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu>
2+
#
3+
#   This program is free software: you can redistribute it and/or modify
4+
#   it under the terms of the GNU Affero General Public License as
5+
#   published by the Free Software Foundation, either version 3 of the
6+
#   License, or (at your option) any later version.
7+
#
8+
#   This program is distributed in the hope that it will be useful,
9+
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11+
#   GNU Affero General Public License for more details.
12+
#
13+
#   You should have received a copy of the GNU Affero General Public License
14+
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
15+
####
16+
""" The gitlab system connector. """
17+
18+
from .git import GitProject
19+
20+
class GitlabProject(GitProject):
21+
    def __init__(self, conf, name, lang, data = {}):
22+
        GitProject.__init__(self, conf, name, lang, data)
23+
24+
    def updateURI(self):
25+
        self.uri = self.data['site'] + "/" + self.data['project'] + ".git"

offlate/systems/list.py unknown status 1

1+
#   Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu>
2+
#
3+
#   This program is free software: you can redistribute it and/or modify
4+
#   it under the terms of the GNU Affero General Public License as
5+
#   published by the Free Software Foundation, either version 3 of the
6+
#   License, or (at your option) any later version.
7+
#
8+
#   This program is distributed in the hope that it will be useful,
9+
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11+
#   GNU Affero General Public License for more details.
12+
#
13+
#   You should have received a copy of the GNU Affero General Public License
14+
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
15+
####
16+
""" The listo of system connectors. """
17+
18+
TRANSLATION_PROJECT = 0
19+
TRANSIFEX = 1
20+
GITLAB = 2

offlate/window.py

2828
from .manager import ProjectManager
2929
from .spellcheckedit import SpellCheckEdit
3030
from .tagclickedit import TagClickEdit
31+
from .multiplelineedit import MultipleLineEdit
32+
33+
from .systems.list import *
34+
from .formats.list import *
3135
3236
class ProjectTab(QTabWidget):
3337
    def __init__(self, parent = None):

305309
        self.combo = QComboBox()
306310
        self.combo.addItem(self.tr("The Translation Project"))
307311
        self.combo.addItem(self.tr("Transifex"))
312+
        self.combo.addItem(self.tr("Gitlab"))
308313
        self.formLayout.addRow(self.combo)
309314
310315
        self.nameWidget.textChanged.connect(self.modify)

324329
        self.additionalFields = []
325330
        self.additionalFields.append([])
326331
        self.additionalFields.append([])
332+
        self.additionalFields.append([])
333+
        
334+
        # Transifex
327335
        self.transifexOrganisation = QLineEdit()
328336
        self.transifexOrganisation.textChanged.connect(self.modify)
329337
        transifexOrganisationLabel = QLabel(self.tr("Organization"))
330-
        self.additionalFields[1].append({'label': transifexOrganisationLabel,
338+
        self.additionalFields[TRANSIFEX].append({'label': transifexOrganisationLabel,
331339
            'widget': self.transifexOrganisation})
332340
341+
        # Gitlab
342+
        self.gitlabSite = QLineEdit()
343+
        self.gitlabSite.textChanged.connect(self.modify)
344+
        gitlabSiteLabel = QLabel(self.tr('hosting website'))
345+
        self.additionalFields[GITLAB].append({'label': gitlabSiteLabel,
346+
            'widget': self.gitlabSite})
347+
        self.gitlabProject = QLineEdit()
348+
        self.gitlabProject.textChanged.connect(self.modify)
349+
        gitlabProjectLabel = QLabel(self.tr('project part'))
350+
        self.additionalFields[GITLAB].append({'label': gitlabProjectLabel,
351+
            'widget': self.gitlabProject})
352+
        self.gitlabFileTypeCombo = QComboBox()
353+
        self.gitlabFileTypeCombo.addItem(format_list[0])
354+
        self.gitlabFileTypeCombo.addItem(format_list[1])
355+
        self.gitlabFileTypeCombo.addItem(format_list[2])
356+
        self.gitlabFileTypeCombo.currentIndexChanged.connect(self.modify)
357+
        gitlabFileTypeLabel = QLabel(self.tr('Translation type'))
358+
        self.additionalFields[GITLAB].append({'label': gitlabFileTypeLabel,
359+
            'widget': self.gitlabFileTypeCombo})
360+
        self.gitlabLocations = MultipleLineEdit()
361+
        self.gitlabLocations.textChanged.connect(self.modify)
362+
        gitlabLocationsLabel = QLabel(self.tr('Locations'))
363+
        self.additionalFields[GITLAB].append({'label': gitlabLocationsLabel,
364+
            'widget': self.gitlabLocations})
365+
333366
        self.setLayout(hbox)
334367
335368
        self.predefinedprojects.currentItemChanged.connect(self.fill)

347380
        data = item.data(Qt.UserRole)
348381
        self.nameWidget.setText(data['name'])
349382
        self.combo.setCurrentIndex(int(data['system']))
350-
        if data['system'] == 1:
383+
        if data['system'] == TRANSIFEX:
351384
            self.transifexOrganisation.setText(data['organisation'])
385+
        if data['system'] == GITLAB:
386+
            self.gitlabSite.setText(data['site'])
387+
            self.gitlabProject.setText(data['project'])
388+
            self.gitlabFileTypeCombo.setCurrentIndex(data['format'])
389+
            self.gitlabLocations.setText(data['locations'])
352390
353391
    def filter(self):
354392
        search = self.searchfield.text()

365403
        if self.nameWidget.text() != '' and self.langWidget.text() != '':
366404
            enable = True
367405
            for widget in self.additionalFields[self.combo.currentIndex()]:
368-
                if widget['widget'].text() == '':
406+
                if isinstance(widget['widget'], QLineEdit) and widget['widget'].text() == '':
369407
                    enable = False
370408
                    break
371409
        self.okbutton.setEnabled(enable)

383421
        return self.combo.currentIndex()
384422
385423
    def getProjectInfo(self):
386-
        if self.getProjectSystem() == 0:
424+
        if self.getProjectSystem() == TRANSLATION_PROJECT:
387425
            return {}
388-
        if self.getProjectSystem() == 1:
389-
            return {'organization': self.additionalFields[1][0]['widget'].text()}
426+
        if self.getProjectSystem() == TRANSIFEX:
427+
            return {'organization': self.additionalFields[TRANSIFEX][0]['widget'].text()}
428+
        if self.getProjectSystem() == GITLAB:
429+
            return {'site': self.additionalFields[GITLAB][0]['widget'].text(),
430+
                    'project': self.additionalFields[GITLAB][1]['widget'].text(),
431+
                    'format': self.additionalFields[GITLAB][2]['widget'].currentIndex(),
432+
                    'locations': self.additionalFields[GITLAB][3]['widget'].content()}
390433
        return {}
391434
392435
    def othersystem(self):

setup.py

1212
    version="0.2.0",
1313
    packages=find_packages(exclude=['.guix-profile*']),
1414
    python_requires = '>=3',
15-
    install_requires=['polib', 'ruamel.yaml', 'python-dateutil', 'PyQt5'],
15+
    install_requires=['polib', 'ruamel.yaml', 'python-dateutil', 'PyQt5', 'pygit2'],
1616
    entry_points={
1717
        'gui_scripts': [
1818
            'offlate=offlate.window:main',