Jonathan Golder
6 years ago
5 changed files with 349 additions and 32 deletions
@ -0,0 +1,133 @@ |
|||||
|
|
||||
|
# Created by https://www.gitignore.io/api/python |
||||
|
|
||||
|
### Python ### |
||||
|
# Byte-compiled / optimized / DLL files |
||||
|
__pycache__/ |
||||
|
*.py[cod] |
||||
|
*$py.class |
||||
|
|
||||
|
# C extensions |
||||
|
*.so |
||||
|
|
||||
|
# Distribution / packaging |
||||
|
.Python |
||||
|
build/ |
||||
|
develop-eggs/ |
||||
|
dist/ |
||||
|
downloads/ |
||||
|
eggs/ |
||||
|
.eggs/ |
||||
|
lib/ |
||||
|
lib64/ |
||||
|
parts/ |
||||
|
sdist/ |
||||
|
var/ |
||||
|
wheels/ |
||||
|
*.egg-info/ |
||||
|
.installed.cfg |
||||
|
*.egg |
||||
|
MANIFEST |
||||
|
|
||||
|
# PyInstaller |
||||
|
# Usually these files are written by a python script from a template |
||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
||||
|
*.manifest |
||||
|
*.spec |
||||
|
|
||||
|
# Installer logs |
||||
|
pip-log.txt |
||||
|
pip-delete-this-directory.txt |
||||
|
|
||||
|
# Unit test / coverage reports |
||||
|
htmlcov/ |
||||
|
.tox/ |
||||
|
.nox/ |
||||
|
.coverage |
||||
|
.coverage.* |
||||
|
.cache |
||||
|
nosetests.xml |
||||
|
coverage.xml |
||||
|
*.cover |
||||
|
.hypothesis/ |
||||
|
.pytest_cache/ |
||||
|
|
||||
|
# Translations |
||||
|
*.mo |
||||
|
*.pot |
||||
|
|
||||
|
# Django stuff: |
||||
|
*.log |
||||
|
local_settings.py |
||||
|
db.sqlite3 |
||||
|
|
||||
|
# Flask stuff: |
||||
|
instance/ |
||||
|
.webassets-cache |
||||
|
|
||||
|
# Scrapy stuff: |
||||
|
.scrapy |
||||
|
|
||||
|
# Sphinx documentation |
||||
|
docs/_build/ |
||||
|
|
||||
|
# PyBuilder |
||||
|
target/ |
||||
|
|
||||
|
# Jupyter Notebook |
||||
|
.ipynb_checkpoints |
||||
|
|
||||
|
# IPython |
||||
|
profile_default/ |
||||
|
ipython_config.py |
||||
|
|
||||
|
# pyenv |
||||
|
.python-version |
||||
|
|
||||
|
# celery beat schedule file |
||||
|
celerybeat-schedule |
||||
|
|
||||
|
# SageMath parsed files |
||||
|
*.sage.py |
||||
|
|
||||
|
# Environments |
||||
|
.env |
||||
|
.venv |
||||
|
env/ |
||||
|
venv/ |
||||
|
ENV/ |
||||
|
env.bak/ |
||||
|
venv.bak/ |
||||
|
|
||||
|
# Spyder project settings |
||||
|
.spyderproject |
||||
|
.spyproject |
||||
|
|
||||
|
# Rope project settings |
||||
|
.ropeproject |
||||
|
|
||||
|
# mkdocs documentation |
||||
|
/site |
||||
|
|
||||
|
# mypy |
||||
|
.mypy_cache/ |
||||
|
.dmypy.json |
||||
|
dmypy.json |
||||
|
|
||||
|
### Python Patch ### |
||||
|
.venv/ |
||||
|
|
||||
|
### Python.VirtualEnv Stack ### |
||||
|
# Virtualenv |
||||
|
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ |
||||
|
[Bb]in |
||||
|
[Ii]nclude |
||||
|
[Ll]ib |
||||
|
[Ll]ib64 |
||||
|
[Ll]ocal |
||||
|
[Ss]cripts |
||||
|
pyvenv.cfg |
||||
|
pip-selfcheck.json |
||||
|
|
||||
|
|
||||
|
# End of https://www.gitignore.io/api/python |
@ -0,0 +1,47 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
# |
||||
|
# config.py |
||||
|
# |
||||
|
# Copyright 2018 Jonathan Golder <jonathan@golderweb.de> |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU General Public License as published by |
||||
|
# the Free Software Foundation; either version 2 of the License, or |
||||
|
# (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
||||
|
# MA 02110-1301, USA. |
||||
|
# |
||||
|
# |
||||
|
""" |
||||
|
Loads configuration of EuroExchangeBot |
||||
|
""" |
||||
|
|
||||
|
import os |
||||
|
|
||||
|
import jogobot |
||||
|
|
||||
|
|
||||
|
class Config(): |
||||
|
""" |
||||
|
Configuration container for EuroExchangeBot |
||||
|
""" |
||||
|
|
||||
|
base_dir = os.path.expanduser(jogobot.config["euroexchange"]["base_dir"]) |
||||
|
working_dir = os.path.join( base_dir, "working_dir" ) |
||||
|
gnuplot_script_dir = os.path.join(base_dir, "gnuplot_scripts") |
||||
|
gnuplot = jogobot.config["euroexchange"]["gnuplot_bin"] |
||||
|
data_source = jogobot.config["euroexchange"]["data_source"] |
||||
|
zip_file = jogobot.config["euroexchange"]["data_zip_filename"] |
||||
|
csv_file = jogobot.config["euroexchange"]["data_csv_filename"] |
||||
|
upload_comment = jogobot.config["euroexchange"]["upload_comment"] |
||||
|
gnuplot_script_comment = jogobot.config["euroexchange"]["gnuplot_script_comment"] |
||||
|
gnuplot_script_help = jogobot.config["euroexchange"]["gnuplot_script_help"] |
@ -0,0 +1,129 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
# |
||||
|
# descpage.py |
||||
|
# |
||||
|
# Copyright 2018 Jonathan Golder <jonathan@golderweb.de> |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU General Public License as published by |
||||
|
# the Free Software Foundation; either version 2 of the License, or |
||||
|
# (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
||||
|
# MA 02110-1301, USA. |
||||
|
# |
||||
|
# |
||||
|
|
||||
|
import os |
||||
|
import re |
||||
|
|
||||
|
import pywikibot |
||||
|
import mwparserfromhell as mwparser |
||||
|
|
||||
|
from config import Config |
||||
|
|
||||
|
class DescPageBot(pywikibot.bot.Bot): |
||||
|
""" |
||||
|
Updates file description page with EuroExchangeBot related content |
||||
|
""" |
||||
|
|
||||
|
def treat_job( self, job ): |
||||
|
""" |
||||
|
Handles work on file description page for given job |
||||
|
|
||||
|
@param job Job to work on |
||||
|
@type EuroExchangeBotJob |
||||
|
""" |
||||
|
# Store job |
||||
|
self.job = job |
||||
|
# Store file page object |
||||
|
self.current_page = job.filepage |
||||
|
|
||||
|
# Parse filepage |
||||
|
self.parse_page() |
||||
|
|
||||
|
# Update gnuplot script |
||||
|
self.update_gnuplot_script() |
||||
|
|
||||
|
# Update wiki page |
||||
|
self.update_page() |
||||
|
|
||||
|
def load_gnuplot_script(self): |
||||
|
""" |
||||
|
Load the gnuplot script for current job |
||||
|
|
||||
|
@return Gnuplot script content |
||||
|
@rtype str |
||||
|
""" |
||||
|
|
||||
|
with open( os.path.join( |
||||
|
Config.gnuplot_script_dir, self.job.script + ".plt" ), "r") as fd: |
||||
|
return fd.read() |
||||
|
|
||||
|
def prepare_gnuplot_script(self): |
||||
|
""" |
||||
|
Prepare gnuplot script code for publishing on image description page |
||||
|
""" |
||||
|
|
||||
|
# Load gnuplot script |
||||
|
gnuplot_script = self.load_gnuplot_script() |
||||
|
|
||||
|
# Strip leadig and trailing whitespace |
||||
|
gnuplot_script = gnuplot_script.strip(" \n") |
||||
|
|
||||
|
# Replace |
||||
|
gnuplot_script = gnuplot_script.\ |
||||
|
replace( "system(\"echo $INFILE\")", |
||||
|
"'{}'".format( os.path.basename( Config.csv_file ) ) ).\ |
||||
|
replace( "system(\"echo $OUTFILE\")", |
||||
|
"'{}'".format (os.path.basename( self.job.image ) ) ) |
||||
|
|
||||
|
# Locate first empty line |
||||
|
m = re.search(r"^\s*$", gnuplot_script, re.MULTILINE) |
||||
|
if m: |
||||
|
# Insert help lines |
||||
|
gnuplot_script = gnuplot_script[:m.end()] +\ |
||||
|
Config.gnuplot_script_help + gnuplot_script[m.end():] |
||||
|
|
||||
|
return gnuplot_script |
||||
|
|
||||
|
def parse_page(self): |
||||
|
""" |
||||
|
Load current page content and parse with mwparser |
||||
|
""" |
||||
|
self.current_page.wikicode = mwparser.parse(self.current_page.text) |
||||
|
|
||||
|
def update_gnuplot_script(self): |
||||
|
""" |
||||
|
Update the gnuplot script embedded in page |
||||
|
""" |
||||
|
|
||||
|
# Get source tag with gnuplot script |
||||
|
gnuplot_script = next( |
||||
|
self.current_page.wikicode.ifilter_tags( |
||||
|
matches="<source lang=\"gnuplot\">" ) ) |
||||
|
|
||||
|
# Replace script |
||||
|
gnuplot_script.contents = "\n" + self.prepare_gnuplot_script() + "\n" |
||||
|
|
||||
|
def update_page(self): |
||||
|
""" |
||||
|
Put updated content to wiki |
||||
|
""" |
||||
|
|
||||
|
# Convert wikicode back to str |
||||
|
new_text = str(self.current_page.wikicode) |
||||
|
|
||||
|
# Save new text |
||||
|
self.userPut( self.current_page, |
||||
|
self.current_page.text, |
||||
|
new_text, |
||||
|
summary=Config.gnuplot_script_comment ) |
Loading…
Reference in new issue