-
Notifications
You must be signed in to change notification settings - Fork 8
/
PythonScript.cs
117 lines (92 loc) · 3.83 KB
/
PythonScript.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Squared.Task;
using System.IO;
using System.Text.RegularExpressions;
namespace ShootBlues {
public class PythonScript : ManagedScript {
private string ScriptText = null;
private bool ProbablyHasLoadMethod = false;
private Regex DependencyRegex = new Regex(
@"(Dependency\(['""](?'dependency'[\w\.]+)['""]\)|OptionalDependency\(['""](?'optionaldependency'[\w\.]+)['""]\))",
RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.ExplicitCapture
);
public PythonScript (ScriptName name)
: base(name) {
}
public override IEnumerator<object> Initialize () {
yield return Reload();
}
public override IEnumerator<object> Reload () {
ScriptText = null;
var filename = Program.FindScript(Name);
if (File.Exists(filename.FullPath)) {
var fText = Future.RunInThread(
() => File.ReadAllText(filename.FullPath)
);
yield return fText;
ScriptText = fText.Result;
var signaturePos = ScriptText.IndexOf("// SIG // Begin signature block");
if (signaturePos >= 0)
ScriptText = ScriptText.Substring(0, signaturePos);
ProbablyHasLoadMethod = ScriptText.Contains("__load__");
yield return ParseDependencies();
} else {
throw new FileNotFoundException("Python script not found", filename.Name);
}
}
public IEnumerator<object> ParseDependencies () {
ClearDependencies();
MatchCollection matches = null;
yield return Future.RunInThread(
() => DependencyRegex.Matches(ScriptText)
).Bind(() => matches);
if ((matches == null) || (matches.Count == 0))
yield break;
foreach (Match m in matches) {
if (m.Groups["dependency"].Success) {
AddDependency(m.Groups["dependency"].Value, false);
} else {
AddDependency(m.Groups["optionaldependency"].Value, true);
}
}
}
public string ModuleName {
get {
return Regex.Replace(
Name, @"(\.script\.py|\.py)",
"", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace
);
}
}
public override IEnumerator<object> LoadInto (ProcessInfo process) {
if (ScriptText == null)
yield return Reload();
Program.PythonModuleToScript[ModuleName] = Name;
yield return Program.LoadPythonScript(
process, ModuleName, ScriptText
);
DisposeFuturesForProcess(process);
}
public override IEnumerator<object> LoadedInto (ProcessInfo process) {
if (ProbablyHasLoadMethod)
yield return Program.CallFunction(process, ModuleName, "__load__");
}
public override IEnumerator<object> UnloadFrom (ProcessInfo process) {
yield return Program.UnloadPythonScript(
process, ModuleName
);
if (Program.PythonModuleToScript.ContainsKey(ModuleName))
Program.PythonModuleToScript.Remove(ModuleName);
DisposeFuturesForProcess(process);
}
public IEnumerator<object> GetPreference (ProcessInfo process, string name) {
return Preferences.Get<object>(name);
}
public IEnumerator<object> SetPreference (ProcessInfo process, string name, object value) {
return Preferences.Set<object>(name, value);
}
}
}