Usuari:TronaBot/Python/common.py: diferència entre les revisions

Contingut suprimit Contingut afegit
és un script que empre tant per al pywikipedia com per altres
 
Aquest mòdul és fonamental per a executar la majoria d'scripts recopilats al viquirepositori
Línia 1:
Aquest mòdul és fonamental per a executar la majoria d'scripts recopilats al [[Especial:Cerca per prefix/Usuari:TronaBot/Python/|viquirepositori]].
 
 
<source lang=Python>
#!/usr/bin/python2.7
Linha 23 ⟶ 26:
--Coet 2013-03-22_21:47:17
"""
import argparse, bz2, codecs as cs, difflib, json, locale, os, re, sys, timepickle
import re, shlex, sys, time
from platform import system as platfsys
from datetime import datetime, timedelta
Linha 35 ⟶ 39:
home = on_win and r"E:\\iShare\SugarSync\My Python scripts" \
or "/home/pasqual/public_html/"
for folder in (on_win and "pywikilib" or "pywikimedia", "pyuserlibpyusrlib"):
sys.path.append(os.path.join(home, folder))
#from pywikipedia
Linha 41 ⟶ 45:
 
class File(object):
def __init__(self, fname, pref=False, timestamp=False, path=None, sep="-", ext=None):
if pref is True: pref = "llista1000_llista{sep}".format(sep=sep)
elif pref is False: pref=""
else: pref = "{pref}{sep}".format(pref=pref, sep=sep)
self._filename = "{pref}{name}{suff}{ext}".format(
pref = pref,
name = fname,
suff = timestamp and time.strftime("_%y%m%d_%H%M%S") or "",
ext = not fname.endswith(".log")ext and ".log%s" % ext or ".log"
)
self._path = path or os.path.join(home, "pywikilab", "logs")
Linha 84 ⟶ 89:
f.close()
return data
 
#binary files
def quick_read(self):
stream = bz2.BZ2File(self._fullname, 'r')
obj = pickle.load(stream)
stream.close()
return obj
 
def quick_write(self, obj):
stream = bz2.BZ2File(self._fullname, 'w')
pickle.dump(obj, stream, protocol=pickle.HIGHEST_PROTOCOL)
stream.close()
 
#flash instances
Linha 107 ⟶ 124:
data = f.write(data)
f.close()
 
def append(self, new_data):
"""append text after the content of a text file"""
if not new_data.startswith("\n"):new_data = "\n%s" % new_data
old_data = self.read()
self.save("%s%s" % (old_data, new_data))
 
def prepend(self, data):
Linha 119 ⟶ 130:
new_data = "%s\n%s" % (new_data, old_data)
self.save(new_data)
 
def append(self, new_data):
"""append text after the content of a text file"""
if not new_data.startswith("\n"):new_data = "\n%s" % new_data
old_data = self.read()
self.save("%s%s" % (old_data, new_data))
 
def open(self):
if not on_win: return
#Only available on windows.
os.startfile(self._fullname)
Linha 134 ⟶ 152:
self._stream.write(string)
 
def write_line(self, line="", newlineb4=False):
if not line.endswith("\n")newlineb4: line = "\n%s\n" % line
if not newlineb4 and not line.endswith("\n"): line = "%s\n" % line
self._stream.write(line)
 
Linha 158 ⟶ 177:
def elapsed(self, lapseid=None):
lapseid = lapseid and self.lapses[lapseid]
elapsed = rdeltatime_diff(lapseid or datetime.now(), self.start_time)
print "elapsed time:", self.to_string(elapsed)
 
Linha 278 ⟶ 297:
def __call__(self):
return self._obj
 
def time_diff(self, other=None):
if not other:
other = Date()
elif not isinstance(other, datetime):
other = Date()
dates = sorted([self._obj, other._obj])
return rdelta(dates[1], dates[0])
 
def time_delta(self):
return time_diff(self._obj)
 
def local_month(self):
Linha 340 ⟶ 370:
 
def time_diff(td):
#get the obejctobject and returns also hours, minutes and seconds
#by accessing to .seconds atribute.
td = Date(time.time())-Date(td)
Linha 510 ⟶ 540:
arg name: $name
colors:
&y := lightyellow
&r := lightred
&p := lightpurple
&b := lightblue
&g := lightgreen
&p := lightpurple
&r := lightred
&y := lightyellow
one word: &yword
more than one: &y(:word1 word2:)
Linha 525 ⟶ 556:
 
#replacing template
if (args or kwargs) and re.search(r"\$[\d\w]+", string):
parsed_args = re.findall(r"\$([\d]+)", string)
parsed_kwargs = re.findall(r"\$([a-z]\w*)", string)
for arg in parsed_args:
index = int(arg)-1
Linha 541 ⟶ 572:
 
#converting coloured string s for wikipedia.output() strings.
if re.search("&[bprybgpry]", string):
clr_str = re.finditer(r"(?P<replace>&(?P<color>[bprybgpry])(?:\(:(?P<string>[^:]+?):\)|(?P<word>[^\b]+?(?:\b|$))))", string)
for item in clr_str:
expr = item.group("string") or item.group("word")
if item.group("color") == "b":
string = string.replace(item.group("replace"), blue(expr))
elif item.group("color") == "g":
string = string.replace(item.group("replace"), green(expr))
elif item.group("color") == "p":
string = string.replace(item.group("replace"), purple(expr))
Linha 576 ⟶ 609:
self.optional = {}
self.raw = None
 
self._sep = ","
self._sh_delim = "-"
self._lng_delim = "--"
self._string_sign = "$"
self._digit_sign = "#"
self._param_sign = "+"
 
def __getattr__(self, attr, value=False):
Linha 594 ⟶ 634:
)
 
def parse_argumentsset_parameter(self, *aliases, **keywords):
param={}
args = self.raw = pywikilib.handleArgs()
aliases=list(aliases)
name =""
for alias in aliases:
if alias.startswith("--"):
name = alias[2:]
aliases.remove(alias)
break
if not name and len(aliases)>0:
name = aliases[0]
if name.startswith("-"):name=name.split("-",1)[1]
for alias in list(aliases):
if alias.startswith("-"):
aliases.remove(alias)
aliases.append(alias[1:])
dico = {
"name": name,
"aliases": aliases,
"choice": [],
"type": type,
"nargs": 0,
"default": True,
"required": False,
}
for keyword, value in keywords.items():
if dico.has_key(keyword):
if isinstance(value, basestring) and value.isdigit():value=int(value)
dico[keyword]=value
setattr(self, name, dico)
 
def parse_as_unix(self, cmd_line=None):
arguments = [] #unnamed parameters /GNU positional arg
options = {} #named parameters /GNU optional arg
action=""
stack=[]
last_option=""
 
if not cmd_line:
cmd_line = sys.argv[1:]
elif isinstance(cmd_line, basestring):
cmd_line = shlex.split(cmd_line)
 
keys=[]
print "****** OK *******"
print vars(self).items()
for k, v in vars(self).items() :
print k, v
if isinstance(v, dict):
print v
keys.append((k, v['aliases']))
keys = [(k,v['aliases']) ]
for arg in cmd_line:
if arg.startswith("--"):
if arg[2]=="!":
arg = arg[3:]
options[arg] = False
else:
arg = arg[2:]
options[arg] = True
last_option=arg
elif arg.startswith("-"):
arg = arg[1:]
value = False if arg.startswith("!") else True
arg = arg[1:] if value == False else arg
for a in arg:
options[a]=value
last_option = a if len(arg)==1 else ""
else:
stack.append((last_option, arg))
 
for key, value in list(stack):
if isinstance(getattr(self, key), dict):
#option was defined with .set_parameter()
if getattr(self, key)["nargs"]>0:
limit = getattr(self, key)["nargs"]
if options.has_key(key):
if isinstance(options[key], bool):
options[key]=[value]
elif len(options[key])<limit:
options[key].append(value)
else:
arguments.append(value)
stack.remove((key,value))
elif options.has_key(key):
if isinstance(options[key], bool):
options[key]=[value]
else:
arguments.append(value)
stack.remove((key,value))
 
else:
arguments.append(value)
stack.remove((key, value))
 
for keyword in options:
setattr(self, keyword, options[keyword])
 
for k,v in vars(self).items():
if isinstance(v, dict) and v.has_key("name"):
if isinstance(v['nargs'], int):
if isinstance(v['default'], (tuple, list)) and len (v['default']) != v['nargs']:
v['default']= (","*v['nargs']).split(",")
setattr(self, k, v['default'])
self._optional = options
self._stack = stack
self._action = action
self.positional = arguments
return [(k,v) for k,v in vars(self).items() if not k.startswith("_")]
 
def parse_arguments(self, line=None):
if not line:
args = self.raw = pywikilib.handleArgs()
else:
args = self.raw = pywikilib.handleArgs(shlex.split(line))
for arg in args:
option="";idx=0
Linha 609 ⟶ 762:
else:
self.positional.append(arg)
 
for option in self.optional.copy():
if isinstance(self.optional[option], bool) and option.startswith("!"):