def __init__(self, datadict=None, _distributions=None, _distribution_literal=False): import helpers required_keys = [ "license_title", "maintainer", "private", "maintainer_email", "author", "author_email", "state", "type", "groups", "license_id", "owner_org", "url", "notes", "owner_org", "license_url", "isopen", "title", "title", "name" ] if not _distribution_literal: if _distributions: if isinstance(_distributions, Distribution): _distributions = [_distributions] elif isinstance(_distributions, list): import helpers if not helpers.list_of(_distributions, Distribution): raise TypeError( 'Las distribuciones provistas, no son de tipo Distribution...' ) else: _distributions = [] else: _distributions = [] elif not isinstance(_distributions, list) \ or not helpers.list_of(_distributions, dict): raise TypeError( 'Las distrubuciones \"literales\", solo pueden ser de clase list.' ) super(Dataset, self).__init__(_required_keys=required_keys, datadict=datadict, _forced_keys={ 'resources': _distributions, 'package_id': '' })
def save(self, _obj=None, only_metadata=False, _views=True): """ Guarda un _obj dentro de CKAN. Si el _obj existe, lo actualiza, si no, lo creo. De la misma manera son tratadas las distribuciones que el mismo contenga. Args: - _obj: _obj(). Objeto de que se desea salvar. - only_metadata: bool(). Pushear solo metadata. - _views: bool(). Flag. Mantener vistas remotas o eliminar. Returns: - bool(): - True se salvo correctamente el _obj. - False: Fallo la carga del _obj. """ from models import Dataset, Distribution ds_status = False dis_status = False distributions = [] if type(_obj) not in [Dataset, list, Distribution]: raise TypeError if isinstance(_obj, list): # Si es una lista, solo voy a intentar salvar los # que son instancias de la clase _obj. for o in _obj: if isinstance(o, (Dataset, Distribution)): self.save(_obj=o, only_metadata=only_metadata, _views=_views) else: # Si _obj[n] no es _obj o Distribution lo omito. self.log.info('Se omite {} por no ser una instancia de ' '_obj() o de Distribution.'.format(o)) if isinstance(_obj, Dataset): if 'resources' in _obj.__dict__.keys(): distributions = _obj.resources _obj.resources = [] else: dis_status = True ds_name = self._render_name(title=_obj.title) try: ds_name = ds_name.decode('utf-8 ') except UnicodeEncodeError: pass if self.exists(id_or_name=ds_name): # Actualizo el _obj. self.log.info( 'El _obj \"{}\" existe, por tanto, se actualizara.'.format( ds_name)) # Antes de actualizar debo bajar toda la metadata del dataset, # para que no se sobre escriba de manera erroenea el mismo al # realizar el update. ds_remote = self.freeze_dataset(ds_name) if self.update_dataset( dataset=self.diff_datasets(ds_remote, _obj)): self.log.info( '_obj \"{}\" actualizado correctamente.'.format( ds_name)) ds_status = True else: # Caso contrario, lo creo. self.log.info( 'El _obj \"{d}\" no existe. Creando _obj \"{d}\"...'. format(d=ds_name)) if self.create_dataset(dataset=_obj): self.log.info( '_obj \"{}\" fue creado con exito.'.format(ds_name)) ds_status = True if len(distributions) > 0: self.log.info('Guardando distribuciones({})...'.format( len(distributions))) for d in distributions: d.package_id = ds_name self.save(_obj=d, only_metadata=only_metadata, _views=_views) return ds_status import helpers if isinstance(_obj, Distribution): if isinstance(_obj, Distribution): dist_name = _obj.name self.log.info( 'Salvando Distribucion \"{}\".'.format(dist_name)) if self.exists(id_or_name=self._render_name(dist_name), search_for_datasets=False): self.log.info( 'Actualizando distribucion \"{}\".'.format(dist_name)) if self._push_distribution(_d=_obj, only_metadata=only_metadata, _views=_views, update=True): dis_status = True else: self.log.info( 'La distribucion \"%s\" no existe, creando nueva distribucion.' % dist_name) if self._push_distribution(_d=_obj, only_metadata=only_metadata, _views=_views): dis_status = True elif helpers.list_of(_obj, Distribution): for m in _obj.__dict__.keys(): self.save(m, only_metadata=only_metadata, _views=_views) return dis_status and ds_status
def test_value_error(self): @assure(list_of(int)) def f(x): return x with self.assertRaises(ValueError): f(["bla"])
def test_convert(self): @assure(list_of(int)) def f(x): return x self.assertEquals([1,0], f(["1", "0"]))
def test_pass_through(self): @assure(list_of(str)) def f(x): return x self.assertEquals(["bla", "blubb"], f(["bla", "blubb"]))