Move YAML code to its own module

Code now resides in common.serialization in the form
of two new functions: yaml_load and yaml_dump.

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-07-10 19:35:42 -04:00
parent 3621af7e7d
commit 8bc4b6a95e
18 changed files with 88 additions and 148 deletions

View File

@@ -0,0 +1,22 @@
from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader, CSafeDumper as SafeDumper
except ImportError:
from yaml import SafeLoader, SafeDumper
def yaml_dump(*args, **kwargs):
defaults = {'Dumper': SafeDumper}
defaults.update(kwargs)
return yaml.dump(*args, **defaults)
def yaml_load(*args, **kwargs):
defaults = {'Loader': SafeLoader}
defaults.update(kwargs)
return yaml.load(*args, **defaults)

View File

@@ -1,14 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from mayan.apps.common.serialization import yaml_load
from .settings import ( from .settings import (
setting_shared_storage, setting_shared_storage_arguments setting_shared_storage, setting_shared_storage_arguments
) )
@@ -16,8 +11,7 @@ from .settings import (
storage_sharedupload = import_string( storage_sharedupload = import_string(
dotted_path=setting_shared_storage.value dotted_path=setting_shared_storage.value
)( )(
**yaml.load( **yaml_load(
stream=setting_shared_storage_arguments.value or '{}', stream=setting_shared_storage_arguments.value or '{}',
Loader=SafeLoader
) )
) )

View File

@@ -7,15 +7,12 @@ import shutil
from PIL import Image from PIL import Image
import PyPDF2 import PyPDF2
import sh import sh
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.storage.utils import NamedTemporaryFile from mayan.apps.storage.utils import NamedTemporaryFile
from ..classes import ConverterBase from ..classes import ConverterBase
@@ -27,8 +24,8 @@ from ..literals import (
DEFAULT_PDFINFO_PATH DEFAULT_PDFINFO_PATH
) )
pdftoppm_path = yaml.load( pdftoppm_path = yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
).get( ).get(
'pdftoppm_path', DEFAULT_PDFTOPPM_PATH 'pdftoppm_path', DEFAULT_PDFTOPPM_PATH
) )
@@ -39,16 +36,16 @@ except sh.CommandNotFound:
pdftoppm = None pdftoppm = None
else: else:
pdftoppm_format = '-{}'.format( pdftoppm_format = '-{}'.format(
yaml.load( yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
).get( ).get(
'pdftoppm_format', DEFAULT_PDFTOPPM_FORMAT 'pdftoppm_format', DEFAULT_PDFTOPPM_FORMAT
) )
) )
pdftoppm_dpi = format( pdftoppm_dpi = format(
yaml.load( yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
).get( ).get(
'pdftoppm_dpi', DEFAULT_PDFTOPPM_DPI 'pdftoppm_dpi', DEFAULT_PDFTOPPM_DPI
) )
@@ -56,8 +53,8 @@ else:
pdftoppm = pdftoppm.bake(pdftoppm_format, '-r', pdftoppm_dpi) pdftoppm = pdftoppm.bake(pdftoppm_format, '-r', pdftoppm_dpi)
pdfinfo_path = yaml.load( pdfinfo_path = yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
).get( ).get(
'pdfinfo_path', DEFAULT_PDFINFO_PATH 'pdfinfo_path', DEFAULT_PDFINFO_PATH
) )

View File

@@ -7,15 +7,10 @@ import shutil
from PIL import Image from PIL import Image
import sh import sh
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.mimetype.api import get_mimetype from mayan.apps.mimetype.api import get_mimetype
from mayan.apps.storage.settings import setting_temporary_directory from mayan.apps.storage.settings import setting_temporary_directory
from mayan.apps.storage.utils import ( from mayan.apps.storage.utils import (
@@ -30,8 +25,8 @@ from .literals import (
from .settings import setting_graphics_backend_config from .settings import setting_graphics_backend_config
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
BACKEND_CONFIG = yaml.load( BACKEND_CONFIG = yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
) )
libreoffice_path = BACKEND_CONFIG.get( libreoffice_path = BACKEND_CONFIG.get(
'libreoffice_path', DEFAULT_LIBREOFFICE_PATH 'libreoffice_path', DEFAULT_LIBREOFFICE_PATH
@@ -62,8 +57,8 @@ class ConverterBase(object):
pass pass
def get_page(self, output_format=None): def get_page(self, output_format=None):
output_format = output_format or yaml.load( output_format = output_format or yaml_load(
stream=setting_graphics_backend_config.value, Loader=SafeLoader stream=setting_graphics_backend_config.value
).get( ).get(
'pillow_format', DEFAULT_PILLOW_FORMAT 'pillow_format', DEFAULT_PILLOW_FORMAT
) )

View File

@@ -2,15 +2,12 @@ from __future__ import unicode_literals
import yaml import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from .models import Transformation from .models import Transformation
@@ -21,7 +18,7 @@ class TransformationForm(forms.ModelForm):
def clean(self): def clean(self):
try: try:
yaml.load(stream=self.cleaned_data['arguments'], Loader=SafeLoader) yaml_load(stream=self.cleaned_data['arguments'])
except yaml.YAMLError: except yaml.YAMLError:
raise ValidationError( raise ValidationError(
_( _(

View File

@@ -2,16 +2,11 @@ from __future__ import unicode_literals
import logging import logging
import yaml
try:
from yaml import CSafeLoader as SafeLoader, CSafeDumper as SafeDumper
except ImportError:
from yaml import SafeLoader, SafeDumper
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import models, transaction from django.db import models, transaction
from mayan.apps.common.serialization import yaml_dump, yaml_load
from .transformations import BaseTransformation from .transformations import BaseTransformation
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -23,8 +18,8 @@ class TransformationManager(models.Manager):
self.create( self.create(
content_type=content_type, object_id=obj.pk, content_type=content_type, object_id=obj.pk,
name=transformation.name, arguments=yaml.dump( name=transformation.name, arguments=yaml_dump(
data=arguments, Dumper=SafeDumper data=arguments
) )
) )
@@ -96,9 +91,8 @@ class TransformationManager(models.Manager):
# Some transformations don't require arguments # Some transformations don't require arguments
# return an empty dictionary as ** doesn't allow None # return an empty dictionary as ** doesn't allow None
if transformation.arguments: if transformation.arguments:
kwargs = yaml.load( kwargs = yaml_load(
stream=transformation.arguments, stream=transformation.arguments,
Loader=SafeLoader
) )
else: else:
kwargs = {} kwargs = {}

View File

@@ -2,15 +2,12 @@ from __future__ import unicode_literals
import yaml import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
@deconstructible @deconstructible
class YAMLValidator(object): class YAMLValidator(object):
@@ -20,7 +17,7 @@ class YAMLValidator(object):
def __call__(self, value): def __call__(self, value):
value = value.strip() value = value.strip()
try: try:
yaml.load(stream=value, Loader=SafeLoader) yaml_load(stream=value)
except yaml.error.YAMLError: except yaml.error.YAMLError:
raise ValidationError( raise ValidationError(
_('Enter a valid YAML value.'), _('Enter a valid YAML value.'),

View File

@@ -1,14 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from mayan.apps.common.serialization import yaml_load
from .settings import ( from .settings import (
setting_storage_backend, setting_storage_backend_arguments setting_storage_backend, setting_storage_backend_arguments
) )
@@ -16,8 +11,7 @@ from .settings import (
storage_detachedsignature = import_string( storage_detachedsignature = import_string(
dotted_path=setting_storage_backend.value dotted_path=setting_storage_backend.value
)( )(
**yaml.load( **yaml_load(
stream=setting_storage_backend_arguments.value or '{}', stream=setting_storage_backend_arguments.value or '{}'
Loader=SafeLoader
) )
) )

View File

@@ -1,14 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from mayan.apps.common.serialization import yaml_load
from .settings import ( from .settings import (
setting_documentimagecache_storage, setting_documentimagecache_storage,
setting_documentimagecache_storage_arguments, setting_documentimagecache_storage_arguments,
@@ -18,17 +13,15 @@ from .settings import (
storage_documentversion = import_string( storage_documentversion = import_string(
dotted_path=setting_storage_backend.value dotted_path=setting_storage_backend.value
)( )(
**yaml.load( **yaml_load(
stream=setting_storage_backend_arguments.value or '{}', stream=setting_storage_backend_arguments.value or '{}',
Loader=SafeLoader
) )
) )
storage_documentimagecache = import_string( storage_documentimagecache = import_string(
dotted_path=setting_documentimagecache_storage.value dotted_path=setting_documentimagecache_storage.value
)( )(
**yaml.load( **yaml_load(
stream=setting_documentimagecache_storage_arguments.value or '{}', stream=setting_documentimagecache_storage_arguments.value or '{}',
Loader=SafeLoader
) )
) )

View File

@@ -4,15 +4,10 @@ import json
import logging import logging
import sh import sh
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.storage.utils import NamedTemporaryFile from mayan.apps.storage.utils import NamedTemporaryFile
from ..literals import DEFAULT_EXIF_PATH from ..literals import DEFAULT_EXIF_PATH
@@ -57,8 +52,8 @@ class EXIFToolDriver(FileMetadataDriver):
) )
def read_settings(self): def read_settings(self):
driver_arguments = yaml.load( driver_arguments = yaml_load(
stream=setting_drivers_arguments.value, Loader=SafeLoader stream=setting_drivers_arguments.value
) )
self.exiftool_path = driver_arguments.get( self.exiftool_path = driver_arguments.get(

View File

@@ -4,15 +4,11 @@ import logging
import shutil import shutil
import sh import sh
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.storage.utils import TemporaryFile from mayan.apps.storage.utils import TemporaryFile
from ..classes import OCRBackendBase from ..classes import OCRBackendBase
@@ -115,8 +111,7 @@ class Tesseract(OCRBackendBase):
logger.debug('Available languages: %s', ', '.join(self.languages)) logger.debug('Available languages: %s', ', '.join(self.languages))
def read_settings(self): def read_settings(self):
backend_arguments = yaml.load( backend_arguments = yaml_load(
Loader=SafeLoader,
stream=setting_ocr_backend_arguments.value or '{}', stream=setting_ocr_backend_arguments.value or '{}',
) )

View File

@@ -1,20 +1,15 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from mayan.apps.common.serialization import yaml_load
from .settings import setting_ocr_backend, setting_ocr_backend_arguments from .settings import setting_ocr_backend, setting_ocr_backend_arguments
ocr_backend = import_string( ocr_backend = import_string(
dotted_path=setting_ocr_backend.value dotted_path=setting_ocr_backend.value
)( )(
**yaml.load( **yaml_load(
stream=setting_ocr_backend_arguments.value or '{}', Loader=SafeLoader stream=setting_ocr_backend_arguments.value or '{}'
) )
) )

View File

@@ -2,16 +2,11 @@ from __future__ import absolute_import, unicode_literals
import os import os
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.template import loader from django.template import loader
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.common.settings import ( from mayan.apps.common.settings import (
setting_celery_broker_url, setting_celery_result_backend setting_celery_broker_url, setting_celery_result_backend
) )
@@ -95,9 +90,7 @@ class PlatformTemplate(object):
if context_string: if context_string:
context.update( context.update(
yaml.load( yaml_load(stream=context_string)
stream=context_string, Loader=SafeLoader
)
) )
return loader.render_to_string( return loader.render_to_string(
template_name=self.get_template_name(), template_name=self.get_template_name(),

View File

@@ -9,11 +9,6 @@ import sys
import yaml import yaml
try:
from yaml import CSafeLoader as SafeLoader, CSafeDumper as SafeDumper
except ImportError:
from yaml import SafeLoader, SafeDumper
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.utils.functional import Promise from django.utils.functional import Promise
@@ -21,6 +16,8 @@ from django.utils.encoding import (
force_bytes, force_text, python_2_unicode_compatible force_bytes, force_text, python_2_unicode_compatible
) )
from mayan.apps.common.serialization import yaml_dump, yaml_load
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -85,7 +82,7 @@ class Setting(object):
@staticmethod @staticmethod
def deserialize_value(value): def deserialize_value(value):
return yaml.load(stream=value, Loader=SafeLoader) return yaml_load(stream=value)
@staticmethod @staticmethod
def express_promises(value): def express_promises(value):
@@ -101,9 +98,8 @@ class Setting(object):
@staticmethod @staticmethod
def serialize_value(value): def serialize_value(value):
result = yaml.dump( result = yaml_dump(
data=Setting.express_promises(value), allow_unicode=True, data=Setting.express_promises(value), allow_unicode=True,
Dumper=SafeDumper
) )
# safe_dump returns bytestrings # safe_dump returns bytestrings
# Disregard the last 3 dots that mark the end of the YAML document # Disregard the last 3 dots that mark the end of the YAML document
@@ -128,8 +124,8 @@ class Setting(object):
if (filter_term and filter_term.lower() in setting.global_name.lower()) or not filter_term: if (filter_term and filter_term.lower() in setting.global_name.lower()) or not filter_term:
dictionary[setting.global_name] = Setting.express_promises(setting.value) dictionary[setting.global_name] = Setting.express_promises(setting.value)
return yaml.dump( return yaml_dump(
data=dictionary, default_flow_style=False, Dumper=SafeDumper data=dictionary, default_flow_style=False
) )
@classmethod @classmethod

View File

@@ -2,15 +2,12 @@ from __future__ import unicode_literals
import yaml import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
class SettingForm(forms.Form): class SettingForm(forms.Form):
value = forms.CharField( value = forms.CharField(
@@ -38,7 +35,7 @@ class SettingForm(forms.Form):
) )
try: try:
yaml.load(stream=self.cleaned_data['value'], Loader=SafeLoader) yaml_load(stream=self.cleaned_data['value'])
except yaml.YAMLError: except yaml.YAMLError:
raise ValidationError( raise ValidationError(
_( _(

View File

@@ -4,18 +4,13 @@ import imaplib
import logging import logging
import poplib import poplib
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.db import models from django.db import models
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.serialization import yaml_load
from mayan.apps.documents.models import Document from mayan.apps.documents.models import Document
from mayan.apps.metadata.api import set_bulk_metadata from mayan.apps.metadata.api import set_bulk_metadata
from mayan.apps.metadata.models import MetadataType from mayan.apps.metadata.models import MetadataType
@@ -142,8 +137,8 @@ class EmailBaseModel(IntervalBaseModel):
with ContentFile(content=message.body, name=label) as file_object: with ContentFile(content=message.body, name=label) as file_object:
if label == source.metadata_attachment_name: if label == source.metadata_attachment_name:
metadata_dictionary = yaml.load( metadata_dictionary = yaml_load(
stream=file_object.read(), Loader=SafeLoader stream=file_object.read()
) )
logger.debug( logger.debug(
'Got metadata dictionary: %s', 'Got metadata dictionary: %s',

View File

@@ -1,13 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import yaml
try:
from yaml import CSafeLoader as SafeLoader
except ImportError:
from yaml import SafeLoader
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from mayan.apps.common.serialization import yaml_load
from .settings import ( from .settings import (
setting_staging_file_image_cache_storage, setting_staging_file_image_cache_storage,
setting_staging_file_image_cache_storage_arguments, setting_staging_file_image_cache_storage_arguments,
@@ -16,8 +12,7 @@ from .settings import (
storage_staging_file_image_cache = import_string( storage_staging_file_image_cache = import_string(
dotted_path=setting_staging_file_image_cache_storage.value dotted_path=setting_staging_file_image_cache_storage.value
)( )(
**yaml.load( **yaml_load(
stream=setting_staging_file_image_cache_storage_arguments.value or '{}', stream=setting_staging_file_image_cache_storage_arguments.value or '{}',
Loader=SafeLoader
) )
) )

View File

@@ -6,15 +6,11 @@ import shutil
import mock import mock
from pathlib2 import Path from pathlib2 import Path
import yaml
try:
from yaml import CSafeDumper as SafeDumper
except ImportError:
from yaml import SafeDumper
from django.core import mail from django.core import mail
from django.utils.encoding import force_text from django.utils.encoding import force_text
from mayan.apps.common.serialization import yaml_dump
from mayan.apps.documents.models import Document from mayan.apps.documents.models import Document
from mayan.apps.documents.tests import ( from mayan.apps.documents.tests import (
GenericDocumentTestCase, TEST_COMPRESSED_DOCUMENT_PATH, GenericDocumentTestCase, TEST_COMPRESSED_DOCUMENT_PATH,
@@ -213,8 +209,8 @@ class EmailBaseTestCase(GenericDocumentTestCase):
metadata_type=test_metadata_type_2 metadata_type=test_metadata_type_2
) )
test_metadata_yaml = yaml.dump( test_metadata_yaml = yaml_dump(
Dumper=SafeDumper, data={ data={
test_metadata_type_1.name: TEST_METADATA_VALUE_1, test_metadata_type_1.name: TEST_METADATA_VALUE_1,
test_metadata_type_2.name: TEST_METADATA_VALUE_2, test_metadata_type_2.name: TEST_METADATA_VALUE_2,
} }