wsba-hockey 1.0.2__py3-none-any.whl → 1.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wsba_hockey/data_pipelines.py +183 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/duckdb/vendor.py +146 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/flatted.py +149 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/test.py +63 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/gyp_main.py +45 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +367 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1270 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +153 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +271 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +690 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/common.py +661 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +78 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +165 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +109 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +808 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1173 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1321 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +120 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +103 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +464 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +58 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2714 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3981 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2936 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +55 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1394 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +25 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/input.py +3130 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +98 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +771 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1271 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +374 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1939 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +302 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3197 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/test_gyp.py +261 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/graphviz.py +102 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_gyp.py +156 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_sln.py +181 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_vcproj.py +339 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/test/fixtures/test-charmap.py +31 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/update-gyp.py +64 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/gyp_main.py +45 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +367 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1270 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +153 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +271 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +666 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/common.py +654 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +78 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +165 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +109 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +808 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1173 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1321 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +120 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +103 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +464 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +58 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2518 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3978 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2936 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +55 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1394 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +25 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/input.py +3137 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +98 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +771 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1271 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +374 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1939 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +302 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3197 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/setup.py +42 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/test_gyp.py +260 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/graphviz.py +102 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_gyp.py +156 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_sln.py +181 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_vcproj.py +339 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/test/fixtures/test-charmap.py +31 -0
- wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/update-gyp.py +46 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/app.py +401 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/name_fix.py +47 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/app.py +108 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/plot.py +93 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/rink_plot.py +245 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/app.py +145 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/plot.py +77 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/rink_plot.py +245 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/app.py +389 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/plot.py +70 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/rink_plot.py +245 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/app.py +110 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/plot.py +58 -0
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/rink_plot.py +245 -0
- wsba_hockey/tools/agg.py +242 -53
- wsba_hockey/tools/plotting.py +15 -20
- wsba_hockey/tools/scraping.py +149 -258
- wsba_hockey/tools/xg_model.py +370 -298
- wsba_hockey/workspace.py +22 -101
- wsba_hockey/wsba_main.py +494 -147
- {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/METADATA +2 -2
- wsba_hockey-1.0.4.dist-info/RECORD +135 -0
- {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/WHEEL +1 -1
- wsba_hockey/stats/calculate_viz/shot_impact.py +0 -2
- wsba_hockey-1.0.2.dist-info/RECORD +0 -19
- {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/licenses/LICENSE +0 -0
- {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright (c) 2011 Google Inc. All rights reserved.
|
2
|
+
# Use of this source code is governed by a BSD-style license that can be
|
3
|
+
# found in the LICENSE file.
|
4
|
+
|
5
|
+
"""Applies a fix to CR LF TAB handling in xml.dom.
|
6
|
+
|
7
|
+
Fixes this: http://code.google.com/p/chromium/issues/detail?id=76293
|
8
|
+
Working around this: http://bugs.python.org/issue5752
|
9
|
+
TODO(bradnelson): Consider dropping this when we drop XP support.
|
10
|
+
"""
|
11
|
+
|
12
|
+
|
13
|
+
import xml.dom.minidom
|
14
|
+
|
15
|
+
|
16
|
+
def _Replacement_write_data(writer, data, is_attrib=False):
|
17
|
+
"""Writes datachars to writer."""
|
18
|
+
data = data.replace("&", "&").replace("<", "<")
|
19
|
+
data = data.replace('"', """).replace(">", ">")
|
20
|
+
if is_attrib:
|
21
|
+
data = data.replace("\r", "
").replace("\n", "
").replace("\t", "	")
|
22
|
+
writer.write(data)
|
23
|
+
|
24
|
+
|
25
|
+
def _Replacement_writexml(self, writer, indent="", addindent="", newl=""):
|
26
|
+
# indent = current indentation
|
27
|
+
# addindent = indentation to add to higher levels
|
28
|
+
# newl = newline string
|
29
|
+
writer.write(indent + "<" + self.tagName)
|
30
|
+
|
31
|
+
attrs = self._get_attributes()
|
32
|
+
a_names = sorted(attrs.keys())
|
33
|
+
|
34
|
+
for a_name in a_names:
|
35
|
+
writer.write(' %s="' % a_name)
|
36
|
+
_Replacement_write_data(writer, attrs[a_name].value, is_attrib=True)
|
37
|
+
writer.write('"')
|
38
|
+
if self.childNodes:
|
39
|
+
writer.write(">%s" % newl)
|
40
|
+
for node in self.childNodes:
|
41
|
+
node.writexml(writer, indent + addindent, addindent, newl)
|
42
|
+
writer.write(f"{indent}</{self.tagName}>{newl}")
|
43
|
+
else:
|
44
|
+
writer.write("/>%s" % newl)
|
45
|
+
|
46
|
+
|
47
|
+
class XmlFix:
|
48
|
+
"""Object to manage temporary patching of xml.dom.minidom."""
|
49
|
+
|
50
|
+
def __init__(self):
|
51
|
+
# Preserve current xml.dom.minidom functions.
|
52
|
+
self.write_data = xml.dom.minidom._write_data
|
53
|
+
self.writexml = xml.dom.minidom.Element.writexml
|
54
|
+
# Inject replacement versions of a function and a method.
|
55
|
+
xml.dom.minidom._write_data = _Replacement_write_data
|
56
|
+
xml.dom.minidom.Element.writexml = _Replacement_writexml
|
57
|
+
|
58
|
+
def Cleanup(self):
|
59
|
+
if self.write_data:
|
60
|
+
xml.dom.minidom._write_data = self.write_data
|
61
|
+
xml.dom.minidom.Element.writexml = self.writexml
|
62
|
+
self.write_data = None
|
63
|
+
|
64
|
+
def __del__(self):
|
65
|
+
self.Cleanup()
|
@@ -0,0 +1,261 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# Copyright (c) 2012 Google Inc. All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be
|
4
|
+
# found in the LICENSE file.
|
5
|
+
|
6
|
+
"""gyptest.py -- test runner for GYP tests."""
|
7
|
+
|
8
|
+
|
9
|
+
import argparse
|
10
|
+
import os
|
11
|
+
import platform
|
12
|
+
import subprocess
|
13
|
+
import sys
|
14
|
+
import time
|
15
|
+
|
16
|
+
|
17
|
+
def is_test_name(f):
|
18
|
+
return f.startswith("gyptest") and f.endswith(".py")
|
19
|
+
|
20
|
+
|
21
|
+
def find_all_gyptest_files(directory):
|
22
|
+
result = []
|
23
|
+
for root, dirs, files in os.walk(directory):
|
24
|
+
result.extend([os.path.join(root, f) for f in files if is_test_name(f)])
|
25
|
+
result.sort()
|
26
|
+
return result
|
27
|
+
|
28
|
+
|
29
|
+
def main(argv=None):
|
30
|
+
if argv is None:
|
31
|
+
argv = sys.argv
|
32
|
+
|
33
|
+
parser = argparse.ArgumentParser()
|
34
|
+
parser.add_argument("-a", "--all", action="store_true", help="run all tests")
|
35
|
+
parser.add_argument("-C", "--chdir", action="store", help="change to directory")
|
36
|
+
parser.add_argument(
|
37
|
+
"-f",
|
38
|
+
"--format",
|
39
|
+
action="store",
|
40
|
+
default="",
|
41
|
+
help="run tests with the specified formats",
|
42
|
+
)
|
43
|
+
parser.add_argument(
|
44
|
+
"-G",
|
45
|
+
"--gyp_option",
|
46
|
+
action="append",
|
47
|
+
default=[],
|
48
|
+
help="Add -G options to the gyp command line",
|
49
|
+
)
|
50
|
+
parser.add_argument(
|
51
|
+
"-l", "--list", action="store_true", help="list available tests and exit"
|
52
|
+
)
|
53
|
+
parser.add_argument(
|
54
|
+
"-n",
|
55
|
+
"--no-exec",
|
56
|
+
action="store_true",
|
57
|
+
help="no execute, just print the command line",
|
58
|
+
)
|
59
|
+
parser.add_argument(
|
60
|
+
"--path", action="append", default=[], help="additional $PATH directory"
|
61
|
+
)
|
62
|
+
parser.add_argument(
|
63
|
+
"-q",
|
64
|
+
"--quiet",
|
65
|
+
action="store_true",
|
66
|
+
help="quiet, don't print anything unless there are failures",
|
67
|
+
)
|
68
|
+
parser.add_argument(
|
69
|
+
"-v",
|
70
|
+
"--verbose",
|
71
|
+
action="store_true",
|
72
|
+
help="print configuration info and test results.",
|
73
|
+
)
|
74
|
+
parser.add_argument("tests", nargs="*")
|
75
|
+
args = parser.parse_args(argv[1:])
|
76
|
+
|
77
|
+
if args.chdir:
|
78
|
+
os.chdir(args.chdir)
|
79
|
+
|
80
|
+
if args.path:
|
81
|
+
extra_path = [os.path.abspath(p) for p in args.path]
|
82
|
+
extra_path = os.pathsep.join(extra_path)
|
83
|
+
os.environ["PATH"] = extra_path + os.pathsep + os.environ["PATH"]
|
84
|
+
|
85
|
+
if not args.tests:
|
86
|
+
if not args.all:
|
87
|
+
sys.stderr.write("Specify -a to get all tests.\n")
|
88
|
+
return 1
|
89
|
+
args.tests = ["test"]
|
90
|
+
|
91
|
+
tests = []
|
92
|
+
for arg in args.tests:
|
93
|
+
if os.path.isdir(arg):
|
94
|
+
tests.extend(find_all_gyptest_files(os.path.normpath(arg)))
|
95
|
+
else:
|
96
|
+
if not is_test_name(os.path.basename(arg)):
|
97
|
+
print(arg, "is not a valid gyp test name.", file=sys.stderr)
|
98
|
+
sys.exit(1)
|
99
|
+
tests.append(arg)
|
100
|
+
|
101
|
+
if args.list:
|
102
|
+
for test in tests:
|
103
|
+
print(test)
|
104
|
+
sys.exit(0)
|
105
|
+
|
106
|
+
os.environ["PYTHONPATH"] = os.path.abspath("test/lib")
|
107
|
+
|
108
|
+
if args.verbose:
|
109
|
+
print_configuration_info()
|
110
|
+
|
111
|
+
if args.gyp_option and not args.quiet:
|
112
|
+
print("Extra Gyp options: %s\n" % args.gyp_option)
|
113
|
+
|
114
|
+
if args.format:
|
115
|
+
format_list = args.format.split(",")
|
116
|
+
else:
|
117
|
+
format_list = {
|
118
|
+
"aix5": ["make"],
|
119
|
+
"os400": ["make"],
|
120
|
+
"freebsd7": ["make"],
|
121
|
+
"freebsd8": ["make"],
|
122
|
+
"openbsd5": ["make"],
|
123
|
+
"cygwin": ["msvs"],
|
124
|
+
"win32": ["msvs", "ninja"],
|
125
|
+
"linux": ["make", "ninja"],
|
126
|
+
"linux2": ["make", "ninja"],
|
127
|
+
"linux3": ["make", "ninja"],
|
128
|
+
# TODO: Re-enable xcode-ninja.
|
129
|
+
# https://bugs.chromium.org/p/gyp/issues/detail?id=530
|
130
|
+
# 'darwin': ['make', 'ninja', 'xcode', 'xcode-ninja'],
|
131
|
+
"darwin": ["make", "ninja", "xcode"],
|
132
|
+
}[sys.platform]
|
133
|
+
|
134
|
+
gyp_options = []
|
135
|
+
for option in args.gyp_option:
|
136
|
+
gyp_options += ["-G", option]
|
137
|
+
|
138
|
+
runner = Runner(format_list, tests, gyp_options, args.verbose)
|
139
|
+
runner.run()
|
140
|
+
|
141
|
+
if not args.quiet:
|
142
|
+
runner.print_results()
|
143
|
+
|
144
|
+
return 1 if runner.failures else 0
|
145
|
+
|
146
|
+
|
147
|
+
def print_configuration_info():
|
148
|
+
print("Test configuration:")
|
149
|
+
if sys.platform == "darwin":
|
150
|
+
sys.path.append(os.path.abspath("test/lib"))
|
151
|
+
import TestMac
|
152
|
+
|
153
|
+
print(f" Mac {platform.mac_ver()[0]} {platform.mac_ver()[2]}")
|
154
|
+
print(f" Xcode {TestMac.Xcode.Version()}")
|
155
|
+
elif sys.platform == "win32":
|
156
|
+
sys.path.append(os.path.abspath("pylib"))
|
157
|
+
import gyp.MSVSVersion
|
158
|
+
|
159
|
+
print(" Win %s %s\n" % platform.win32_ver()[0:2])
|
160
|
+
print(" MSVS %s" % gyp.MSVSVersion.SelectVisualStudioVersion().Description())
|
161
|
+
elif sys.platform in ("linux", "linux2"):
|
162
|
+
print(" Linux %s" % " ".join(platform.linux_distribution()))
|
163
|
+
print(f" Python {platform.python_version()}")
|
164
|
+
print(f" PYTHONPATH={os.environ['PYTHONPATH']}")
|
165
|
+
print()
|
166
|
+
|
167
|
+
|
168
|
+
class Runner:
|
169
|
+
def __init__(self, formats, tests, gyp_options, verbose):
|
170
|
+
self.formats = formats
|
171
|
+
self.tests = tests
|
172
|
+
self.verbose = verbose
|
173
|
+
self.gyp_options = gyp_options
|
174
|
+
self.failures = []
|
175
|
+
self.num_tests = len(formats) * len(tests)
|
176
|
+
num_digits = len(str(self.num_tests))
|
177
|
+
self.fmt_str = "[%%%dd/%%%dd] (%%s) %%s" % (num_digits, num_digits)
|
178
|
+
self.isatty = sys.stdout.isatty() and not self.verbose
|
179
|
+
self.env = os.environ.copy()
|
180
|
+
self.hpos = 0
|
181
|
+
|
182
|
+
def run(self):
|
183
|
+
run_start = time.time()
|
184
|
+
|
185
|
+
i = 1
|
186
|
+
for fmt in self.formats:
|
187
|
+
for test in self.tests:
|
188
|
+
self.run_test(test, fmt, i)
|
189
|
+
i += 1
|
190
|
+
|
191
|
+
if self.isatty:
|
192
|
+
self.erase_current_line()
|
193
|
+
|
194
|
+
self.took = time.time() - run_start
|
195
|
+
|
196
|
+
def run_test(self, test, fmt, i):
|
197
|
+
if self.isatty:
|
198
|
+
self.erase_current_line()
|
199
|
+
|
200
|
+
msg = self.fmt_str % (i, self.num_tests, fmt, test)
|
201
|
+
self.print_(msg)
|
202
|
+
|
203
|
+
start = time.time()
|
204
|
+
cmd = [sys.executable, test] + self.gyp_options
|
205
|
+
self.env["TESTGYP_FORMAT"] = fmt
|
206
|
+
proc = subprocess.Popen(
|
207
|
+
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.env
|
208
|
+
)
|
209
|
+
proc.wait()
|
210
|
+
took = time.time() - start
|
211
|
+
|
212
|
+
stdout = proc.stdout.read().decode("utf8")
|
213
|
+
if proc.returncode == 2:
|
214
|
+
res = "skipped"
|
215
|
+
elif proc.returncode:
|
216
|
+
res = "failed"
|
217
|
+
self.failures.append(f"({test}) {fmt}")
|
218
|
+
else:
|
219
|
+
res = "passed"
|
220
|
+
res_msg = f" {res} {took:.3f}s"
|
221
|
+
self.print_(res_msg)
|
222
|
+
|
223
|
+
if stdout and not stdout.endswith(("PASSED\n", "NO RESULT\n")):
|
224
|
+
print()
|
225
|
+
print("\n".join(f" {line}" for line in stdout.splitlines()))
|
226
|
+
elif not self.isatty:
|
227
|
+
print()
|
228
|
+
|
229
|
+
def print_(self, msg):
|
230
|
+
print(msg, end="")
|
231
|
+
index = msg.rfind("\n")
|
232
|
+
if index == -1:
|
233
|
+
self.hpos += len(msg)
|
234
|
+
else:
|
235
|
+
self.hpos = len(msg) - index
|
236
|
+
sys.stdout.flush()
|
237
|
+
|
238
|
+
def erase_current_line(self):
|
239
|
+
print("\b" * self.hpos + " " * self.hpos + "\b" * self.hpos, end="")
|
240
|
+
sys.stdout.flush()
|
241
|
+
self.hpos = 0
|
242
|
+
|
243
|
+
def print_results(self):
|
244
|
+
num_failures = len(self.failures)
|
245
|
+
if num_failures:
|
246
|
+
print()
|
247
|
+
if num_failures == 1:
|
248
|
+
print("Failed the following test:")
|
249
|
+
else:
|
250
|
+
print("Failed the following %d tests:" % num_failures)
|
251
|
+
print("\t" + "\n\t".join(sorted(self.failures)))
|
252
|
+
print()
|
253
|
+
print(
|
254
|
+
"Ran %d tests in %.3fs, %d failed."
|
255
|
+
% (self.num_tests, self.took, num_failures)
|
256
|
+
)
|
257
|
+
print()
|
258
|
+
|
259
|
+
|
260
|
+
if __name__ == "__main__":
|
261
|
+
sys.exit(main())
|
@@ -0,0 +1,102 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
|
3
|
+
# Copyright (c) 2011 Google Inc. All rights reserved.
|
4
|
+
# Use of this source code is governed by a BSD-style license that can be
|
5
|
+
# found in the LICENSE file.
|
6
|
+
|
7
|
+
"""Using the JSON dumped by the dump-dependency-json generator,
|
8
|
+
generate input suitable for graphviz to render a dependency graph of
|
9
|
+
targets."""
|
10
|
+
|
11
|
+
|
12
|
+
import collections
|
13
|
+
import json
|
14
|
+
import sys
|
15
|
+
|
16
|
+
|
17
|
+
def ParseTarget(target):
|
18
|
+
target, _, suffix = target.partition("#")
|
19
|
+
filename, _, target = target.partition(":")
|
20
|
+
return filename, target, suffix
|
21
|
+
|
22
|
+
|
23
|
+
def LoadEdges(filename, targets):
|
24
|
+
"""Load the edges map from the dump file, and filter it to only
|
25
|
+
show targets in |targets| and their depedendents."""
|
26
|
+
|
27
|
+
file = open("dump.json")
|
28
|
+
edges = json.load(file)
|
29
|
+
file.close()
|
30
|
+
|
31
|
+
# Copy out only the edges we're interested in from the full edge list.
|
32
|
+
target_edges = {}
|
33
|
+
to_visit = targets[:]
|
34
|
+
while to_visit:
|
35
|
+
src = to_visit.pop()
|
36
|
+
if src in target_edges:
|
37
|
+
continue
|
38
|
+
target_edges[src] = edges[src]
|
39
|
+
to_visit.extend(edges[src])
|
40
|
+
|
41
|
+
return target_edges
|
42
|
+
|
43
|
+
|
44
|
+
def WriteGraph(edges):
|
45
|
+
"""Print a graphviz graph to stdout.
|
46
|
+
|edges| is a map of target to a list of other targets it depends on."""
|
47
|
+
|
48
|
+
# Bucket targets by file.
|
49
|
+
files = collections.defaultdict(list)
|
50
|
+
for src, dst in edges.items():
|
51
|
+
build_file, target_name, toolset = ParseTarget(src)
|
52
|
+
files[build_file].append(src)
|
53
|
+
|
54
|
+
print("digraph D {")
|
55
|
+
print(" fontsize=8") # Used by subgraphs.
|
56
|
+
print(" node [fontsize=8]")
|
57
|
+
|
58
|
+
# Output nodes by file. We must first write out each node within
|
59
|
+
# its file grouping before writing out any edges that may refer
|
60
|
+
# to those nodes.
|
61
|
+
for filename, targets in files.items():
|
62
|
+
if len(targets) == 1:
|
63
|
+
# If there's only one node for this file, simplify
|
64
|
+
# the display by making it a box without an internal node.
|
65
|
+
target = targets[0]
|
66
|
+
build_file, target_name, toolset = ParseTarget(target)
|
67
|
+
print(
|
68
|
+
f' "{target}" [shape=box, label="{filename}\\n{target_name}"]'
|
69
|
+
)
|
70
|
+
else:
|
71
|
+
# Group multiple nodes together in a subgraph.
|
72
|
+
print(' subgraph "cluster_%s" {' % filename)
|
73
|
+
print(' label = "%s"' % filename)
|
74
|
+
for target in targets:
|
75
|
+
build_file, target_name, toolset = ParseTarget(target)
|
76
|
+
print(f' "{target}" [label="{target_name}"]')
|
77
|
+
print(" }")
|
78
|
+
|
79
|
+
# Now that we've placed all the nodes within subgraphs, output all
|
80
|
+
# the edges between nodes.
|
81
|
+
for src, dsts in edges.items():
|
82
|
+
for dst in dsts:
|
83
|
+
print(f' "{src}" -> "{dst}"')
|
84
|
+
|
85
|
+
print("}")
|
86
|
+
|
87
|
+
|
88
|
+
def main():
|
89
|
+
if len(sys.argv) < 2:
|
90
|
+
print(__doc__, file=sys.stderr)
|
91
|
+
print(file=sys.stderr)
|
92
|
+
print("usage: %s target1 target2..." % (sys.argv[0]), file=sys.stderr)
|
93
|
+
return 1
|
94
|
+
|
95
|
+
edges = LoadEdges("dump.json", sys.argv[1:])
|
96
|
+
|
97
|
+
WriteGraph(edges)
|
98
|
+
return 0
|
99
|
+
|
100
|
+
|
101
|
+
if __name__ == "__main__":
|
102
|
+
sys.exit(main())
|
@@ -0,0 +1,156 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
|
3
|
+
# Copyright (c) 2012 Google Inc. All rights reserved.
|
4
|
+
# Use of this source code is governed by a BSD-style license that can be
|
5
|
+
# found in the LICENSE file.
|
6
|
+
|
7
|
+
"""Pretty-prints the contents of a GYP file."""
|
8
|
+
|
9
|
+
|
10
|
+
import sys
|
11
|
+
import re
|
12
|
+
|
13
|
+
|
14
|
+
# Regex to remove comments when we're counting braces.
|
15
|
+
COMMENT_RE = re.compile(r"\s*#.*")
|
16
|
+
|
17
|
+
# Regex to remove quoted strings when we're counting braces.
|
18
|
+
# It takes into account quoted quotes, and makes sure that the quotes match.
|
19
|
+
# NOTE: It does not handle quotes that span more than one line, or
|
20
|
+
# cases where an escaped quote is preceded by an escaped backslash.
|
21
|
+
QUOTE_RE_STR = r'(?P<q>[\'"])(.*?)(?<![^\\][\\])(?P=q)'
|
22
|
+
QUOTE_RE = re.compile(QUOTE_RE_STR)
|
23
|
+
|
24
|
+
|
25
|
+
def comment_replace(matchobj):
|
26
|
+
return matchobj.group(1) + matchobj.group(2) + "#" * len(matchobj.group(3))
|
27
|
+
|
28
|
+
|
29
|
+
def mask_comments(input):
|
30
|
+
"""Mask the quoted strings so we skip braces inside quoted strings."""
|
31
|
+
search_re = re.compile(r"(.*?)(#)(.*)")
|
32
|
+
return [search_re.sub(comment_replace, line) for line in input]
|
33
|
+
|
34
|
+
|
35
|
+
def quote_replace(matchobj):
|
36
|
+
return "{}{}{}{}".format(
|
37
|
+
matchobj.group(1),
|
38
|
+
matchobj.group(2),
|
39
|
+
"x" * len(matchobj.group(3)),
|
40
|
+
matchobj.group(2),
|
41
|
+
)
|
42
|
+
|
43
|
+
|
44
|
+
def mask_quotes(input):
|
45
|
+
"""Mask the quoted strings so we skip braces inside quoted strings."""
|
46
|
+
search_re = re.compile(r"(.*?)" + QUOTE_RE_STR)
|
47
|
+
return [search_re.sub(quote_replace, line) for line in input]
|
48
|
+
|
49
|
+
|
50
|
+
def do_split(input, masked_input, search_re):
|
51
|
+
output = []
|
52
|
+
mask_output = []
|
53
|
+
for (line, masked_line) in zip(input, masked_input):
|
54
|
+
m = search_re.match(masked_line)
|
55
|
+
while m:
|
56
|
+
split = len(m.group(1))
|
57
|
+
line = line[:split] + r"\n" + line[split:]
|
58
|
+
masked_line = masked_line[:split] + r"\n" + masked_line[split:]
|
59
|
+
m = search_re.match(masked_line)
|
60
|
+
output.extend(line.split(r"\n"))
|
61
|
+
mask_output.extend(masked_line.split(r"\n"))
|
62
|
+
return (output, mask_output)
|
63
|
+
|
64
|
+
|
65
|
+
def split_double_braces(input):
|
66
|
+
"""Masks out the quotes and comments, and then splits appropriate
|
67
|
+
lines (lines that matche the double_*_brace re's above) before
|
68
|
+
indenting them below.
|
69
|
+
|
70
|
+
These are used to split lines which have multiple braces on them, so
|
71
|
+
that the indentation looks prettier when all laid out (e.g. closing
|
72
|
+
braces make a nice diagonal line).
|
73
|
+
"""
|
74
|
+
double_open_brace_re = re.compile(r"(.*?[\[\{\(,])(\s*)([\[\{\(])")
|
75
|
+
double_close_brace_re = re.compile(r"(.*?[\]\}\)],?)(\s*)([\]\}\)])")
|
76
|
+
|
77
|
+
masked_input = mask_quotes(input)
|
78
|
+
masked_input = mask_comments(masked_input)
|
79
|
+
|
80
|
+
(output, mask_output) = do_split(input, masked_input, double_open_brace_re)
|
81
|
+
(output, mask_output) = do_split(output, mask_output, double_close_brace_re)
|
82
|
+
|
83
|
+
return output
|
84
|
+
|
85
|
+
|
86
|
+
def count_braces(line):
|
87
|
+
"""keeps track of the number of braces on a given line and returns the result.
|
88
|
+
|
89
|
+
It starts at zero and subtracts for closed braces, and adds for open braces.
|
90
|
+
"""
|
91
|
+
open_braces = ["[", "(", "{"]
|
92
|
+
close_braces = ["]", ")", "}"]
|
93
|
+
closing_prefix_re = re.compile(r"[^\s\]\}\)]\s*[\]\}\)]+,?\s*$")
|
94
|
+
cnt = 0
|
95
|
+
stripline = COMMENT_RE.sub(r"", line)
|
96
|
+
stripline = QUOTE_RE.sub(r"''", stripline)
|
97
|
+
for char in stripline:
|
98
|
+
for brace in open_braces:
|
99
|
+
if char == brace:
|
100
|
+
cnt += 1
|
101
|
+
for brace in close_braces:
|
102
|
+
if char == brace:
|
103
|
+
cnt -= 1
|
104
|
+
|
105
|
+
after = False
|
106
|
+
if cnt > 0:
|
107
|
+
after = True
|
108
|
+
|
109
|
+
# This catches the special case of a closing brace having something
|
110
|
+
# other than just whitespace ahead of it -- we don't want to
|
111
|
+
# unindent that until after this line is printed so it stays with
|
112
|
+
# the previous indentation level.
|
113
|
+
if cnt < 0 and closing_prefix_re.match(stripline):
|
114
|
+
after = True
|
115
|
+
return (cnt, after)
|
116
|
+
|
117
|
+
|
118
|
+
def prettyprint_input(lines):
|
119
|
+
"""Does the main work of indenting the input based on the brace counts."""
|
120
|
+
indent = 0
|
121
|
+
basic_offset = 2
|
122
|
+
for line in lines:
|
123
|
+
if COMMENT_RE.match(line):
|
124
|
+
print(line)
|
125
|
+
else:
|
126
|
+
line = line.strip("\r\n\t ") # Otherwise doesn't strip \r on Unix.
|
127
|
+
if len(line) > 0:
|
128
|
+
(brace_diff, after) = count_braces(line)
|
129
|
+
if brace_diff != 0:
|
130
|
+
if after:
|
131
|
+
print(" " * (basic_offset * indent) + line)
|
132
|
+
indent += brace_diff
|
133
|
+
else:
|
134
|
+
indent += brace_diff
|
135
|
+
print(" " * (basic_offset * indent) + line)
|
136
|
+
else:
|
137
|
+
print(" " * (basic_offset * indent) + line)
|
138
|
+
else:
|
139
|
+
print("")
|
140
|
+
|
141
|
+
|
142
|
+
def main():
|
143
|
+
if len(sys.argv) > 1:
|
144
|
+
data = open(sys.argv[1]).read().splitlines()
|
145
|
+
else:
|
146
|
+
data = sys.stdin.read().splitlines()
|
147
|
+
# Split up the double braces.
|
148
|
+
lines = split_double_braces(data)
|
149
|
+
|
150
|
+
# Indent and print the output.
|
151
|
+
prettyprint_input(lines)
|
152
|
+
return 0
|
153
|
+
|
154
|
+
|
155
|
+
if __name__ == "__main__":
|
156
|
+
sys.exit(main())
|