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.
Files changed (130) hide show
  1. wsba_hockey/data_pipelines.py +183 -0
  2. wsba_hockey/evidence/weakside-breakout/node_modules/duckdb/vendor.py +146 -0
  3. wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/flatted.py +149 -0
  4. wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/test.py +63 -0
  5. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/gyp_main.py +45 -0
  6. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +367 -0
  7. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
  8. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1270 -0
  9. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
  10. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
  11. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +153 -0
  12. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +271 -0
  13. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
  14. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +690 -0
  15. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/common.py +661 -0
  16. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +78 -0
  17. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +165 -0
  18. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +109 -0
  19. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
  20. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  21. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +808 -0
  22. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1173 -0
  23. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1321 -0
  24. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +120 -0
  25. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +103 -0
  26. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +464 -0
  27. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
  28. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +58 -0
  29. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2714 -0
  30. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3981 -0
  31. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
  32. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2936 -0
  33. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +55 -0
  34. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1394 -0
  35. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +25 -0
  36. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/input.py +3130 -0
  37. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +98 -0
  38. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +771 -0
  39. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1271 -0
  40. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
  41. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
  42. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +374 -0
  43. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1939 -0
  44. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +302 -0
  45. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3197 -0
  46. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
  47. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/test_gyp.py +261 -0
  48. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/graphviz.py +102 -0
  49. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_gyp.py +156 -0
  50. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_sln.py +181 -0
  51. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/gyp/tools/pretty_vcproj.py +339 -0
  52. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/test/fixtures/test-charmap.py +31 -0
  53. wsba_hockey/evidence/weakside-breakout/node_modules/node-gyp/update-gyp.py +64 -0
  54. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/gyp_main.py +45 -0
  55. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +367 -0
  56. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
  57. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1270 -0
  58. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
  59. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
  60. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +153 -0
  61. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +271 -0
  62. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
  63. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +666 -0
  64. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/common.py +654 -0
  65. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +78 -0
  66. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +165 -0
  67. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +109 -0
  68. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
  69. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  70. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +808 -0
  71. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1173 -0
  72. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1321 -0
  73. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +120 -0
  74. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +103 -0
  75. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +464 -0
  76. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
  77. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +58 -0
  78. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2518 -0
  79. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3978 -0
  80. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
  81. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2936 -0
  82. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +55 -0
  83. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1394 -0
  84. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +25 -0
  85. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/input.py +3137 -0
  86. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +98 -0
  87. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +771 -0
  88. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1271 -0
  89. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
  90. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
  91. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +374 -0
  92. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1939 -0
  93. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +302 -0
  94. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3197 -0
  95. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
  96. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/setup.py +42 -0
  97. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/test_gyp.py +260 -0
  98. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/graphviz.py +102 -0
  99. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_gyp.py +156 -0
  100. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_sln.py +181 -0
  101. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_vcproj.py +339 -0
  102. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/test/fixtures/test-charmap.py +31 -0
  103. wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/update-gyp.py +46 -0
  104. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/app.py +401 -0
  105. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/name_fix.py +47 -0
  106. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/app.py +108 -0
  107. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/plot.py +93 -0
  108. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/rink_plot.py +245 -0
  109. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/app.py +145 -0
  110. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/plot.py +77 -0
  111. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/matchups/rink_plot.py +245 -0
  112. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/app.py +389 -0
  113. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/plot.py +70 -0
  114. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/pbp/rink_plot.py +245 -0
  115. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/app.py +110 -0
  116. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/plot.py +58 -0
  117. wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/rink_plot.py +245 -0
  118. wsba_hockey/tools/agg.py +242 -53
  119. wsba_hockey/tools/plotting.py +15 -20
  120. wsba_hockey/tools/scraping.py +149 -258
  121. wsba_hockey/tools/xg_model.py +370 -298
  122. wsba_hockey/workspace.py +22 -101
  123. wsba_hockey/wsba_main.py +494 -147
  124. {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/METADATA +2 -2
  125. wsba_hockey-1.0.4.dist-info/RECORD +135 -0
  126. {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/WHEEL +1 -1
  127. wsba_hockey/stats/calculate_viz/shot_impact.py +0 -2
  128. wsba_hockey-1.0.2.dist-info/RECORD +0 -19
  129. {wsba_hockey-1.0.2.dist-info → wsba_hockey-1.0.4.dist-info}/licenses/LICENSE +0 -0
  130. {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("&", "&amp;").replace("<", "&lt;")
19
+ data = data.replace('"', "&quot;").replace(">", "&gt;")
20
+ if is_attrib:
21
+ data = data.replace("\r", "&#xD;").replace("\n", "&#xA;").replace("\t", "&#x9;")
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())