@@ -97,6 +97,15 @@ def get_day_and_year():
97
97
"""
98
98
pattern_year = r"201[5-9]|202[0-9]"
99
99
pattern_day = r"2[0-5]|1[0-9]|[1-9]"
100
+ pattern_path = re .escape (os .sep ) + re .escape (os .sep ).join ([r"20\d\d" , r"[0-2]?\d" , r".*\.py$" ])
101
+ visited = []
102
+
103
+ def giveup (msg ):
104
+ log .info ("introspection failure" )
105
+ for fname in visited :
106
+ log .info ("stack crawl visited %s" , fname )
107
+ return AocdError (msg )
108
+
100
109
for frame in traceback .extract_stack ():
101
110
filename = frame [0 ]
102
111
linetxt = frame [- 1 ] or ""
@@ -112,6 +121,7 @@ def get_day_and_year():
112
121
"aocd" not in linetxt ,
113
122
"ipykernel" in filename ,
114
123
]
124
+ visited .append (filename )
115
125
if not any (reasons_to_skip_frame ):
116
126
log .debug ("stack crawl found %s" , filename )
117
127
abspath = os .path .abspath (filename )
@@ -126,6 +136,18 @@ def get_day_and_year():
126
136
if abspath and re .search (pattern_day , abspath ):
127
137
basename = os .path .basename (abspath )
128
138
break
139
+ elif re .search (pattern_path , filename ):
140
+ year = day = None
141
+ for part in filename .split (os .sep ):
142
+ if not part .isdigit ():
143
+ continue
144
+ if len (part ) == 4 :
145
+ year = int (part )
146
+ elif 1 <= len (part ) <= 2 :
147
+ day = int (part )
148
+ if year is not None and day is not None :
149
+ log .debug ("year=%s day=%s filename=%s" , year , day , filename )
150
+ return day , year
129
151
log .debug ("skipping frame %s" , filename )
130
152
else :
131
153
import __main__
@@ -135,10 +157,10 @@ def get_day_and_year():
135
157
year = most_recent_year ()
136
158
return day , year
137
159
log .debug ("non-interactive" )
138
- raise AocdError ("Failed introspection of filename" )
160
+ raise giveup ("Failed introspection of filename" )
139
161
years = {int (year ) for year in re .findall (pattern_year , abspath )}
140
162
if len (years ) > 1 :
141
- raise AocdError ("Failed introspection of year" )
163
+ raise giveup ("Failed introspection of year" )
142
164
year = years .pop () if years else None
143
165
basename_no_years = re .sub (pattern_year , "" , basename )
144
166
try :
@@ -152,4 +174,4 @@ def get_day_and_year():
152
174
log .debug ("year=%s day=%s" , year or "?" , day )
153
175
return day , year
154
176
log .debug ("giving up introspection for %s" , abspath )
155
- raise AocdError ("Failed introspection of day" )
177
+ raise giveup ("Failed introspection of day" )
0 commit comments