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:
parent
2aaaf38611
commit
7c4a94c0c3
@ -22,10 +22,12 @@ File utilities.
|
||||
import contextlib
|
||||
import errno
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import stat
|
||||
import tempfile
|
||||
import time
|
||||
import yaml
|
||||
|
||||
from oslo_utils import excutils
|
||||
|
||||
@ -158,3 +160,50 @@ def last_bytes(path, num):
|
||||
raise
|
||||
unread_bytes = fp.tell()
|
||||
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 hashlib
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import stat
|
||||
@ -22,13 +23,13 @@ import tempfile
|
||||
import time
|
||||
from unittest import mock
|
||||
import uuid
|
||||
import yaml
|
||||
|
||||
from oslotest import base as test_base
|
||||
import six
|
||||
|
||||
from oslo_utils import fileutils
|
||||
|
||||
|
||||
TEST_PERMISSIONS = stat.S_IRWXU
|
||||
|
||||
|
||||
@ -289,3 +290,30 @@ class LastBytesTestCase(test_base.BaseTestCase):
|
||||
def test_non_exist_file(self):
|
||||
self.assertRaises(IOError, fileutils.last_bytes,
|
||||
'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.
|
Loading…
x
Reference in New Issue
Block a user