diff --git a/Dockerfile b/Dockerfile index bacf53e..de25423 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM python:3 -ADD requirements.txt / +ADD /app/requirements.txt / RUN pip install -r requirements.txt -ADD transifex_demo.py / -CMD [ "python", "./transifex_demo.py" ] \ No newline at end of file +ADD /app/transifex_demo.py / +CMD [ "python", "transifex_demo.py" ] \ No newline at end of file diff --git a/requirements.txt b/app/requirements.txt similarity index 100% rename from requirements.txt rename to app/requirements.txt diff --git a/transifex_demo.py b/app/transifex_demo.py similarity index 82% rename from transifex_demo.py rename to app/transifex_demo.py index d78bbfb..0d2c3fd 100644 --- a/transifex_demo.py +++ b/app/transifex_demo.py @@ -1,13 +1,11 @@ """Transifex basic implementation using python native sdk """ import os -from dotenv import load_dotenv from transifex.native import init, tx from transifex.native.parsing import SourceString -env_path=os.path.join(os.getcwd(),'transifex.env') -load_dotenv(env_path) token = os.getenv('token') secret = os.getenv('secret') +print("token value",token) init(token=token, languages=['el', 'fr', 'en'], secret=secret) # Add some strings to push strings = [SourceString('My Addresses')] diff --git a/docker-compose.yml b/docker-compose.yml index d7c08d2..ff7cc4f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,8 @@ version: '2' services: service-name: - image: transifex-docker + image: transifex-api-docker # environment: # - GREETING=hello env_file: - - ./transifex.env \ No newline at end of file + - transifex.env \ No newline at end of file diff --git a/transifex_flask/Dockerfile b/transifex_flask/Dockerfile new file mode 100644 index 0000000..663342e --- /dev/null +++ b/transifex_flask/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3 + +ADD /flask_app/flask_requirement.txt / +RUN pip install -r flask_requirement.txt +ADD /flask_app/app.py / +CMD [ "python", "app.py" ] \ No newline at end of file diff --git a/transifex_flask/docker-compose.yml b/transifex_flask/docker-compose.yml new file mode 100644 index 0000000..cb91d63 --- /dev/null +++ b/transifex_flask/docker-compose.yml @@ -0,0 +1,12 @@ +# docker-compose.yml +version: '2' +services: + + service-name: + image: flask_docker + # environment: + # - GREETING=hello + env_file: + - ../transifex.env + + \ No newline at end of file diff --git a/transifex_flask/flask_app/app.py b/transifex_flask/flask_app/app.py new file mode 100644 index 0000000..ed7d565 --- /dev/null +++ b/transifex_flask/flask_app/app.py @@ -0,0 +1,147 @@ +# import main Flask class and request object +from base64 import b64encode +import fcntl +# from http.client import sha1 +from hashlib import sha1 +import hmac +from http import client # import httplib +import json +import os +import pprint +import requests +import shutil +from subprocess import call, Popen +import sys +import tempfile +import time +import traceback + +from urllib.parse import urlparse +import os +from flask import Flask, request +from transifex.native import init, tx +from transifex.native.parsing import SourceString +# create the Flask app +app = Flask(__name__) + +@app.route('/query-example') +def transifex_demo(): + token = os.getenv('token') + secret = os.getenv('secret') + print("token value",token) + init(token=token, languages=['el', 'fr', 'en'], secret=secret) + # Add some strings to push + strings = [SourceString('My Addresses')] + response_content = tx.push_source_strings(strings) + tx.fetch_translations() + el_translation = tx.translate('My Addresses', 'fr') + return print(el_translation) + +@app.route('/commit-example') +def commitTranslatedLanguage(ts, lang): + call(["lrelease-qt4", "src/translations/bitmessage.pro"]) + call(["git", "add", "src/translations/bitmessage_" + lang + ".ts", "src/translations/bitmessage_" + lang + ".qm"]) + call(["git", "commit", "-q", "-S", "-m", "Auto-updated language %s from transifex" % (lang)]) + newbranch = "translate_" + lang + "_" + str(ts) + call(["git", "push", "-q", "translations", newbranch + ":" + newbranch]) + request = { + "title": "Translation update " + lang, + "body": "Auto-updated from transifex", + "head": "PyBitmessageTranslations:" + newbranch, + "base": branch + } + headers = {"Authorization": "token " + gitHubToken} + response = requests.post("https://api.github.com/repos/Bitmessage/PyBitmessage/pulls", + headers=headers, data=json.dumps(request)) + # TODO: save pull request number + return response +# print "JSON dumps request: %s" % (json.dumps(request)) +# print "Response from github for pull request: %i, %s" % (response.status_code, response.content) + + + +def updateLocalTranslationSource(): + call(["git", "stash", "-q"]) + call(["git", "checkout", "-q", branch]) + call(["git", "pull", "-q"]) + call(["pylupdate4", "src/translations/bitmessage.pro"]) + +def uploadTranslationSource(): + headers = {"Authorization": "Basic " + b64encode(transifexUsername + ":" + transifexPassword)} + response = requests.put("https://www.transifex.com/api/2/project/pybitmessage/resource/pybitmessage/content/", + headers=headers, files={'bitmessage_en.ts': open("src/translations/bitmessage_en.ts", "rb")}) + return response + +def updateLocalTranslationDestination(ts, lang): + call(["git", "pull", "--all", "-q"]) + call(["git", "stash", "-q"]) + call(["git", "checkout", "-q", branch]) + call(["git", "checkout", "-q", "-b", "translate_" + lang + "_" + str(ts)]) + call(["git", "branch", "-q", "--set-upstream-to=origin/v0.6"]) + +def downloadTranslatedLanguage(ts, lang): + headers = {"Authorization": "Basic " + b64encode(transifexUsername + ":" + transifexPassword)} + resname = "pybitmessage_" + lang + ".ts" + fname = "bitmessage_" + lang.lower() + ".ts" + with open("src/translations/" + fname, "wt") as handle: + response = requests.get("https://www.transifex.com/api/2/project/pybitmessage/resource/pybitmessage/translation/" + lang + "/", + headers=headers) + if response.ok: + content = json.loads(response.content)["content"] + handle.write(content.encode("utf-8")) +# print "Response from github for pull request: %i, %s" % (response.status_code, response.content) + return response + +def application(): + if "Transifex" in environ.get("HTTP_USER_AGENT"): +# debug(environ) +# debug(body) + pass + if not verifyTransifexSignature(environ, body): + debug ("Verify Transifex Signature fail, but fuck them") + else: + debug ("Verify Transifex Signature ok") +# output, responseHeaders = returnMessage(False, "Checksum bad") +# start_response(status, responseHeaders) +# unlock() +# return [output] + try: +# debug(body) + payload = parse_qs(body) +# debug(payload) + if 'pybitmessage' in payload['project'] and 'pybitmessage' in payload['resource']: + if 'translated' in payload and '100' in payload['translated']: + ts = int(time.time()) + updateLocalTranslationDestination(ts, payload['language'][0].lower()) + downloadTranslatedLanguage(ts, payload['language'][0]) + response = commitTranslatedLanguage(ts, payload['language'][0].lower()) + if response.ok: + output, responseHeaders = returnMessage(True, "Processed.") + else: + output, responseHeaders = returnMessage(False, "Error: %i." % (response.status_code)) + else: + output, responseHeaders = returnMessage(False, "Nothing to do") + else: + output, responseHeaders = returnMessage(False, "Nothing to do") + except: + output, responseHeaders = returnMessage(True, "Not processing") + else: + debug("Unknown command %s" % (environ.get("HTTP_X_GITHUB_EVENT"))) + output, responseHeaders = returnMessage(True, "Unknown command, ignoring") +# output = '' +# for k, v in environ.items(): +# output += '%.40s %s\n' % (k, v) + #responseHeaders = sendFile("ffb8c8eb-3d3b-4306-b65e-e0d1fa4f7ea0") + start_response(status, responseHeaders) + unlock() + return [output] + + + + + + + +if __name__ == '__main__': + # run app in debug mode on port 5000 + app.run(debug=True, port=5000) \ No newline at end of file diff --git a/transifex_flask/flask_app/flask_requirement.txt b/transifex_flask/flask_app/flask_requirement.txt new file mode 100644 index 0000000..c51f277 --- /dev/null +++ b/transifex_flask/flask_app/flask_requirement.txt @@ -0,0 +1,22 @@ +asttokens==2.2.1 +certifi==2022.12.7 +charset-normalizer==2.1.1 +click==8.1.3 +Flask==2.2.2 +future==0.18.2 +idna==3.4 +importlib-metadata==5.2.0 +itsdangerous==2.1.2 +Jinja2==3.1.2 +MarkupSafe==2.1.1 +parsimonious==0.10.0 +pyseeyou==1.0.2 +pytz==2022.7 +regex==2022.10.31 +requests==2.28.1 +six==1.16.0 +toolz==0.12.0 +transifex-python==3.0.3 +urllib3==1.26.13 +Werkzeug==2.2.2 +zipp==3.11.0