crosshair-tool 0.0.93__cp312-cp312-macosx_11_0_arm64.whl → 0.0.94__cp312-cp312-macosx_11_0_arm64.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.
Potentially problematic release.
This version of crosshair-tool might be problematic. Click here for more details.
- _crosshair_tracers.cpython-312-darwin.so +0 -0
- crosshair/__init__.py +1 -1
- crosshair/core.py +13 -0
- crosshair/core_test.py +25 -1
- crosshair/dynamic_typing.py +36 -15
- crosshair/dynamic_typing_test.py +18 -3
- crosshair/examples/check_examples_test.py +1 -1
- crosshair/main.py +18 -10
- crosshair/main_test.py +18 -9
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/METADATA +1 -1
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/RECORD +15 -15
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/WHEEL +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/entry_points.txt +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/licenses/LICENSE +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.94.dist-info}/top_level.txt +0 -0
|
Binary file
|
crosshair/__init__.py
CHANGED
|
@@ -15,7 +15,7 @@ from crosshair.statespace import StateSpace
|
|
|
15
15
|
from crosshair.tracers import NoTracing, ResumedTracing
|
|
16
16
|
from crosshair.util import IgnoreAttempt, debug
|
|
17
17
|
|
|
18
|
-
__version__ = "0.0.
|
|
18
|
+
__version__ = "0.0.94" # Do not forget to update in setup.py!
|
|
19
19
|
__author__ = "Phillip Schanely"
|
|
20
20
|
__license__ = "MIT"
|
|
21
21
|
__status__ = "Alpha"
|
crosshair/core.py
CHANGED
|
@@ -127,6 +127,14 @@ from crosshair.util import (
|
|
|
127
127
|
warn,
|
|
128
128
|
)
|
|
129
129
|
|
|
130
|
+
if sys.version_info >= (3, 12):
|
|
131
|
+
from typing import TypeAliasType
|
|
132
|
+
|
|
133
|
+
TypeAliasTypes = (TypeAliasType,)
|
|
134
|
+
else:
|
|
135
|
+
TypeAliasTypes = ()
|
|
136
|
+
|
|
137
|
+
|
|
130
138
|
_MISSING = object()
|
|
131
139
|
|
|
132
140
|
|
|
@@ -667,6 +675,11 @@ def proxy_for_type(
|
|
|
667
675
|
typ = normalize_pytype(typ)
|
|
668
676
|
origin = origin_of(typ)
|
|
669
677
|
type_args = type_args_of(typ)
|
|
678
|
+
while isinstance(origin, TypeAliasTypes):
|
|
679
|
+
type_var_bindings = dict(zip(origin.__type_params__, type_args))
|
|
680
|
+
unified = dynamic_typing.realize(origin.__value__, type_var_bindings)
|
|
681
|
+
return proxy_for_type(unified, varname, allow_subtypes)
|
|
682
|
+
|
|
670
683
|
# special cases
|
|
671
684
|
if isinstance(typ, type) and issubclass(typ, enum.Enum):
|
|
672
685
|
enum_values = list(typ) # type:ignore
|
crosshair/core_test.py
CHANGED
|
@@ -5,6 +5,7 @@ import re
|
|
|
5
5
|
import sys
|
|
6
6
|
import time
|
|
7
7
|
from typing import *
|
|
8
|
+
from unittest import skipIf
|
|
8
9
|
|
|
9
10
|
import pytest # type: ignore
|
|
10
11
|
|
|
@@ -28,7 +29,7 @@ from crosshair.core_and_libs import (
|
|
|
28
29
|
standalone_statespace,
|
|
29
30
|
)
|
|
30
31
|
from crosshair.fnutil import FunctionInfo, walk_qualname
|
|
31
|
-
from crosshair.libimpl.builtinslib import SymbolicInt
|
|
32
|
+
from crosshair.libimpl.builtinslib import LazyIntSymbolicStr, SymbolicInt
|
|
32
33
|
from crosshair.options import DEFAULT_OPTIONS, AnalysisOptionSet
|
|
33
34
|
from crosshair.statespace import (
|
|
34
35
|
CANNOT_CONFIRM,
|
|
@@ -735,6 +736,29 @@ def test_newtype() -> None:
|
|
|
735
736
|
assert isinstance(x, SymbolicInt)
|
|
736
737
|
|
|
737
738
|
|
|
739
|
+
@skipIf(sys.version_info < (3, 12), "type statements added in 3.12")
|
|
740
|
+
def test_type_statement() -> None:
|
|
741
|
+
env: dict[str, Any] = {}
|
|
742
|
+
exec("type MyIntNew = int\n", env)
|
|
743
|
+
assert "MyIntNew" in env
|
|
744
|
+
MyIntNew = env["MyIntNew"]
|
|
745
|
+
with standalone_statespace:
|
|
746
|
+
x = proxy_for_type(MyIntNew, "x")
|
|
747
|
+
assert isinstance(x, SymbolicInt)
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
@skipIf(sys.version_info < (3, 12), "type statements added in 3.12")
|
|
751
|
+
def test_parameterized_type_statement() -> None:
|
|
752
|
+
env: dict[str, Any] = {}
|
|
753
|
+
exec("type Pair[A, B] = tuple[B, A]\n", env)
|
|
754
|
+
assert "Pair" in env
|
|
755
|
+
Pair = env["Pair"]
|
|
756
|
+
with standalone_statespace:
|
|
757
|
+
x = proxy_for_type(Pair[int, str], "x")
|
|
758
|
+
assert isinstance(x[0], LazyIntSymbolicStr)
|
|
759
|
+
assert isinstance(x[1], SymbolicInt)
|
|
760
|
+
|
|
761
|
+
|
|
738
762
|
def test_container_typevar() -> None:
|
|
739
763
|
T = TypeVar("T")
|
|
740
764
|
|
crosshair/dynamic_typing.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import collections.abc
|
|
2
|
+
import sys
|
|
2
3
|
import typing
|
|
3
4
|
from inspect import Parameter, Signature
|
|
4
5
|
from itertools import zip_longest
|
|
@@ -223,21 +224,41 @@ def get_bindings_from_type_arguments(pytype: Type) -> Mapping[object, type]:
|
|
|
223
224
|
return {}
|
|
224
225
|
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
newargs
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
pytype_origin
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
227
|
+
if sys.version_info >= (3, 9):
|
|
228
|
+
|
|
229
|
+
def realize(pytype: Type, bindings: Mapping[object, type]) -> object:
|
|
230
|
+
if typing_inspect.is_typevar(pytype):
|
|
231
|
+
return bindings[pytype]
|
|
232
|
+
if not hasattr(pytype, "__args__"):
|
|
233
|
+
return pytype
|
|
234
|
+
newargs: List = []
|
|
235
|
+
for arg in pytype.__args__: # type:ignore
|
|
236
|
+
newargs.append(realize(arg, bindings))
|
|
237
|
+
pytype_origin = origin_of(pytype)
|
|
238
|
+
if pytype_origin in (
|
|
239
|
+
collections.abc.Callable,
|
|
240
|
+
typing.Callable,
|
|
241
|
+
): # Callable args get flattened
|
|
242
|
+
newargs = [newargs[:-1], newargs[-1]]
|
|
243
|
+
return pytype_origin.__class_getitem__(tuple(newargs))
|
|
244
|
+
|
|
245
|
+
else:
|
|
246
|
+
|
|
247
|
+
def realize(pytype: Type, bindings: Mapping[object, type]) -> object:
|
|
248
|
+
if typing_inspect.is_typevar(pytype):
|
|
249
|
+
return bindings[pytype]
|
|
250
|
+
if not hasattr(pytype, "__args__"):
|
|
251
|
+
return pytype
|
|
252
|
+
newargs: List = []
|
|
253
|
+
for arg in pytype.__args__: # type:ignore
|
|
254
|
+
newargs.append(realize(arg, bindings))
|
|
255
|
+
# print('realizing pytype', repr(pytype), 'newargs', repr(newargs))
|
|
256
|
+
pytype_origin = origin_of(pytype)
|
|
257
|
+
if not hasattr(pytype_origin, "_name"):
|
|
258
|
+
pytype_origin = getattr(typing, pytype._name) # type:ignore
|
|
259
|
+
if pytype_origin is Callable: # Callable args get flattened
|
|
260
|
+
newargs = [newargs[:-1], newargs[-1]]
|
|
261
|
+
return pytype_origin.__getitem__(tuple(newargs))
|
|
241
262
|
|
|
242
263
|
|
|
243
264
|
def isolate_var_params(
|
crosshair/dynamic_typing_test.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import collections
|
|
2
|
+
import sys
|
|
2
3
|
from inspect import Parameter, Signature, signature
|
|
3
4
|
from typing import (
|
|
4
5
|
Callable,
|
|
@@ -60,7 +61,12 @@ def test_typedicts():
|
|
|
60
61
|
def test_typevars():
|
|
61
62
|
bindings = collections.ChainMap()
|
|
62
63
|
assert unify(Tuple[int, str, List[int]], Tuple[int, _T, _U], bindings)
|
|
63
|
-
|
|
64
|
+
|
|
65
|
+
ret = realize(Mapping[_U, _T], bindings)
|
|
66
|
+
if sys.version_info >= (3, 9):
|
|
67
|
+
assert ret == collections.abc.Mapping[List[int], str]
|
|
68
|
+
else:
|
|
69
|
+
assert ret == Mapping[List[int], str]
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
def test_bound_vtypears():
|
|
@@ -79,7 +85,13 @@ def test_callable():
|
|
|
79
85
|
|
|
80
86
|
assert not unify(Callable[[List], bool], Callable[[Iterable], bool], bindings)
|
|
81
87
|
assert unify(Callable[[int, _T], List[int]], Callable[[int, str], _U], bindings)
|
|
82
|
-
|
|
88
|
+
if sys.version_info >= (3, 9):
|
|
89
|
+
assert (
|
|
90
|
+
realize(Callable[[_U], _T], bindings)
|
|
91
|
+
== collections.abc.Callable[[List[int]], str]
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
assert realize(Callable[[_U], _T], bindings) == Callable[[List[int]], str]
|
|
83
95
|
|
|
84
96
|
|
|
85
97
|
def test_plain_callable():
|
|
@@ -131,7 +143,10 @@ class Pair(Generic[_U, _T]):
|
|
|
131
143
|
def test_bindings_from_type_arguments():
|
|
132
144
|
var_mapping = get_bindings_from_type_arguments(Pair[int, str])
|
|
133
145
|
assert var_mapping == {_U: int, _T: str}
|
|
134
|
-
|
|
146
|
+
if sys.version_info >= (3, 9):
|
|
147
|
+
assert realize(List[_U], var_mapping) == list[int]
|
|
148
|
+
else:
|
|
149
|
+
assert realize(List[_U], var_mapping) == List[int]
|
|
135
150
|
|
|
136
151
|
|
|
137
152
|
def test_intersect_signatures_basic():
|
|
@@ -24,7 +24,7 @@ def extract_linenums(text: str) -> List[int]:
|
|
|
24
24
|
|
|
25
25
|
def find_examples() -> Iterable[Path]:
|
|
26
26
|
examples_dir = pathlib.Path(os.path.realpath(__file__)).parent
|
|
27
|
-
for path in sorted(examples_dir.glob("
|
|
27
|
+
for path in sorted(examples_dir.glob("*/**/*.py")):
|
|
28
28
|
if path.stem != "__init__":
|
|
29
29
|
yield path
|
|
30
30
|
|
crosshair/main.py
CHANGED
|
@@ -860,16 +860,24 @@ def check(
|
|
|
860
860
|
if isinstance(entities, int):
|
|
861
861
|
return entities
|
|
862
862
|
full_options = DEFAULT_OPTIONS.overlay(report_verbose=False).overlay(options)
|
|
863
|
-
for
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
863
|
+
checkables = [c for e in entities for c in analyze_any(e, options)]
|
|
864
|
+
if not checkables:
|
|
865
|
+
extra_help = ""
|
|
866
|
+
if full_options.analysis_kind == [AnalysisKind.asserts]:
|
|
867
|
+
extra_help = "\nHINT: Ensure that your functions to analyze lead with assert statements."
|
|
868
|
+
print(
|
|
869
|
+
"WARNING: Targets found, but contain no checkable functions." + extra_help,
|
|
870
|
+
file=stderr,
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
for message in run_checkables(checkables):
|
|
874
|
+
line = describe_message(message, full_options)
|
|
875
|
+
if line is None:
|
|
876
|
+
continue
|
|
877
|
+
stdout.write(line + "\n")
|
|
878
|
+
debug("Traceback for output message:\n", message.traceback)
|
|
879
|
+
if message.state > MessageType.PRE_UNSAT:
|
|
880
|
+
any_problems = True
|
|
873
881
|
return 1 if any_problems else 0
|
|
874
882
|
|
|
875
883
|
|
crosshair/main_test.py
CHANGED
|
@@ -251,19 +251,28 @@ def test_no_args_prints_usage(root):
|
|
|
251
251
|
assert re.search(r"^usage", out)
|
|
252
252
|
|
|
253
253
|
|
|
254
|
-
def
|
|
254
|
+
def test_assert_mode_e2e(root, capsys: pytest.CaptureFixture[str]):
|
|
255
255
|
simplefs(root, ASSERT_BASED_FOO)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
finally:
|
|
260
|
-
out = sys.stdout.getvalue()
|
|
261
|
-
sys.stdout = sys.__stdout__
|
|
262
|
-
assert exitcode == 1
|
|
256
|
+
exitcode = unwalled_main(["check", str(root / "foo.py"), "--analysis_kind=asserts"])
|
|
257
|
+
(out, err) = capsys.readouterr()
|
|
258
|
+
assert err == ""
|
|
263
259
|
assert re.search(
|
|
264
|
-
r"foo.py\:8\: error\: AssertionError\: when calling foofn\(
|
|
260
|
+
r"foo.py\:8\: error\: AssertionError\: when calling foofn\(100\)", out
|
|
265
261
|
)
|
|
266
262
|
assert len([ls for ls in out.split("\n") if ls]) == 1
|
|
263
|
+
assert exitcode == 1
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def test_assert_without_checkable(root, capsys: pytest.CaptureFixture[str]):
|
|
267
|
+
simplefs(root, SIMPLE_FOO)
|
|
268
|
+
exitcode = unwalled_main(["check", str(root / "foo.py"), "--analysis_kind=asserts"])
|
|
269
|
+
(out, err) = capsys.readouterr()
|
|
270
|
+
assert (
|
|
271
|
+
err
|
|
272
|
+
== "WARNING: Targets found, but contain no checkable functions.\nHINT: Ensure that your functions to analyze lead with assert statements.\n"
|
|
273
|
+
)
|
|
274
|
+
assert out == ""
|
|
275
|
+
assert exitcode == 0
|
|
267
276
|
|
|
268
277
|
|
|
269
278
|
def test_directives(root):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
_crosshair_tracers.cpython-312-darwin.so,sha256=
|
|
1
|
+
_crosshair_tracers.cpython-312-darwin.so,sha256=cMilaMmBt6Ot_3dRd4Be2AMBOvRTelNqfBFlXY5XCNY,57768
|
|
2
2
|
crosshair/_tracers_pycompat.h,sha256=6IYnbQxrYkhBsLDAHSX25DPOwo1oYHCZUVWZ8c7YCnQ,14356
|
|
3
3
|
crosshair/pure_importer.py,sha256=-t4eowrZOQmfqK1N2tjI5POoaxRGavytwMmbRivelFg,878
|
|
4
4
|
crosshair/options.py,sha256=htQNgnrpoRjSNq6rfLBAF8nos-NNIwmP6tQYyI8ugsM,6775
|
|
@@ -9,12 +9,12 @@ crosshair/objectproxy.py,sha256=Uc6mNkJBInvETGWBHI10GSNEIrBYDIxlAZ30M3PAIhQ,8935
|
|
|
9
9
|
crosshair/objectproxy_test.py,sha256=KykRJLSHCDA7jb_XPBDhXHnS6Q1fG4oIJ579CeSEz3k,567
|
|
10
10
|
crosshair/stubs_parser.py,sha256=rlBTQus5BlZ3Ygg6Xzk5dbQbDtRpv6w9i2HQmGrPVmc,14240
|
|
11
11
|
crosshair/_preliminaries_test.py,sha256=r2PohNNMfIkDqsnvI6gKlJTbwBaZA9NQJueQfJMN2Eo,504
|
|
12
|
-
crosshair/dynamic_typing_test.py,sha256=
|
|
12
|
+
crosshair/dynamic_typing_test.py,sha256=8p4NOJ6i9q9mozgCYlZP3VCs-TFMDaE_7W-TyNEse4o,5907
|
|
13
13
|
crosshair/enforce.py,sha256=FsZx3D-KtGrhb8xdAZbPUtwvVmEu8IAn7rwf7tmkrRY,10010
|
|
14
14
|
crosshair/path_search_test.py,sha256=7cqzAMXUYAtA00mq9XR5AaZChqeQyXyCfuuv53_51pk,1692
|
|
15
15
|
crosshair/condition_parser.py,sha256=oquaht026eZUigh2lyaFLXYDbmENdBKjddszx0a-B3w,42647
|
|
16
16
|
crosshair/util.py,sha256=sIfaKFvNHR5w5VCno2d15d_LyfwoewKqRzJ_3ZNV-Vc,22218
|
|
17
|
-
crosshair/dynamic_typing.py,sha256=
|
|
17
|
+
crosshair/dynamic_typing.py,sha256=ANq42kxSQ5B0STZF3uwOEys_fLCj20cMCCcBH6dbXWo,12758
|
|
18
18
|
crosshair/register_contract.py,sha256=EnDAxngJhKvJLFdw5kVgqaYDQ5hAZXKwAGBdXpot-AQ,10386
|
|
19
19
|
crosshair/tracers.py,sha256=_jaSDgZ_pYdqacWE_msXn7W7CoSdQ_-7hlrxa891oHo,17139
|
|
20
20
|
crosshair/_tracers.h,sha256=QFBklLqMWmIpUzBIn_A4SKdpjwHs-N7ttx-F5jtWWCQ,2174
|
|
@@ -23,12 +23,12 @@ crosshair/fnutil.py,sha256=X80bD2Lh4QAh-rF561r3JRxjxcuZepF3hJaxaj1GG9s,13123
|
|
|
23
23
|
crosshair/unicode_categories.py,sha256=g4pnUPanx8KkpwI06ZUGx8GR8Myruf_EpTjyti_V4z8,333519
|
|
24
24
|
crosshair/copyext.py,sha256=GBGQP9YAHoezLXwb_M59Hh1VXSou5EQt4ZmmUA0T_og,4899
|
|
25
25
|
crosshair/_tracers_test.py,sha256=KpCGspjOUeZuhwTYgn_RxI4M4wMbT5rldusFDgneQ6M,3596
|
|
26
|
-
crosshair/__init__.py,sha256=
|
|
27
|
-
crosshair/core.py,sha256=
|
|
26
|
+
crosshair/__init__.py,sha256=5u1xF74Cj90mIqU71fUSrQIoexYRT3mwC7WOse0f2EQ,936
|
|
27
|
+
crosshair/core.py,sha256=7CHbmWvCVK2MlKXJUUe3eILPWGZniF8qXkBJNDkU4qg,64168
|
|
28
28
|
crosshair/path_cover.py,sha256=wV0Vy8IPDzqXQ2VI8a94FxltS9p-Y1oF17OKePjvpgs,6710
|
|
29
29
|
crosshair/enforce_test.py,sha256=C6CQ4P1FjkdIJeJg3aJynp1iLDCE6BFCEVtSqXbvmQk,4665
|
|
30
30
|
crosshair/test_util.py,sha256=D9-f-DdzJemfAUkQL0cwKxPL8RZ-5gkVmghyRcKlBJI,10367
|
|
31
|
-
crosshair/core_test.py,sha256=
|
|
31
|
+
crosshair/core_test.py,sha256=540ASl3zOQf3AnZORGJus4PMYHP5YM15zTWhNI16Dew,33009
|
|
32
32
|
crosshair/codeconfig.py,sha256=GgF-ND8Ha3FysSTQ-JuezHjlhGVBbo5aCJov1Ps3VSE,3959
|
|
33
33
|
crosshair/util_test.py,sha256=_KTQ0O4cLhF1pAeB8Y8Cyqbd0UyZf5KxJUaiA-ew-tE,4676
|
|
34
34
|
crosshair/watcher_test.py,sha256=Ef1YSwy68wWPR5nPjwvEKPqxltI9pE9lTbnesmDy3Bk,2764
|
|
@@ -55,7 +55,7 @@ crosshair/smtlib_test.py,sha256=edzEn19u2YYHxSzG9RrMiu2HTiEexAuehC3IlG9LuJM,511
|
|
|
55
55
|
crosshair/register_contract_test.py,sha256=DhvKIcF3LgQfHfUSCccoA11ctCdFaQR263Pc4YUuxyk,4970
|
|
56
56
|
crosshair/statespace.py,sha256=TVjUhFZU0x72oLPN7-eRu7PoMh1OiQOy0uMASsFb_Qw,41236
|
|
57
57
|
crosshair/opcode_intercept_test.py,sha256=Si3rJQR5cs5d4uB8uwE2K8MjP8rE1a4yHkjXzhfS10A,9241
|
|
58
|
-
crosshair/main_test.py,sha256=
|
|
58
|
+
crosshair/main_test.py,sha256=2xpgNqog__XcYffGcwPeEEmr0Vy4EgVZE8GCAjQnE8U,14834
|
|
59
59
|
crosshair/codeconfig_test.py,sha256=RnC-RnNpr6If4eHmOepDZ33MCmfyhup08dzHKCm5xWA,3350
|
|
60
60
|
crosshair/watcher.py,sha256=kCCMlLe2KhW5MbEbMmixNRjRAvu5CypIAGd1V_YZ9QM,10048
|
|
61
61
|
crosshair/test_util_test.py,sha256=_r8DtAI5b1Yn1ruv9o51FWHmARII3-WDkWWnnY1iaAw,943
|
|
@@ -63,7 +63,7 @@ crosshair/opcode_intercept.py,sha256=z4Yb9prYE2UK21AxhjAeXyXAk5IriDuCSSCeNhbDu2A
|
|
|
63
63
|
crosshair/simplestructs.py,sha256=CiZSuHH_j_bYitaW-n7vWd_42xSyV6Jh8es3BQLlcHk,34221
|
|
64
64
|
crosshair/tracers_test.py,sha256=EBK_ZCy2MsxqmEaGjo0uw9zAztW9O6fhCW_0PJxyTS8,3270
|
|
65
65
|
crosshair/smtlib.py,sha256=hh-P32KHoH9BCq3oDYGp2PfOeOb8CwDj8tTkgqroLD8,689
|
|
66
|
-
crosshair/main.py,sha256=
|
|
66
|
+
crosshair/main.py,sha256=TkaOr39tMV9ZHQXgfJobKFEVW60XpHUqdY520nMIWw8,34659
|
|
67
67
|
crosshair/path_cover_test.py,sha256=U46zw4-m7yAXhu8-3Xnhvf-_9Ov5ivfCAm5euGwpRFA,4089
|
|
68
68
|
crosshair/__main__.py,sha256=zw9Ylf8v2fGocE57o4FqvD0lc7U4Ld2GbeCGxRWrpqo,252
|
|
69
69
|
crosshair/pathing_oracle.py,sha256=3M93zXMorWr8m5c1KM2zGU5X1M3lcV-AIw0lX74eN00,9219
|
|
@@ -76,7 +76,7 @@ crosshair/tools/check_help_in_doc.py,sha256=P21AH3mYrTVuBgWD6v65YXqBqmqpQDUTQeoZ
|
|
|
76
76
|
crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
77
|
crosshair/tools/check_init_and_setup_coincide.py,sha256=kv61bXqKSKF_5J-kLNEhCrCPyszg7iZQWDu_Scnec98,3502
|
|
78
78
|
crosshair/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
79
|
-
crosshair/examples/check_examples_test.py,sha256=
|
|
79
|
+
crosshair/examples/check_examples_test.py,sha256=pFZRUi_yubIOaIZ_n7KkrG_qCKyHZnzcL5_y0NFqZKM,4062
|
|
80
80
|
crosshair/examples/deal/__init__.py,sha256=Jp9ZnHBCuRzkgP8OIgEWWOzQiC0jLIYPd-rCqF5Xyrg,32
|
|
81
81
|
crosshair/examples/PEP316/__init__.py,sha256=LdmvJx2cbzC3iip3NwtT0Ds2v99l3KXl1q9Kc0TmCWE,34
|
|
82
82
|
crosshair/examples/PEP316/correct_code/chess.py,sha256=w29qVe-1oKMaHgZYhqyp2vQghXm2oohruFENljoVBCY,2081
|
|
@@ -167,9 +167,9 @@ crosshair/libimpl/encodings/ascii.py,sha256=Cz1xraTkXdQ5aBKDkorX4rAvrmf877_EqzC9
|
|
|
167
167
|
crosshair/libimpl/encodings/__init__.py,sha256=5LTEj1M-S00eZ4rfQWczAixg57vyh_9vZ5m5EKB5Ksc,680
|
|
168
168
|
crosshair/libimpl/encodings/latin_1.py,sha256=ftUsPjUb9L7UKXKi9P7OAqOl9FkNP98M9jMAvseXBCQ,1242
|
|
169
169
|
crosshair/libimpl/encodings/_encutil.py,sha256=nwVWqcGM1f7-hAC3Z46KnfrLzAjhfy4zaTa11uVBk6M,6828
|
|
170
|
-
crosshair_tool-0.0.
|
|
171
|
-
crosshair_tool-0.0.
|
|
172
|
-
crosshair_tool-0.0.
|
|
173
|
-
crosshair_tool-0.0.
|
|
174
|
-
crosshair_tool-0.0.
|
|
175
|
-
crosshair_tool-0.0.
|
|
170
|
+
crosshair_tool-0.0.94.dist-info/RECORD,,
|
|
171
|
+
crosshair_tool-0.0.94.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
|
|
172
|
+
crosshair_tool-0.0.94.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
|
|
173
|
+
crosshair_tool-0.0.94.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
|
|
174
|
+
crosshair_tool-0.0.94.dist-info/METADATA,sha256=9HsWHsF3h7uXHcGzU3_HwaWWtHHRj-Ac6UbGXFL26DQ,6777
|
|
175
|
+
crosshair_tool-0.0.94.dist-info/licenses/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|