Add util methods for checking json and yaml formatted file
As part of oslo_policy policy_file JSON to YAML migration BP, we need to check if oslo policy_file is JSON or YAML formatted (almost on all projects with policy in code, example Needed-By). - https://specs.openstack.org/openstack/oslo-specs/specs/victoria/policy-json-to-yaml.html These util methods try quick checks of file type by loading the file using json or yaml. Needed-By: https://review.opendev.org/#/c/748059/ Related Blueprint: policy-json-to-yaml Change-Id: I0edf030dc5cd6b77e0101089746589332860fa16
This commit is contained in:
@@ -22,10 +22,12 @@ File utilities.
|
|||||||
import contextlib
|
import contextlib
|
||||||
import errno
|
import errno
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
import yaml
|
||||||
|
|
||||||
from oslo_utils import excutils
|
from oslo_utils import excutils
|
||||||
|
|
||||||
@@ -158,3 +160,50 @@ def last_bytes(path, num):
|
|||||||
raise
|
raise
|
||||||
unread_bytes = fp.tell()
|
unread_bytes = fp.tell()
|
||||||
return (fp.read(), unread_bytes)
|
return (fp.read(), unread_bytes)
|
||||||
|
|
||||||
|
|
||||||
|
def is_json(file_path):
|
||||||
|
"""Check if file is of json type or not.
|
||||||
|
|
||||||
|
This function try to load the input file using json.loads()
|
||||||
|
and return False if ValueError otherwise True.
|
||||||
|
|
||||||
|
:param file_path: The file path to check
|
||||||
|
|
||||||
|
:returns: bool
|
||||||
|
|
||||||
|
"""
|
||||||
|
with open(file_path, 'r') as fh:
|
||||||
|
data = fh.read()
|
||||||
|
try:
|
||||||
|
json.loads(data)
|
||||||
|
return True
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_yaml(file_path):
|
||||||
|
"""Check if file is of yaml type or not.
|
||||||
|
|
||||||
|
This function try to load the input file using yaml.safe_load()
|
||||||
|
and return True if loadable. Because every json file can be loadable
|
||||||
|
in yaml, so this function return False if file is loadable using
|
||||||
|
json.loads() means it is json file.
|
||||||
|
|
||||||
|
:param file_path: The file path to check
|
||||||
|
|
||||||
|
:returns: bool
|
||||||
|
|
||||||
|
"""
|
||||||
|
with open(file_path, 'r') as fh:
|
||||||
|
data = fh.read()
|
||||||
|
is_yaml = False
|
||||||
|
try:
|
||||||
|
json.loads(data)
|
||||||
|
except ValueError:
|
||||||
|
try:
|
||||||
|
yaml.safe_load(data)
|
||||||
|
is_yaml = True
|
||||||
|
except yaml.scanner.ScannerError:
|
||||||
|
pass
|
||||||
|
return is_yaml
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
import errno
|
import errno
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import stat
|
import stat
|
||||||
@@ -22,13 +23,13 @@ import tempfile
|
|||||||
import time
|
import time
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
import uuid
|
import uuid
|
||||||
|
import yaml
|
||||||
|
|
||||||
from oslotest import base as test_base
|
from oslotest import base as test_base
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from oslo_utils import fileutils
|
from oslo_utils import fileutils
|
||||||
|
|
||||||
|
|
||||||
TEST_PERMISSIONS = stat.S_IRWXU
|
TEST_PERMISSIONS = stat.S_IRWXU
|
||||||
|
|
||||||
|
|
||||||
@@ -289,3 +290,30 @@ class LastBytesTestCase(test_base.BaseTestCase):
|
|||||||
def test_non_exist_file(self):
|
def test_non_exist_file(self):
|
||||||
self.assertRaises(IOError, fileutils.last_bytes,
|
self.assertRaises(IOError, fileutils.last_bytes,
|
||||||
'non_exist_file', 1000)
|
'non_exist_file', 1000)
|
||||||
|
|
||||||
|
|
||||||
|
class FileTypeTestCase(test_base.BaseTestCase):
|
||||||
|
"""Test the is_yaml() and is_json() utility methods."""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(FileTypeTestCase, self).setUp()
|
||||||
|
data = {
|
||||||
|
'name': 'test',
|
||||||
|
'website': 'example.com'
|
||||||
|
}
|
||||||
|
temp_dir = tempfile.mkdtemp()
|
||||||
|
self.json_file = tempfile.mktemp(dir=temp_dir)
|
||||||
|
self.yaml_file = tempfile.mktemp(dir=temp_dir)
|
||||||
|
|
||||||
|
with open(self.json_file, 'w') as fh:
|
||||||
|
json.dump(data, fh)
|
||||||
|
with open(self.yaml_file, 'w') as fh:
|
||||||
|
yaml.dump(data, fh)
|
||||||
|
|
||||||
|
def test_is_json(self):
|
||||||
|
self.assertTrue(fileutils.is_json(self.json_file))
|
||||||
|
self.assertFalse(fileutils.is_json(self.yaml_file))
|
||||||
|
|
||||||
|
def test_is_yaml(self):
|
||||||
|
self.assertTrue(fileutils.is_yaml(self.yaml_file))
|
||||||
|
self.assertFalse(fileutils.is_yaml(self.json_file))
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
New method ``is_json`` ``is_yaml`` added in fileutils.
|
||||||
|
These can be used to check if file is JSON or YAML
|
||||||
|
formatted.
|
Reference in New Issue
Block a user