mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 11:21:25 -07:00
On Python3 and Python2 use pickle slightly differently so we need to be explicit about some things. If pickles could be shared between python2 and python3, as in ansible-connection and the pickle cache, we need to specify the protocol to use when dumping and the encoding to use for byte strings when loading. The dumping protocol needs to be no higher than 2 as python-2 only supports up to protocol 2. The encoding should usually be 'bytes' so that python2 str type becomes python3 bytes type. However, doing this means that we must make sure that the objects being serialized properly make their strings into text strings except when they're supposed to be bytes. If strings are improperly byte strings, they may cause tracebacks on the receiving end
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
# (c) 2017, Brian Coca
|
|
#
|
|
# This file is part of Ansible
|
|
#
|
|
# Ansible is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Ansible is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
'''
|
|
DOCUMENTATION:
|
|
cache: yaml
|
|
short_description: File backed, using Python's pickle.
|
|
description:
|
|
- File backed cache that uses Python's pickle serialization as a format, the files are per host.
|
|
version_added: "2.3"
|
|
author: Brian Coca (@bcoca)
|
|
'''
|
|
|
|
# Make coding more python3-ish
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
try:
|
|
import cPickle as pickle
|
|
except ImportError:
|
|
import pickle
|
|
|
|
from ansible.module_utils.six import PY3
|
|
from ansible.plugins.cache import BaseFileCacheModule
|
|
|
|
class CacheModule(BaseFileCacheModule):
|
|
"""
|
|
A caching module backed by pickle files.
|
|
"""
|
|
|
|
def _load(self, filepath):
|
|
# Pickle is a binary format
|
|
with open(filepath, 'rb') as f:
|
|
if PY3:
|
|
return pickle.load(f, encoding='bytes')
|
|
else:
|
|
return pickle.load(f)
|
|
|
|
def _dump(self, value, filepath):
|
|
with open(filepath, 'wb') as f:
|
|
# Use pickle protocol 2 which is compatible with Python 2.3+.
|
|
pickle.dump(value, f, protocol=2)
|