33# SPDX-FileCopyrightText: 2022 Pen-Yuan Hsing
44# SPDX-License-Identifier: AGPL-3.0-or-later
55
6- # Categorised list of file extensions
6+ # 1. Categorised list of file extensions
7+ #
78# Each category is a `list` and each extension should be in only one list.
89#
910# Most extensions are from this paper:
1213# mining. Design Science, 4(e19). https://doi.org/10.1017/dsj.2018.15
1314#
1415# Extensions changed or not from that paper are marked in comments.
16+ #
17+ # 2. Additional file extension information
18+ #
19+ # `osh_file_types` is derived from a list of open source hardware file
20+ # extension information from the Open Source Ecology Germany CAD and PCB file
21+ # type metadata lists:
22+ # https://gitlab.com/OSEGermany/osh-file-types/
23+
24+ # Python Standard Library imports
25+ import csv
26+
27+ #
28+ # 1. Categorised list of file extensions
29+ #
1530
1631# Electronic CAD
1732ecad : list = [
132147 "tex" , # added
133148 "txt" ,
134149 "yaml" # added
135- ]
150+ ]
151+
152+ #
153+ # 2. Additional file extension information
154+ #
155+
156+ # Column mappings to shorter names
157+ column_mappings : dict = {
158+ "File extension" : "extension" ,
159+ "File format [open|proprietary|unknown]" : "format" ,
160+ "Encoding [text|binary|both|unknown]" : "encoding" ,
161+ "Category [source|export]" : "category"
162+ }
163+
164+ # Read list of CAD files
165+ with open ("oshminer/osh-file-types/file_extension_formats-cad.csv" , newline = '' ) as cad_formats_file :
166+ cad_reader : csv .DictReader = csv .DictReader (cad_formats_file , delimiter = ',' )
167+ # Get column names, see:
168+ # https://stackoverflow.com/a/28837325/186904
169+ # https://www.geeksforgeeks.org/get-column-names-from-csv-using-python/
170+ cad_files : list = list (cad_reader )
171+ # Rename `dict` keys for each entry for easier handling, see:
172+ # https://stackoverflow.com/a/16475444/186904
173+ for column_name in list (column_mappings .keys ()):
174+ cad_files : list = [{column_mappings [column_name ] if k == column_name else k :v for k ,v in r .items ()} for r in cad_files ]
175+
176+ # Read list of PCB files
177+ with open ("oshminer/osh-file-types/file_extension_formats-pcb.csv" , newline = '' ) as pcb_formats_file :
178+ pcb_reader : csv .DictReader = csv .DictReader (pcb_formats_file , delimiter = ',' )
179+ # Get column names, see:
180+ # https://stackoverflow.com/a/28837325/186904
181+ # https://www.geeksforgeeks.org/get-column-names-from-csv-using-python/
182+ pcb_files : list = list (pcb_reader )
183+ # Rename `dict` keys for each entry for easier handling, see:
184+ # https://stackoverflow.com/a/16475444/186904
185+ for column_name in list (column_mappings .keys ()):
186+ pcb_files : list = [{column_mappings [column_name ] if k == column_name else k :v for k ,v in r .items ()} for r in pcb_files ]
187+
188+ # Combine CAD and PCB lists
189+ osh_file_types : list = cad_files + pcb_files
0 commit comments