scoutos / scout / libscout / generate_behavior_lists.py @ 7b5ea072
History | View | Annotate | Download (4.04 KB)
1 | 6350051e | Alex | #!/usr/bin/python
|
---|---|---|---|
2 | |||
3 | # Usage:
|
||
4 | #
|
||
5 | # python generate_behavior_lists.py
|
||
6 | #
|
||
7 | # Parses to use only the final folder and file name for each source file.
|
||
8 | |||
9 | import sys |
||
10 | import os |
||
11 | |||
12 | AUTOGEN_HEADER = '''/**
|
||
13 | ******************************************************************************
|
||
14 | * WARNING: THIS IS AN AUTOGENERATED FILE!
|
||
15 | *
|
||
16 | * Editing this file is USELESS. It will be overwritten during the build.
|
||
17 | * To properly edit this file, edit its corresponding *.template.* file, which
|
||
18 | * a script run by CMake uses to generate this file.
|
||
19 | *
|
||
20 | * This file was generated via rules in src/generate_behavior_lists.py.
|
||
21 | *
|
||
22 | * Please see that file for a description of syntax and procedure for
|
||
23 | * creating auto-generated files.
|
||
24 | *
|
||
25 | * THIS WARNING IS LONG TO MAKE SURE IT GETS YOUR ATTENTION!
|
||
26 | * THANK YOU.
|
||
27 | *****************************************************************************
|
||
28 | */
|
||
29 |
|
||
30 | '''
|
||
31 | |||
32 | # These are the codes this script will replace in template files.
|
||
33 | FULL_PATH_CODE = 'AUTOGEN_BEHAVIOR_FULL_PATH'
|
||
34 | LAST_PATH_CODE = 'AUTOGEN_BEHAVIOR_LAST_PATH'
|
||
35 | BASE_NAME_CODE = 'AUTOGEN_BEHAVIOR_BASE_NAME'
|
||
36 | |||
37 | # Different ways to refer to files in behaviors/ and test_behaviors/.
|
||
38 | full_paths = [] |
||
39 | last_paths = [] |
||
40 | base_names = [] |
||
41 | |||
42 | # Mapping of generated files to their templates
|
||
43 | R_FILES = {'src/BehaviorList.cpp' : 'src/BehaviorList.template.cpp', |
||
44 | 'src/BehaviorList.h' : 'src/BehaviorList.template.h'} |
||
45 | |||
46 | # Parse the src/behaviors and src/test_behaviors folders
|
||
47 | cur_dir = os.getcwd() |
||
48 | 6d0836d4 | Alex | |
49 | all_paths = [] |
||
50 | all_fnames = [] |
||
51 | all_lasts = [] |
||
52 | |||
53 | # Extract all the header files for behaviors we want
|
||
54 | 6350051e | Alex | for path, dirname, fnames in os.walk('src'): |
55 | if path == 'src/behaviors' or path == 'src/test_behaviors': |
||
56 | path_parts = path.split('/')
|
||
57 | 6d0836d4 | Alex | for f in fnames: |
58 | if f.endswith('.h'): |
||
59 | all_paths.append(path) |
||
60 | all_fnames.append(f) |
||
61 | all_lasts.append(path_parts[-1])
|
||
62 | |||
63 | # Sort these headers into a good order and add them to our lists of paths/names
|
||
64 | all_fnames, all_paths, all_lasts = (list(t) for t in zip(*sorted(zip(all_fnames, all_paths, all_lasts), key=lambda x: x[0].lower()))) |
||
65 | 6350051e | Alex | |
66 | 6d0836d4 | Alex | for f, path, last in zip(all_fnames, all_paths, all_lasts): |
67 | # Pause goes first
|
||
68 | if 'pause_scout' in f: |
||
69 | full_paths.insert(0, os.path.join(cur_dir, path, f))
|
||
70 | last_paths.insert(0, os.path.join(last, f))
|
||
71 | base_names.insert(0, f.split('.')[0]) |
||
72 | # Everything else goes in alphabetical order
|
||
73 | else:
|
||
74 | full_paths.append(os.path.join(cur_dir, path, f)) |
||
75 | last_paths.append(os.path.join(last, f)) |
||
76 | base_names.append(f.split('.')[0]) |
||
77 | 6350051e | Alex | |
78 | # Now, a dictionary of codes to replace -> things to replace them with.
|
||
79 | replacements = {FULL_PATH_CODE : full_paths, |
||
80 | LAST_PATH_CODE : last_paths, |
||
81 | BASE_NAME_CODE : base_names} |
||
82 | |||
83 | cfef1cdc | Yuyang Guo | # also simultaneously write a txt file for the GUI to read from
|
84 | with open("../scoutsim/behaviorList.txt", "w") as listFile: |
||
85 | # Write all the replacements in R_FILES
|
||
86 | for outfile_name in sorted(R_FILES.keys()): |
||
87 | with open(outfile_name, 'w') as outfile: |
||
88 | with open(R_FILES[outfile_name], 'r') as infile: |
||
89 | |||
90 | # Write an obvious header so no one will edit our nicely
|
||
91 | # generated file
|
||
92 | outfile.write(AUTOGEN_HEADER) |
||
93 | 6350051e | Alex | |
94 | cfef1cdc | Yuyang Guo | for line in infile.readlines(): |
95 | # If the line needs replacing, don't write the orgininal
|
||
96 | # to the output file; rather, write many versions of the
|
||
97 | # line replaced with each replacement value.
|
||
98 | replaced = False
|
||
99 | for r_key in replacements: |
||
100 | if r_key in line: |
||
101 | replaced = True
|
||
102 | for b in replacements[r_key]: |
||
103 | outfile.write(line.replace(r_key, b)) |
||
104 | if (r_key == BASE_NAME_CODE):
|
||
105 | listFile.write(b+"\n")
|
||
106 | # If it doesn't need replacing, just write the original
|
||
107 | if not replaced: |
||
108 | outfile.write(line) |
||
109 | |||
110 |