8
8
9
9
10
10
class BaseBot :
11
+
12
+ def __init__ (self , * args , ** kwargs ):
13
+ self ._resource_folder_name = "resources"
14
+
15
+ @property
16
+ def resource_folder_name (self ) -> str :
17
+ """The name used for the resources folder
18
+ when looking for files.
19
+
20
+ Returns:
21
+ str: The folder name for resources. Defaults to `resources`
22
+ """
23
+ return self ._resource_folder_name or "resources"
24
+
25
+ @resource_folder_name .setter
26
+ def resource_folder_name (self , name : str ):
27
+ """The name used for the resources folder
28
+ whe looking for files.
29
+
30
+ Args:
31
+ name (str): The folder name for resources. Defaults to `resources`
32
+ """
33
+ if not name :
34
+ raise ValueError ("Resources folder name must not be None nor empty." )
35
+ self ._resource_folder_name = name
36
+
11
37
def action (self , execution = None ):
12
38
"""
13
39
Execute an automation action.
@@ -18,7 +44,7 @@ def action(self, execution=None):
18
44
"""
19
45
raise NotImplementedError ("You must implement this method." )
20
46
21
- def get_resource_abspath (self , filename , resource_folder = "resources" ):
47
+ def get_resource_abspath (self , filename , resource_folder = None ):
22
48
"""
23
49
Compose the resource absolute path taking into account the package path.
24
50
@@ -29,18 +55,26 @@ def get_resource_abspath(self, filename, resource_folder="resources"):
29
55
Returns:
30
56
abs_path (str): The absolute path to the file.
31
57
"""
58
+ resource_folder = resource_folder or self .resource_folder_name
32
59
return path .join (self ._resources_path (resource_folder ), filename )
33
60
34
- def _resources_path (self , resource_folder = "resources" ):
61
+ def _resources_path (self , resource_folder = None ):
35
62
# This checks if this is a pyinstaller binary
36
63
# More info here: https://pyinstaller.org/en/stable/runtime-information.html#run-time-information
64
+ resource_folder = resource_folder or self .resource_folder_name
65
+
37
66
if getattr (sys , 'frozen' , False ) and hasattr (sys , '_MEIPASS' ):
38
67
klass_name = self .__class__ .__name__
39
- res_path = os .path .join (sys ._MEIPASS , klass_name , "resources" )
68
+ res_path = os .path .join (sys ._MEIPASS , klass_name , resource_folder )
40
69
else :
41
70
res_path = sys .modules [self .__module__ ].__file__
42
71
return path .join (path .dirname (path .realpath (res_path )), resource_folder )
43
72
73
+ def _get_frame_path (self , frame ):
74
+ frame_filename = inspect .getframeinfo (frame ).filename
75
+ frame_dir = os .path .dirname (frame_filename )
76
+ return frame_dir
77
+
44
78
def _search_image_file (self , label ):
45
79
"""
46
80
When finding images, this is the priority in which we will look into:
@@ -55,6 +89,7 @@ def _search_image_file(self, label):
55
89
- sys._MEIPASS
56
90
- current working dir
57
91
"""
92
+ resource_folder = self .resource_folder_name
58
93
59
94
# map_images
60
95
img_path = self .state .map_images .get (label )
@@ -71,7 +106,7 @@ def _search_image_file(self, label):
71
106
# "resources" folder at sys._MEIPASS/<package>/
72
107
locations .append (self .get_resource_abspath ("" ))
73
108
# "resources" folder parallel to the sys._MEIPASS folder
74
- locations .append (os .path .join (sys ._MEIPASS , "resources" ))
109
+ locations .append (os .path .join (sys ._MEIPASS , resource_folder ))
75
110
# sys._MEIPASS
76
111
locations .append (sys ._MEIPASS )
77
112
else :
@@ -82,15 +117,17 @@ def _search_image_file(self, label):
82
117
83
118
# "resources" folder parallel to the `find` caller file.
84
119
try :
85
- caller = inspect .currentframe ().f_back .f_back
86
- caller_filename = inspect .getframeinfo (caller ).filename
87
- caller_dir = os .path .dirname (caller_filename )
88
- locations .append (os .path .join (caller_dir , "resources" ))
120
+ frame = inspect .currentframe ()
121
+ while frame is not None :
122
+ caller_dir = self ._get_frame_path (frame )
123
+ caller_path = os .path .join (caller_dir , resource_folder )
124
+ locations .append (caller_path )
125
+ frame = frame .f_back
89
126
except : # noqa: E722
90
127
pass
91
128
92
129
# "resources" folder parallel to the current working dir
93
- locations .append (os .path .join (os .getcwd (), "resources" ))
130
+ locations .append (os .path .join (os .getcwd (), resource_folder ))
94
131
95
132
# current working dir
96
133
locations .append (os .getcwd ())
@@ -125,7 +162,7 @@ def main(cls):
125
162
execution = None
126
163
# TODO: Refactor this later for proper parameters to be passed
127
164
# in a cleaner way
128
- if len (sys .argv ) = = 4 :
165
+ if len (sys .argv ) > = 4 :
129
166
if maestro_available :
130
167
server , task_id , token = sys .argv [1 :4 ]
131
168
bot .maestro = BotMaestroSDK (server = server )
0 commit comments