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