Skip to content

Commit 3d6342d

Browse files
authored
Merge pull request #7 from TaskarCenterAtUW/feature-583
Fixed Issue https://dev.azure.com/TDEI-UW/TDEI/_workitems/edit/583
2 parents 975a14c + 8d81646 commit 3d6342d

File tree

4 files changed

+76
-60
lines changed

4 files changed

+76
-60
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,10 @@
1111
- Added schema file to package
1212

1313
### 0.0.4
14-
- Points are not required for a valid OSW dataset
14+
- Points are not required for a valid OSW dataset
15+
16+
### 0.0.5
17+
- Support for multi-level geojson file
18+
- Now handles the following two folder structures when unzipped abc.zip
19+
1. abc\{nodes, edges, points}.geojson
20+
2. {nodes, edges, points}.geojson

freeze_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
build_date = date.today().strftime('%Y-%m-%d')
1313

14-
version = '0.0.4'
14+
version = '0.0.5'
1515

1616
with open(version_file_path, 'w+') as version_file:
1717
version_file.write("version = '{}'\n".format(version))

src/python_osw_validation/extracted_data_validator.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,39 @@ def __init__(self, extracted_dir: str):
99
self.error = None
1010

1111
def is_valid(self) -> bool:
12-
if not os.path.exists(self.extracted_dir) or not os.listdir(self.extracted_dir):
13-
self.error = 'Folder is empty or does not exist.'
12+
# Check if the directory exists
13+
if not os.path.exists(self.extracted_dir):
14+
self.error = 'Directory does not exist.'
1415
return False
1516

17+
# Look for required files at the root level
1618
geojson_files = glob.glob(os.path.join(self.extracted_dir, '*.geojson'))
17-
if len(geojson_files) < 2:
18-
self.error = 'There are not enough .geojson files in the folder.'
19+
20+
# If not found at the root, check inside folders
21+
if not geojson_files:
22+
geojson_files = glob.glob(os.path.join(self.extracted_dir, '*', '*.geojson'))
23+
24+
if not geojson_files:
25+
self.error = 'No .geojson files found in the specified directory or its subdirectories.'
1926
return False
2027

21-
edges_present = False
22-
nodes_present = False
28+
required_files = {'nodes', 'edges'}
29+
optional_files = {'points'}
2330
for filename in geojson_files:
2431
base_name = os.path.basename(filename)
25-
if 'edges' in base_name and base_name.endswith('.geojson'):
26-
self.files.append(filename)
27-
edges_present = True
28-
elif 'nodes' in base_name and base_name.endswith('.geojson'):
29-
self.files.append(filename)
30-
nodes_present = True
31-
elif 'points' in base_name and base_name.endswith('.geojson'):
32-
self.files.append(filename)
33-
34-
if not edges_present or not nodes_present:
35-
self.error = 'Missing one or more required .geojson files.'
32+
for required_file in required_files:
33+
if required_file in base_name and base_name.endswith('.geojson'):
34+
self.files.append(filename)
35+
required_files.remove(required_file)
36+
break
37+
for optional_file in optional_files:
38+
if optional_file in base_name and base_name.endswith('.geojson'):
39+
self.files.append(filename)
40+
optional_files.remove(optional_file)
41+
break
42+
43+
if required_files:
44+
self.error = f'Missing required .geojson files: {", ".join(required_files)}.'
3645
return False
3746

3847
return True

tests/unit_tests/test_extracted_data_validator.py

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,62 +6,63 @@
66

77

88
class TestExtractedDataValidator(unittest.TestCase):
9-
109
def setUp(self):
11-
self.valid_dir = tempfile.mkdtemp()
12-
self.invalid_empty_dir = tempfile.mkdtemp()
13-
self.invalid_missing_files_dir = tempfile.mkdtemp()
14-
self.invalid_missing_required_files_dir = tempfile.mkdtemp()
10+
# Create a temporary directory for testing
11+
self.test_dir = tempfile.mkdtemp()
1512

1613
def tearDown(self):
17-
shutil.rmtree(self.valid_dir)
18-
shutil.rmtree(self.invalid_empty_dir)
19-
shutil.rmtree(self.invalid_missing_files_dir)
20-
shutil.rmtree(self.invalid_missing_required_files_dir)
14+
# Remove the temporary directory and its contents
15+
shutil.rmtree(self.test_dir)
2116

22-
def create_valid_directory_structure(self):
23-
# Create a valid directory structure with 3 geojson files
24-
valid_files = ['edges.geojson', 'nodes.geojson', 'points.geojson']
25-
for file in valid_files:
26-
open(os.path.join(self.valid_dir, file), 'w').close()
17+
def create_files(self, files):
18+
for file in files:
19+
with open(os.path.join(self.test_dir, file), 'w') as f:
20+
f.write('Test content')
2721

28-
def create_invalid_empty_directory(self):
29-
# Create an empty directory
30-
pass
22+
def test_valid_data_at_root(self):
23+
# Test when required files are at the root level
24+
validator = ExtractedDataValidator(self.test_dir)
25+
self.create_files(['a.nodes.geojson', 'a.edges.geojson', 'a.points.geojson'])
26+
self.assertTrue(validator.is_valid())
3127

32-
def create_invalid_missing_files_directory(self):
33-
# Create a directory with only one geojson file
34-
open(os.path.join(self.invalid_missing_files_dir, 'edges.geojson'), 'w').close()
28+
def test_valid_data_inside_folder(self):
29+
# Test when required files are inside a folder
30+
validator = ExtractedDataValidator(self.test_dir)
31+
os.makedirs(os.path.join(self.test_dir, 'abc'))
32+
self.create_files(['abc/a.nodes.geojson', 'abc/a.edges.geojson', 'abc/a.points.geojson'])
33+
self.assertTrue(validator.is_valid())
3534

36-
def create_invalid_missing_required_files_directory(self):
37-
# Create a directory with three geojson files, but not all required ones
38-
invalid_files = ['edges.geojson', 'invalid.geojson', 'points.geojson']
39-
for file in invalid_files:
40-
open(os.path.join(self.invalid_missing_required_files_dir, file), 'w').close()
35+
def test_missing_required_files(self):
36+
# Test when one of the required files is missing
37+
validator = ExtractedDataValidator(self.test_dir)
38+
self.create_files(['a.nodes.geojson', 'a.points.geojson'])
39+
self.assertFalse(validator.is_valid())
40+
self.assertEqual(validator.error, 'Missing required .geojson files: edges.')
4141

42-
def test_valid_directory_structure(self):
43-
self.create_valid_directory_structure()
44-
validator = ExtractedDataValidator(self.valid_dir)
42+
def test_missing_optional_file(self):
43+
# Test when optional file is missing
44+
validator = ExtractedDataValidator(self.test_dir)
45+
self.create_files(['a.nodes.geojson', 'a.edges.geojson'])
4546
self.assertTrue(validator.is_valid())
46-
self.assertEqual(len(validator.files), 3)
4747

48-
def test_invalid_empty_directory(self):
49-
self.create_invalid_empty_directory()
50-
validator = ExtractedDataValidator(self.invalid_empty_dir)
48+
def test_no_geojson_files(self):
49+
# Test when no .geojson files are present
50+
validator = ExtractedDataValidator(self.test_dir)
51+
self.create_files(['some.txt', 'another.txt'])
5152
self.assertFalse(validator.is_valid())
52-
self.assertEqual(validator.error, 'Folder is empty or does not exist.')
53+
self.assertEqual(validator.error, 'No .geojson files found in the specified directory or its subdirectories.')
5354

54-
def test_invalid_missing_files_directory(self):
55-
self.create_invalid_missing_files_directory()
56-
validator = ExtractedDataValidator(self.invalid_missing_files_dir)
55+
def test_invalid_directory(self):
56+
# Test when the specified directory does not exist
57+
validator = ExtractedDataValidator('nonexistent_directory')
5758
self.assertFalse(validator.is_valid())
58-
self.assertEqual(validator.error, 'There are not enough .geojson files in the folder.')
59+
self.assertEqual(validator.error, 'Directory does not exist.')
5960

60-
def test_invalid_missing_required_files_directory(self):
61-
self.create_invalid_missing_required_files_directory()
62-
validator = ExtractedDataValidator(self.invalid_missing_required_files_dir)
61+
def test_empty_directory(self):
62+
# Test when the specified directory is empty
63+
validator = ExtractedDataValidator(self.test_dir)
6364
self.assertFalse(validator.is_valid())
64-
self.assertEqual(validator.error, 'Missing one or more required .geojson files.')
65+
self.assertEqual(validator.error, 'No .geojson files found in the specified directory or its subdirectories.')
6566

6667

6768
if __name__ == '__main__':

0 commit comments

Comments
 (0)