Skip to content

Commit

Permalink
Implemented test, fixed fk resource name
Browse files Browse the repository at this point in the history
  • Loading branch information
roll committed Oct 2, 2017
1 parent 1191bc2 commit e6bfc0e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 7 deletions.
10 changes: 10 additions & 0 deletions datapackage/package.py
Expand Up @@ -242,6 +242,7 @@ def save(self, target=None, storage=None, **options):
resource.infer()
buckets.append(_slugify_resource_name(resource.name))
schemas.append(resource.schema.descriptor)
schemas = list(map(_slugify_foreign_key, schemas))
storage.create(buckets, schemas, force=True)
for bucket in storage.buckets:
resource = self.resources[buckets.index(bucket)]
Expand Down Expand Up @@ -489,3 +490,12 @@ def _slugify_resource_name(name):
"""Slugify resource name
"""
return re.sub(r'[^a-zA-Z_]', '_', name)


def _slugify_foreign_key(schema):
"""Slugify foreign key
"""
for foreign_key in schema.get('foreignKeys', []):
foreign_key['reference']['resource'] = _slugify_resource_name(
foreign_key['reference'].get('resource', ''))
return schema
46 changes: 39 additions & 7 deletions tests/test_package.py
Expand Up @@ -1044,7 +1044,7 @@ def test_multi_field_foreign_key_invalid():
# Storage

def test_load_data_from_storage():
SCHEMA = {
schema = {
'fields': [{'format': 'default', 'name': 'id', 'type': 'integer'}],
'missingValues': ['']
}
Expand All @@ -1062,20 +1062,20 @@ def test_load_data_from_storage():
'path': 'data',
'encoding': 'utf-8',
'profile': 'tabular-data-resource',
'schema': SCHEMA}
'schema': schema}
assert resource.headers == ['id']
assert resource.read() == [[1], [2], [3]]


def test_save_data_to_storage():
SCHEMA = {
schema = {
'fields': [{'format': 'default', 'name': 'id', 'type': 'integer'}],
'missingValues': ['']
}
storage = Mock(buckets=['data'], spec=Storage)
package = Package({'resources': [{'name': 'data', 'data': [['id'], [1], [2], [3]]}]})
package.save(storage=storage)
storage.create.assert_called_with(['data'], [SCHEMA], force=True)
storage.create.assert_called_with(['data'], [schema], force=True)
storage.write.assert_called_with('data', ANY)


Expand All @@ -1088,9 +1088,41 @@ def test_package_dialect_no_header_issue_167():
assert keyed_rows[1]['score'] == 1


def test_package_save_fk_resource_names_issue_181():
assert False

def test_package_save_slugify_fk_resource_name_issue_181():
descriptor = {
'resources': [
{
'name': 'my-langs',
'data': [['en'], ['ch']],
'schema': {
'fields': [
{'name': 'lang'},
]
}
},
{
'name': 'my-notes',
'data': [['1', 'en', 'note1'], [2, 'ch', 'note2']],
'schema': {
'fields': [
{'name': 'id', 'type': 'integer'},
{'name': 'lang'},
{'name': 'note'},
],
'foreignKeys': [
{'fields': 'lang', 'reference': {'resource': 'my-langs', 'fields': 'lang'}}
]
}
}
]
}
storage = Mock(buckets=['my_langs', 'my_notes'], spec=Storage)
package = Package(descriptor)
package.save(storage=storage)
assert storage.create.call_args[0][0] == ['my_langs', 'my_notes']
assert storage.create.call_args[0][1][1]['foreignKeys'] == [
{'fields': 'lang', 'reference': {'resource': 'my_langs', 'fields': 'lang'}}
]

# Fixtures

Expand Down

0 comments on commit e6bfc0e

Please sign in to comment.