Skip to content

Commit f38d772

Browse files
committed
Added LoadFileTemplate
1 parent dd8b769 commit f38d772

File tree

1 file changed

+362
-0
lines changed

1 file changed

+362
-0
lines changed

LoadFileTemplate.wl

+362
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
(* ::Package:: *)
2+
3+
(* ::Section:: *)
4+
(*$Name Loader*)
5+
6+
7+
BeginPackage["$Name`"]
8+
9+
10+
$Name::usage="A head for the package (useful for messages)";
11+
12+
13+
(* ::Subsection:: *)
14+
(*Package Level Symbols*)
15+
16+
17+
BeginPackage["`PackagePrivate`"]
18+
19+
20+
$PackageName::usage="The name of the package";
21+
$PackageDirectory::usage="The directory for the package";
22+
23+
24+
$PackageListing::usage="The listing of packages";
25+
$PackageContexts::usage="The list of contexts exposed to all packages";
26+
$PackageDeclared::usage="Whether the package has been auto-loaded or not";
27+
28+
29+
$PackageFileContexts::usage="The contexts for files in the package";
30+
$DeclaredPackages::usage="The set of packages found and declared via the autoloader";
31+
$LoadedPackages::usage="The set of loaded packages";
32+
33+
34+
PackageExecute::usage="Executes something with the package contexts exposed";
35+
PackageLoadPackage::usage="Loads a package via PackageExecute";
36+
PackageLoadDeclare::usage="Declares a package";
37+
38+
39+
PackageAppLoad::usage="Loads the entire package";
40+
PackageAppGet::usage="";
41+
42+
43+
(* ::Subsubsection::Closed:: *)
44+
(*Begin*)
45+
46+
47+
Begin["`Private`"]
48+
49+
50+
(* ::Subsubsection::Closed:: *)
51+
(*Constants*)
52+
53+
54+
$PackageName="$Name";
55+
$Name["Directory"]:=
56+
$PackageDirectory;
57+
$PackageDirectory=
58+
DirectoryName@$InputFileName;
59+
60+
61+
$PackagePackagesDirectory="Packages"
62+
63+
64+
$Name["PackageListing"]:=$PackageListing;
65+
$PackageListing=<||>;
66+
$Name["Contexts"]:=$PackageContexts;
67+
If[!ListQ@$PackageContexts,
68+
$PackageContexts=
69+
{
70+
"$Name`",
71+
"$Name`PackagePrivate`"
72+
}
73+
];
74+
$PackageDeclared=TrueQ[$PackageDeclared];
75+
76+
77+
$Name["FileContexts"]:=$PackageFileContexts;
78+
If[Not@AssociationQ@$PackageFileContexts,
79+
$PackageFileContexts=
80+
<||>
81+
];
82+
$Name["DeclaredPackages"]:=$DeclaredPackages;
83+
If[Not@AssociationQ@$DeclaredPackages,
84+
$DeclaredPackages=
85+
<||>
86+
];
87+
$Name["LoadedPackages"]:=$LoadedPackages;
88+
If[Not@ListQ@$LoadedPackages,
89+
$LoadedPackages={}
90+
];
91+
92+
93+
(* ::Subsubsection::Closed:: *)
94+
(*PackageFilePath*)
95+
96+
97+
PackageFilePath[p__]:=
98+
FileNameJoin[Flatten@{
99+
$PackageDirectory,
100+
p
101+
}];
102+
103+
104+
(* ::Subsubsection::Closed:: *)
105+
(*PackageExecute*)
106+
107+
108+
PackageExecute[expr_]:=
109+
Internal`WithLocalSettings[
110+
Begin[$PackageContexts[[1]]];
111+
System`Private`NewContextPath@
112+
Prepend[
113+
$PackageContexts,
114+
"System`"
115+
];,
116+
expr,
117+
System`Private`RestoreContextPath[];
118+
End[];
119+
];
120+
PackageExecute~SetAttributes~HoldFirst
121+
122+
123+
(* ::Subsubsection::Closed:: *)
124+
(*PackagePullDeclarations*)
125+
126+
127+
PackagePullDeclarationsAction//Clear
128+
PackagePullDeclarationsAction[
129+
Hold[
130+
_Begin|_BeginPackage|
131+
CompoundExpression[_Begin|_BeginPackage,___]
132+
]
133+
]:=
134+
Throw[Begin];
135+
PackagePullDeclarationsAction[e:Except[Hold[Expression]]]:=
136+
Sow@e;
137+
138+
139+
PackagePullDeclarations[pkgFile_]:=
140+
pkgFile->
141+
Cases[
142+
Reap[
143+
With[{f=OpenRead[pkgFile]},
144+
Catch@
145+
Do[
146+
If[
147+
Length[
148+
ReadList[
149+
f,
150+
PackagePullDeclarationsAction@Hold[Expression],
151+
1
152+
]
153+
]===0,
154+
Throw[EndOfFile]
155+
],
156+
Infinity
157+
];
158+
Close[f]
159+
]
160+
][[2,1]],
161+
s_Symbol?(
162+
Function[Null,
163+
Quiet[Context[#]===$Context],
164+
HoldAllComplete
165+
]
166+
):>
167+
HoldPattern[s],
168+
Infinity
169+
]
170+
171+
172+
(* ::Subsubsection::Closed:: *)
173+
(*PackageLoadPackage*)
174+
175+
176+
PackageLoadPackage[heldSym_,context_,pkgFile_->syms_]:=
177+
Block[{
178+
$loadingChain=
179+
If[ListQ@$loadingChain,$loadingChain,{}],
180+
$inLoad=TrueQ[$inLoad]
181+
},
182+
Internal`WithLocalSettings[
183+
System`Private`NewContextPath@$ContextPath,
184+
If[!MemberQ[$loadingChain,pkgFile],
185+
AppendTo[$loadingChain, pkgFile];
186+
With[{$$inLoad=$inLoad},
187+
$inLoad=True;
188+
Replace[Thread[syms,HoldPattern],
189+
Verbatim[HoldPattern][{s__}]:>Clear[s]
190+
];
191+
If[Not@MemberQ[$ContextPath,context],
192+
$ContextPath=Prepend[$ContextPath,context];
193+
];
194+
PackageAppGet[context,pkgFile];
195+
Unprotect[$LoadedPackages];
196+
AppendTo[$LoadedPackages, pkgFile];
197+
Protect[$LoadedPackages];
198+
ReleaseHold[heldSym]
199+
]
200+
],
201+
System`Private`RestoreContextPath[]
202+
]
203+
];
204+
205+
206+
(* ::Subsubsection::Closed:: *)
207+
(*PackageDeclarePackage*)
208+
209+
210+
PackageDeclarePackage[pkgFile_->syms_]:=
211+
With[{c=$Context},
212+
$DeclaredPackages[pkgFile]=syms;
213+
$PackageFileContexts[pkgFile]=c;
214+
Map[
215+
If[True,
216+
#:=PackageLoadPackage[#,c,pkgFile->syms]
217+
]&,
218+
syms
219+
]
220+
];
221+
222+
223+
(* ::Subsubsection::Closed:: *)
224+
(*PackageLoadDeclare*)
225+
226+
227+
PackageLoadDeclare[pkgFile_String]:=
228+
If[!MemberQ[$LoadedPackages,pkgFile],
229+
If[!KeyMemberQ[$DeclaredPackages,pkgFile],
230+
PackageDeclarePackage@
231+
PackagePullDeclarations[pkgFile]
232+
],
233+
PackageAppGet[pkgFile]
234+
];
235+
236+
237+
(* ::Subsubsection::Closed:: *)
238+
(*PackageAppLoad*)
239+
240+
241+
$Name["Load", args___]:=
242+
PackageAppLoad[args]
243+
244+
245+
packageAppLoad[dir_, listing_]:=
246+
With[
247+
{
248+
fileNames=
249+
Select[
250+
FileNames["*", dir],
251+
DirectoryQ@#||MatchQ[FileExtension[#], "m"|"wl"]&
252+
]
253+
},
254+
Replace[
255+
Select[fileNames,
256+
StringMatchQ[
257+
ToLowerCase@FileNameTake[#],
258+
"__pre__."~~("m"|"wl")
259+
]&
260+
],
261+
{f_}:>Get[f]
262+
];
263+
PackageAppLoad[
264+
$PackageListing[listing]=
265+
Select[fileNames, StringFreeQ["__"]@*FileBaseName]
266+
];
267+
Replace[
268+
Select[fileNames,
269+
StringMatchQ[
270+
ToLowerCase@FileNameTake[#],
271+
"__Post__."~~("m"|"wl")
272+
]&
273+
],
274+
{f_}:>Get[f]
275+
];
276+
];
277+
278+
279+
PackageAppLoad[dir_String?DirectoryQ]:=
280+
If[StringMatchQ[FileBaseName@dir,(WordCharacter|"$")..],
281+
Internal`WithLocalSettings[
282+
Begin["`"<>FileBaseName[dir]<>"`"],
283+
AppendTo[$PackageContexts, $Context];
284+
packageAppLoad[dir, FileNameDrop[dir, FileNameDepth[$PackageDirectory]+1]],
285+
End[]
286+
]
287+
];
288+
PackageAppLoad[file_String?FileExistsQ]:=
289+
PackageLoadDeclare[file];
290+
PackageAppLoad[]:=
291+
PackageExecute@
292+
packageAppLoad[
293+
FileNameJoin@{$PackageDirectory, $PackagePackagesDirectory},
294+
$PackageName
295+
];
296+
PackageAppLoad~SetAttributes~Listable;
297+
298+
299+
(* ::Subsubsection::Closed:: *)
300+
(*PackageAppGet*)
301+
302+
303+
$Name["Get", f__]:=
304+
PackageAppGet[f];
305+
PackageAppGet[f_]:=
306+
PackageExecute@
307+
With[{fBase =
308+
If[FileExistsQ@f,
309+
f,
310+
PackageFilePath[$PackagePackagesDirectory, f<>".m"]
311+
]
312+
},
313+
With[{cont =
314+
Most@
315+
FileNameSplit[
316+
FileNameDrop[fBase,
317+
FileNameDepth[PackageFilePath[$PackagePackagesDirectory]]
318+
]
319+
]},
320+
If[Length[cont]>0,
321+
Begin[StringRiffle[Append[""]@Prepend[""]@cont, "`"]];
322+
(End[];#)&@Get[fBase],
323+
Get[fBase]
324+
]
325+
]
326+
];
327+
PackageAppGet[c_,f_]:=
328+
PackageExecute[
329+
Begin[c];
330+
(End[];#)&@
331+
If[FileExistsQ@f,
332+
Get@f;,
333+
Get@PackageFilePath[$PackagePackagesDirectory, f<>".m"]
334+
]
335+
];
336+
337+
338+
(* ::Subsubsection::Closed:: *)
339+
(*End*)
340+
341+
342+
End[]
343+
344+
345+
(* ::Subsubsection::Closed:: *)
346+
(*EndPackage*)
347+
348+
349+
EndPackage[]
350+
351+
352+
(* ::Subsection:: *)
353+
(*Load*)
354+
355+
356+
If[!TrueQ[`PackagePrivate`$PackageDeclared],
357+
`PackagePrivate`PackageAppLoad[];
358+
`PackagePrivate`$PackageDeclared
359+
]
360+
361+
362+
EndPackage[]

0 commit comments

Comments
 (0)