def guess_range(versions, digits=2):
"""
????????????????
?? group_digits ?????????
Examples?
(digits=1) "1.1|1.2|1.3|1.4" --> ">=1.1,<=1.4"
(digits=1) "1.1|1.2|1.3|1.4|2.1|2.2|2.3" --> ">=1.1,<=1.4|>=2.1,<=2.3"
'1.1.1|1.1.2|1.1.3|1.2|1.2.4|2.0|2.0.2|3.0'
--> '>=1.1.1,<=1.1.3|>=1.2,<=1.2.4|>=2.0,<=2.0.2|3.0'
Args:
versions (list[str]|str): ?????????
digits (int): ?????????
Returns:
VersionRange
"""
if isinstance(versions, six.string_types):
versions = [Version(x) for x in versions.split('|')]
else:
versions = [Version(x) for x in versions]
versions.sort()
if not versions:
raise ValueError('must given at least one version')
sections = []
group_buff = [versions[0]]
for version in versions[1:]:
if version.version[:digits] == group_buff[0].version[:digits]:
group_buff.append(version)
else:
sections.append(_internal_guess_range(group_buff))
group_buff = [version]
# ????
sections.append(_internal_guess_range(group_buff))
version_ranges = []
for low, high in sections:
if low == high:
cg = low.vstring
else:
cg = ">={},<={}".format(low, high)
version_ranges.append(cg)
vr = VersionRange(version_ranges)
return vr
# -----------------------------------------------------
# ------------------- BEGIN TESTS -------------------
# -----------------------------------------------------
python类string_types()的实例源码
def _do_create_from_json(
cls, json, parse_def, context,
duplicate_handling=None, object_importer=None):
# Special case for JSON-LD
added = False
ls = cls()
def guess_lang(value):
from .discussion import Discussion
discussion = context.get_instance_of_class(Discussion)
if discussion:
tr_service = discussion.translation_service()
lang, _ = tr_service.identify(value)
return LocaleLabel.UNDEFINED
if isinstance(json, list):
for entry_record in json:
value = entry_record['@value']
if value:
added = True
lang = entry_record.get('@language', None) or guess_lang(value)
ls.add_value(value, lang)
elif isinstance(json, dict):
if '@id' in json or '@type' in json:
return super(LangString, cls)._do_create_from_json(
json, parse_def, context,
duplicate_handling, object_importer)
elif '@value' in json:
value = json['@value']
if value:
added = True
lang = json.get('@language', None) or guess_lang(value)
ls.add_value(value, lang)
else:
for lang, value in json.items():
if value:
added = True
ls.add_value(value, lang)
elif isinstance(json, string_types):
if json:
added = True
lang = guess_lang(json)
ls.add_value(json, lang)
else:
raise ValueError("Not a valid langstring: " + json)
i_context = ls.get_instance_context(context)
if added:
cls.default_db.add(ls)
else:
i_context._instance = None
return i_context
def _do_update_from_json(
self, json, parse_def, context,
duplicate_handling=None, object_importer=None):
# Special case for JSON-LD
if isinstance(json, list):
for entry_record in json:
lang = entry_record.get('@language', LocaleLabel.UNDEFINED)
value = entry_record['@value']
entry = self.entries_as_dict.get(lang, None)
if entry:
entry.set_value(value)
elif value:
self.add_value(value, lang)
elif isinstance(json, dict):
if '@id' in json or '@type' in json:
return super(LangString, self)._do_update_from_json(
json, parse_def, context,
duplicate_handling, object_importer)
elif '@value' in json:
value = json['@value']
if value:
lang = json.get('@language', LocaleLabel.UNDEFINED)
entry = self.entries_as_dict.get(lang, None)
if entry:
entry.set_value(value)
elif value:
self.add_value(value, lang)
else:
for lang, value in json.items():
entry = self.entries_as_dict.get(lang, None)
if entry:
entry.set_value(value)
elif value:
self.add_value(value, lang)
elif isinstance(json, string_types):
from .discussion import Discussion
lang = LocaleLabel.UNDEFINED
discussion = context.get_instance_of_class(Discussion)
if discussion:
tr_service = discussion.translation_service()
lang, _ = tr_service.identify(json)
entry = self.entries_as_dict.get(lang, None)
if entry:
entry.set_value(json)
elif json:
self.add_value(json, lang)
else:
raise ValueError("Not a valid langstring: " + json)
return self
# TODO: Reinstate when the javascript can handle empty body/subject.
# def generic_json(
# self, view_def_name='default', user_id=None,
# permissions=(P_READ, ), base_uri='local:'):
# if self.id == self.EMPTY_ID:
# return None
# return super(LangString, self).generic_json(
# view_def_name=view_def_name, user_id=user_id,
# permissions=permissions, base_uri=base_uri)
def validate_single_value(self, key, value, pref_data, data_type):
# TODO: Validation for the datatypes.
# base_type: (bool|json|int|string|text|scalar|url|email|domain|locale|langstr|permission|role)
# type: base_type|list_of_(type)|dict_of_(base_type)_to_(type)
if data_type.startswith("list_of_"):
assert isinstance(value, (list, tuple)), "Not a list"
return [
self.validate_single_value(key, val, pref_data, data_type[8:])
for val in value]
elif data_type.startswith("dict_of_"):
assert isinstance(value, (dict)), "Not a dict"
key_type, value_type = data_type[8:].split("_to_", 1)
assert "_" not in key_type
return {
self.validate_single_value(key, k, pref_data, key_type):
self.validate_single_value(key, v, pref_data, value_type)
for (k, v) in value.items()}
elif data_type == "langstr":
# Syntactic sugar for dict_of_locale_to_string
assert isinstance(value, (dict)), "Not a dict"
return {
self.validate_single_value(key, k, pref_data, "locale"):
self.validate_single_value(key, v, pref_data, "string")
for (k, v) in value.items()}
elif data_type == "bool":
assert isinstance(value, bool), "Not a boolean"
elif data_type == "int":
assert isinstance(value, int), "Not an integer"
elif data_type == "json":
pass # no check
else:
assert isinstance(value, string_types), "Not a string"
if data_type in ("string", "text"):
pass
elif data_type == "scalar":
assert value in pref_data.get("scalar_values", ()), (
"value not allowed: " + value)
elif data_type == "url":
from urllib.parse import urlparse
assert urlparse(value).scheme in (
'http', 'https'), "Not a HTTP URL"
elif data_type == "email":
from pyisemail import is_email
assert is_email(value), "Not an email"
elif data_type == "locale":
pass # TODO
elif data_type == "permission":
assert value in ASSEMBL_PERMISSIONS
elif data_type == "role":
if value not in SYSTEM_ROLES:
from .auth import Role
assert self.db.query(Role).filter_by(
name=value).count() == 1, "Unknown role"
elif data_type == "domain":
from pyisemail.validators.dns_validator import DNSValidator
v = DNSValidator()
assert v.is_valid(value), "Not a valid domain"
value = value.lower()
else:
raise RuntimeError("Invalid data_type: " + data_type)
return value
def update_from_form(instance, form_data=None):
mapper = inspect(instance.__class__)
cols = {c.key: c for c in mapper.columns if not c.foreign_keys}
setables = dict(pyinspect.getmembers(
instance.__class__, lambda p:
pyinspect.isdatadescriptor(p) and getattr(p, 'fset', None)))
relns = {r.key: r for r in mapper.relationships if not r.uselist and
len(r._calculated_foreign_keys) == 1 and iter(
r._calculated_foreign_keys).next().table == mapper.local_table
}
unknown = set(form_data.keys()) - (
set(cols.keys()).union(set(setables.keys())).union(set(relns.keys())))
if unknown:
raise HTTPBadRequest("Unknown keys: "+",".join(unknown))
params = dict(form_data)
# type checking
columns = {c.key: c for c in mapper.columns}
for key, value in params.items():
if key in relns and isinstance(value, string_types):
val_inst = relns[key].class_.get_instance(value)
if not val_inst:
raise HTTPBadRequest("Unknown instance: "+value)
params[key] = val_inst
elif key in columns and isinstance(columns[key].type, DeclEnumType) \
and isinstance(value, string_types):
val_det = columns[key].type.enum.from_string(value)
if not val_det:
raise HTTPBadRequest("Cannot interpret " + value)
params[key] = val_det
elif key in columns and columns[key].type.python_type == datetime.datetime \
and isinstance(value, string_types):
val_dt = datetime.datetime.strpstr(value)
if not val_dt:
raise HTTPBadRequest("Cannot interpret " + value)
params[key] = val_dt
elif key in columns and columns[key].type.python_type == int \
and isinstance(value, string_types):
try:
params[key] = int(value)
except ValueError:
raise HTTPBadRequest("Not a number: " + value)
elif key in columns and not isinstance(value, columns[key].type.python_type):
raise HTTPBadRequest("Value %s for key %s should be a %s" % (
value, key, columns[key].type.python_type))
try:
for key, value in params.items():
setattr(instance, key, value)
except:
raise HTTPBadRequest()