1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
|
class iRODSMeta:
def __init__(
self, name, value, units=None, avu_id=None, create_time=None, modify_time=None
):
self.avu_id = avu_id
self.name = name
self.value = value
self.units = units
self.create_time = create_time
self.modify_time = modify_time
def __eq__(self, other):
return tuple(self) == tuple(other)
def __iter__(self):
yield self.name
yield self.value
if self.units:
yield self.units
def __repr__(self):
return "<iRODSMeta {avu_id} {name} {value} {units}>".format(**vars(self))
class BadAVUOperationKeyword(Exception):
pass
class BadAVUOperationValue(Exception):
pass
class AVUOperation(dict):
@property
def operation(self):
return self["operation"]
@operation.setter
def operation(self, Oper):
self._check_operation(Oper)
self["operation"] = Oper
@property
def avu(self):
return self["avu"]
@avu.setter
def avu(self, newAVU):
self._check_avu(newAVU)
self["avu"] = newAVU
def _check_avu(self, avu_param):
if not isinstance(avu_param, iRODSMeta):
error_msg = (
"Nonconforming avu {!r} of type {}; must be an iRODSMeta."
"".format(avu_param, type(avu_param).__name__)
)
raise BadAVUOperationValue(error_msg)
def _check_operation(self, operation):
if operation not in ("add", "remove"):
error_msg = (
"Nonconforming operation {!r}; must be 'add' or 'remove'.".format(
operation
)
)
raise BadAVUOperationValue(error_msg)
def __init__(self, operation, avu, **kw):
"""Constructor:
AVUOperation( operation = opstr, # where opstr is "add" or "remove"
avu = metadata ) # where metadata is an irods.meta.iRODSMeta instance
"""
super(AVUOperation, self).__init__()
self._check_operation(operation)
self._check_avu(avu)
if kw:
raise BadAVUOperationKeyword(
"""Nonconforming keyword (s) {}.""".format(list(kw.keys()))
)
for atr in ("operation", "avu"):
setattr(self, atr, locals()[atr])
import copy
class iRODSMetaCollection:
def __call__(self, admin=False, timestamps=False, **opts):
x = copy.copy(self)
x._manager = (x._manager)(admin, timestamps, **opts)
x._reset_metadata()
return x
def __init__(self, manager, model_cls, path):
self._manager = manager
self._model_cls = model_cls
self._path = path
self._reset_metadata()
def _reset_metadata(self):
self._meta = self._manager.get(self._model_cls, self._path)
def get_all(self, key):
"""
Returns a list of iRODSMeta associated with a given key
"""
if isinstance(key, bytes):
key = key.decode("utf8")
if not isinstance(key, str):
raise TypeError
return [m for m in self._meta if m.name == key]
def get_one(self, key):
"""
Returns the iRODSMeta defined for a key. If there are none,
or if there are more than one defined, raises KeyError
"""
values = self.get_all(key)
if not values:
raise KeyError
if len(values) > 1:
raise KeyError
return values[0]
def _get_meta(self, *args):
if not len(args):
raise ValueError("Must specify an iRODSMeta object or key, value, units)")
return args[0] if len(args) == 1 else iRODSMeta(*args)
def apply_atomic_operations(self, *avu_ops):
self._manager.apply_atomic_operations(self._model_cls, self._path, *avu_ops)
self._reset_metadata()
def set(self, *args, **opts):
"""
Set as iRODSMeta to a key
"""
meta = self._get_meta(*args)
self._manager.set(self._model_cls, self._path, meta, **opts)
self._reset_metadata()
def add(self, *args, **opts):
"""
Add as iRODSMeta to a key
"""
meta = self._get_meta(*args)
self._manager.add(self._model_cls, self._path, meta, **opts)
self._reset_metadata()
def remove(self, *args, **opts):
"""
Removes an iRODSMeta
"""
meta = self._get_meta(*args)
self._manager.remove(self._model_cls, self._path, meta, **opts)
self._reset_metadata()
def items(self):
"""
Returns a list of iRODSMeta
"""
return self._meta
def keys(self):
"""
Return a list of keys. Duplicates preserved
"""
return [m.name for m in self._meta]
def __len__(self):
return len(self._meta)
def __getitem__(self, key):
"""
Returns the first iRODSMeta defined on key. Order is
undefined. Use get_one() or get_all() instead
"""
values = self.get_all(key)
if not values:
raise KeyError
return values[0]
def __setitem__(self, key, meta):
"""
Deletes all existing values associated with a given key and associates
the key with a single iRODSMeta tuple
"""
self._delete_all_values(key)
self.add(meta)
def _delete_all_values(self, key):
for meta in self.get_all(key):
self.remove(meta)
def __delitem__(self, key):
"""
Deletes all existing values associated with a given key
"""
if not isinstance(key, str):
raise TypeError
self._delete_all_values(key)
self._reset_metadata()
def __contains__(self, key):
if not isinstance(key, str):
raise TypeError
values = self.get_all(key)
return len(values) > 0
def remove_all(self, **opts):
for meta in self._meta:
self._manager.remove(self._model_cls, self._path, meta, **opts)
self._reset_metadata()
|