blob: 9d33aa609d52768fa44aad67b20c5d60566a0362 [file] [log] [blame]
#
# Copyright 2017 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import json
import yaml
import pyaml
import logging
import jsonschema
import uuid
_lib_name = 'Util'
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('lib/util.py')
class Util(object):
def __init__(self):
# logging.basicConfig(level=logging.DEBUG)
# self.log = logging.getLogger('UtilLogger')
pass
@classmethod
def json_load_byteified(cls, file_handle):
return cls._byteify(
json.load(file_handle, object_hook=cls._byteify),
ignore_dicts=True
)
@classmethod
def json_loads_byteified(cls, json_text):
return cls._byteify(
json.loads(json_text, object_hook=cls._byteify),
ignore_dicts=True
)
@classmethod
def _byteify(cls, data, ignore_dicts = False):
# if this is a unicode string, return its string representation
if isinstance(data, unicode):
return data.encode('utf-8')
# if this is a list of values, return list of byteified values
if isinstance(data, list):
return [ cls._byteify(item, ignore_dicts=True) for item in data ]
# if this is a dictionary, return dictionary of byteified keys and values
# but only if we haven't already byteified it
if isinstance(data, dict) and not ignore_dicts:
return {
cls._byteify(key, ignore_dicts=True): cls._byteify(value, ignore_dicts=True)
for key, value in data.iteritems()
}
# if it's anything else, return it in its original form
return data
@classmethod
def yaml2json(cls, object_yaml):
"""Converts a yaml object into a json representation"""
log.debug('yaml2json')
return json.dumps(object_yaml, sort_keys=True, indent=2) if not object_yaml is None else None
@classmethod
def json2yaml(cls, object_json):
"""Converts a json object into a yaml representation"""
log.debug('json2yaml')
return yaml.safe_dump(object_json, default_flow_style=False, indent=2) if not object_json is None else None
@classmethod
def openfile(cls, filepath, mode='r', buffering=1):
"""Returns an open file given a filepath
If the filepath is already an open file, returns into
Raises Exception
"""
log.debug('reading file ' + filepath)
try:
if isinstance(filepath, file):
return filepath
else:
return open(filepath, mode, buffering)
except IOError as e:
log.exception('openfile', e)
raise
@classmethod
def loadyamlfile(cls, name):
"""Returns a yaml object from a filename or an open file
Raises Exception
"""
yaml_object = None
try:
if isinstance(name, file):
yaml_object = yaml.load(name)
else:
yaml_file = cls.openfile(name)
yaml_object = yaml.load(yaml_file)
return yaml_object
except Exception as e:
log.exception('Exception loadYamlFile', e)
raise
@classmethod
def loadjsonfile(cls, name):
"""Returns a json object from a filename or an open file
Raises Exception
"""
json_object = None
try:
#raise IOError('error from throws')
if isinstance(name, file):
json_object = json.load(name)
else:
# json_file = self.openfile(name)
json_file = cls.openfile(name)
json_object = json.load(json_file)
return json_object
except Exception as e:
log.exception('Exception loadJsonFile', e)
raise
@classmethod
def writejsonfile(cls, name, json_object):
"""Writes the dump of a json obj to a filename or an open file
Raises Exception
"""
try:
log.debug('writejsonfile ' + name)
if isinstance(name, file):
json_object = json.dump(json_object, name)
else:
json_file = cls.openfile(name, 'w')
json_object = json.dump(json_object, json_file,separators=(',',': '), indent=4)
except Exception as e:
log.exception('Exception writejsonfile', e)
raise
@classmethod
def writeyamlfile(cls, name, yaml_object):
"""Writes the dump of a yaml obj to a filename or an open file
Raises Exception
"""
try:
log.debug('writeyamlfile ' + name)
if isinstance(name, file):
yaml_object = pyaml.dump(yaml_object, name, safe=True)
else:
yaml_file = cls.openfile(name, 'w')
yaml_object = pyaml.dump(yaml_object, yaml_file, safe=True)
except Exception as e:
log.exception('Exception writeyamlfile')
raise
@classmethod
def validate_json_schema(cls, reference_schema, data):
"""Validates a json data against a json schema
Raises Exception
"""
try:
# schema = cls.loadjsonfile("lib/etsi/schemas/"+type_descriptor+".json")
#print 'type_descriptor : '+type_descriptor
jsonschema.validate(data, reference_schema)
return True
except Exception as e:
log.exception('Exception validate json schema', e)
return False
@classmethod
def get_unique_id(cls):
return uuid.uuid4().hex[:6].upper()