From 9d2476b5ebb3f80a33cc777e9b7fa560587a98ad Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:09:18 -0500 Subject: [PATCH 01/26] Create README.md --- README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..8589af6 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ + +# tra-data-analysis + +To facilitate data analysis of collected scouting data in a user firendly tool, we created the data-analysis application. At its core it uses the tra-analysis package to conduct any number of user selected tests on data collected from the TRA scouting app. It uploads these tests back to MongoDB where it can be viewed from the app at any time. + +The data-analysis application also uses the TRA API to interface with MongoDB and uses the TBA API to collect additional data (match win/loss). + +The application can be configured with a configuration tool or by editing the config.json directly. + +## Prerequisites + +--- + +Before installing and using data-analysis, make sure that you have installed the folowing prerequisites: +- A common operating system like **Windows** or (*most*) distributions of **Linux**. BSD may work but has not been tested nor is it reccomended. +- [Python](https://www.python.org/) version **3.6** or higher +- [Pip](https://pip.pypa.io/en/stable/) (installation instructions [here](https://pip.pypa.io/en/stable/installing/)) + +## Installing Requirements + +--- + +Once navigated to the data-analysis folder run `pip install -r requirements.txt` to install all of the required python libraries. + +## Scripts + +--- + +The data-analysis application is a collection of various scripts and one config file. For users, only the main application `superscript.py` and the config file `config.json` are important. + +To run the data-analysis application, navigate to the data-analysis folder once all requirements have been installed and run `python superscript.py`. If you encounter the error: + +`pymongo.errors.ConfigurationError: Empty host (or extra comma in host list).` + +Don't worry, you may have just not configured the application correctly, but would otherwise work. Refer to [the documentation](https://titanscouting.github.io/analysis/data_analysis/Config) to learn how to configure data-analysis. + +# Contributing + +Read our included contributing guidelines (`CONTRIBUTING.md`) for more information and feel free to reach out to any current maintainer for more information. + +# Build Statuses + +Coming soon! From 991751a3408fd7f9a80d9847c3c00e321230e4ab Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:10:14 -0500 Subject: [PATCH 02/26] Create CONTRIBUTING.md --- CONTRIBUTING.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4e220db --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,66 @@ +# Contributing Guidelines + +This project accept contributions via GitHub pull requests. +This document outlines some of the +conventions on development workflow, commit message formatting, contact points, +and other resources to make it easier to get your contribution accepted. + +## Certificate of Origin + +By contributing to this project, you agree to the [Developer Certificate of +Origin (DCO)](https://developercertificate.org/). This document was created by the Linux Kernel community and is a +simple statement that you, as a contributor, have the legal right to make the +contribution. + +In order to show your agreement with the DCO you should include at the end of the commit message, +the following line: `Signed-off-by: John Doe `, using your real name. + +This can be done easily using the [`-s`](https://github.com/git/git/blob/b2c150d3aa82f6583b9aadfecc5f8fa1c74aca09/Documentation/git-commit.txt#L154-L161) flag on the `git commit`. + +Visual Studio code also has a flag to enable signoff on commits + +If you find yourself pushed a few commits without `Signed-off-by`, you can still add it afterwards. Read this for help: [fix-DCO.md](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md). + +## Support Channels + +The official support channel, for both users and contributors, is: + +- GitHub issues: each repository has its own list of issues. + +*Before opening a new issue or submitting a new pull request, it's helpful to +search the project - it's likely that another user has already reported the +issue you're facing, or it's a known issue that we're already aware of. + + +## How to Contribute +In general, please use conventional approaches to development and contribution such as: +* Create branches for additions or deletions, and or side projects +* Do not commit to master! +* Use Pull Requests (PRs) to indicate that an addition is ready to merge. +PRs are the main and exclusive way to contribute code to source{d} projects. +In order for a PR to be accepted it needs to pass this list of requirements: + +- The contribution must be correctly explained with natural language and providing a minimum working example that reproduces it. +- All PRs must be written idiomaticly: + - for Node: formatted according to [AirBnB standards](https://github.com/airbnb/javascript), and no warnings from `eslint` using the AirBnB style guide + - for other languages, similar constraints apply. +- They should in general include tests, and those shall pass. + - In any case, all the PRs have to pass the personal evaluation of at least one of the [maintainers](MAINTAINERS) of the project. + + +### Format of the commit message + +Every commit message should describe what was changed, under which context and, if applicable, the issue it relates to (mentioning a GitHub issue number when applicable): + +For small changes, or changes to a testing or personal branch, the commit message should be a short changelog entry + +For larger changes or for changes on branches that are more widely used, the commit message should simply reference an entry to some other changelog system. It is encouraged to use some sort of versioning system to log changes. Example commit messages: +``` +superscript.py v 2.0.5.006 +``` + +The format can be described more formally as follows: + +``` + v +``` From 9287d98fe2c592e231b790d7f48dd7fd09462fee Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:10:50 -0500 Subject: [PATCH 03/26] Create LICENSE --- LICENSE | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b348082 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021, Titan Scouting +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 2b896db9a9f6dd32147881d157d006920742d551 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:11:22 -0500 Subject: [PATCH 04/26] Create MAINTAINERS --- MAINTAINERS | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 MAINTAINERS diff --git a/MAINTAINERS b/MAINTAINERS new file mode 100644 index 0000000..60e7196 --- /dev/null +++ b/MAINTAINERS @@ -0,0 +1,3 @@ +Arthur Lu +Jacob Levine +Dev Singh From 79cde441087eefced3fb07c471aaed170102dac4 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:11:38 -0500 Subject: [PATCH 05/26] Create SECURITY.md --- SECURITY.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..7754343 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,6 @@ +# Security Policy + + +## Reporting a Vulnerability + +Please email `titanscout2022@gmail.com` to report a vulnerability. From 960a1b3165b2eebccb0a47696f840c79f078bbb6 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 1 Apr 2021 13:38:53 -0500 Subject: [PATCH 06/26] fix ut and file structure --- .../{ut-superscript.yml => superscript-unit.yml} | 8 ++------ {src => test}/test_superscript.py | 0 2 files changed, 2 insertions(+), 6 deletions(-) rename .github/workflows/{ut-superscript.yml => superscript-unit.yml} (76%) rename {src => test}/test_superscript.py (100%) diff --git a/.github/workflows/ut-superscript.yml b/.github/workflows/superscript-unit.yml similarity index 76% rename from .github/workflows/ut-superscript.yml rename to .github/workflows/superscript-unit.yml index fcd2b69..3a4e4c5 100644 --- a/.github/workflows/ut-superscript.yml +++ b/.github/workflows/superscript-unit.yml @@ -17,8 +17,6 @@ jobs: matrix: python-version: [3.7, 3.8] - env: - working-directory: ./data-analysis/ steps: - uses: actions/checkout@v2 @@ -30,9 +28,7 @@ jobs: run: | python -m pip install --upgrade pip pip install pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - working-directory: ${{ env.working-directory }} + if [ -f src/requirements.txt ]; then pip install -r src/requirements.txt; fi - name: Test with pytest run: | - pytest - working-directory: ${{ env.working-directory }} + pytest test/ diff --git a/src/test_superscript.py b/test/test_superscript.py similarity index 100% rename from src/test_superscript.py rename to test/test_superscript.py From 79689d69c86631c076eb44f64129bb6889e9c7d1 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 2 Apr 2021 01:28:25 +0000 Subject: [PATCH 07/26] fixed spelling in default config, added config to git ignore --- .gitignore | 3 ++- src/config.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6c766f6..dbe53f9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ **/build/ **/*.egg-info/ -**/dist/ \ No newline at end of file +**/dist/ +**/config.json \ No newline at end of file diff --git a/src/config.json b/src/config.json index 0c58fe4..b94d399 100644 --- a/src/config.json +++ b/src/config.json @@ -46,7 +46,7 @@ ], "balls-started": [ "basic_stats", - "historical_analyss", + "historical_analysis", "regression_linear", "regression_logarithmic", "regression_exponential", From 18dbc174bd409137a235c1858d241dc592d1d308 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 2 Apr 2021 21:35:05 +0000 Subject: [PATCH 08/26] deleted config.json changed superscript config lookup to relative path added additional requirements to requirements.txt added build spec file for superscript --- .devcontainer/Dockerfile | 9 ++- .devcontainer/dev-dockerfile | 2 + .devcontainer/devcontainer.json | 6 +- src/config.json | 101 ------------------------------- src/requirements.txt | 14 +++++ src/superscript.py | 102 ++++++++++++++++---------------- src/superscript.spec | 37 ++++++++++++ 7 files changed, 114 insertions(+), 157 deletions(-) create mode 100644 .devcontainer/dev-dockerfile delete mode 100644 src/config.json create mode 100644 src/superscript.spec diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 364066e..160a9b9 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,2 +1,7 @@ -FROM python -WORKDIR ~/ +FROM ubuntu:20.04 +WORKDIR / +RUN apt-get -y update +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata +RUN apt-get install -y python3 python3-dev git python3-pip python3-kivy python-is-python3 libgl1-mesa-dev build-essential +RUN ln -s $(which pip3) /usr/bin/pip +RUN pip install pymongo pandas numpy scipy scikit-learn matplotlib pylint kivy \ No newline at end of file diff --git a/.devcontainer/dev-dockerfile b/.devcontainer/dev-dockerfile new file mode 100644 index 0000000..74659d4 --- /dev/null +++ b/.devcontainer/dev-dockerfile @@ -0,0 +1,2 @@ +FROM titanscout2022/tra-analysis-base:latest +WORKDIR / \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a14a6fb..824072f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,7 @@ { "name": "TRA Analysis Development Environment", "build": { - "dockerfile": "Dockerfile", + "dockerfile": "dev-dockerfile", }, "settings": { "terminal.integrated.shell.linux": "/bin/bash", @@ -24,5 +24,5 @@ "ms-python.python", "waderyan.gitblame" ], - "postCreateCommand": "apt install vim -y ; pip install -r src/requirements.txt ; pip install pylint ; pip install tra-analysis; pip install pytest" -} \ No newline at end of file + "postCreateCommand": "/usr/bin/pip3 install -r /workspaces/tra-data-analysis/src/requirements.txt && /usr/bin/pip3 install --no-cache-dir pylint && /usr/bin/pip3 install pytest" + } \ No newline at end of file diff --git a/src/config.json b/src/config.json deleted file mode 100644 index b94d399..0000000 --- a/src/config.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "max-threads": 0.5, - "team": "", - "competition": "", - "key": { - "database": "", - "tba": "" - }, - "statistics": { - "match": { - "balls-blocked": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-collected": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-lower-teleop": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-lower-auto": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-started": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-upper-teleop": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ], - "balls-upper-auto": [ - "basic_stats", - "historical_analysis", - "regression_linear", - "regression_logarithmic", - "regression_exponential", - "regression_polynomial", - "regression_sigmoidal" - ] - }, - "metric": { - "elo": { - "score": 1500, - "N": 400, - "K": 24 - }, - "gl2": { - "score": 1500, - "rd": 250, - "vol": 0.06 - }, - "ts": { - "mu": 25, - "sigma": 8.33 - } - }, - "pit": { - "wheel-mechanism": true, - "low-balls": true, - "high-balls": true, - "wheel-success": true, - "strategic-focus": true, - "climb-mechanism": true, - "attitude": true - } - } -} \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt index f95ca14..a8f7063 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,4 +2,18 @@ requests pymongo pandas tra-analysis + +dnspython +pyinstaller +requests +pymongo + +numpy +scipy +scikit-learn +six +matplotlib +pyparsing +pandas + kivy==2.0.0rc2 \ No newline at end of file diff --git a/src/superscript.py b/src/superscript.py index 4c147de..1f4b511 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -143,67 +143,67 @@ def main(): warnings.filterwarnings("ignore") -# while (True): + while (True): - current_time = time.time() - print("[OK] time: " + str(current_time)) + current_time = time.time() + print("[OK] time: " + str(current_time)) - config = load_config("red-alliance-analysis\data-analysis\config.json") - competition = config["competition"] - match_tests = config["statistics"]["match"] - pit_tests = config["statistics"]["pit"] - metrics_tests = config["statistics"]["metric"] - print("[OK] configs loaded") + config = load_config("config.json") + competition = config["competition"] + match_tests = config["statistics"]["match"] + pit_tests = config["statistics"]["pit"] + metrics_tests = config["statistics"]["metric"] + print("[OK] configs loaded") - print("[OK] starting threads") - cfg_max_threads = config["max-threads"] - sys_max_threads = os.cpu_count() - if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : - alloc_processes = sys_max_threads + cfg_max_threads - elif cfg_max_threads > 0 and cfg_max_threads < 1: - alloc_processes = math.floor(cfg_max_threads * sys_max_threads) - elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: - alloc_processes = cfg_max_threads - elif cfg_max_threads == 0: - alloc_processes = sys_max_threads - else: - print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) - exit() - # exec_threads = Pool(processes = alloc_processes) - # print("[OK] " + str(alloc_processes) + " threads started") + print("[OK] starting threads") + cfg_max_threads = config["max-threads"] + sys_max_threads = os.cpu_count() + if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : + alloc_processes = sys_max_threads + cfg_max_threads + elif cfg_max_threads > 0 and cfg_max_threads < 1: + alloc_processes = math.floor(cfg_max_threads * sys_max_threads) + elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: + alloc_processes = cfg_max_threads + elif cfg_max_threads == 0: + alloc_processes = sys_max_threads + else: + print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) + exit() + exec_threads = Pool(processes = alloc_processes) + print("[OK] " + str(alloc_processes) + " threads started") - apikey = config["key"]["database"] - tbakey = config["key"]["tba"] - print("[OK] loaded keys") + apikey = config["key"]["database"] + tbakey = config["key"]["tba"] + print("[OK] loaded keys") - previous_time = get_previous_time(apikey) - print("[OK] analysis backtimed to: " + str(previous_time)) + previous_time = get_previous_time(apikey) + print("[OK] analysis backtimed to: " + str(previous_time)) - print("[OK] loading data") - start = time.time() - match_data = load_match(apikey, competition) - pit_data = load_pit(apikey, competition) - print("[OK] loaded data in " + str(time.time() - start) + " seconds") + print("[OK] loading data") + start = time.time() + match_data = load_match(apikey, competition) + pit_data = load_pit(apikey, competition) + print("[OK] loaded data in " + str(time.time() - start) + " seconds") - print("[OK] running match stats") - start = time.time() - matchloop(apikey, competition, match_data, match_tests) - print("[OK] finished match stats in " + str(time.time() - start) + " seconds") + print("[OK] running match stats") + start = time.time() + matchloop(apikey, competition, match_data, match_tests) + print("[OK] finished match stats in " + str(time.time() - start) + " seconds") - print("[OK] running team metrics") - start = time.time() - metricloop(tbakey, apikey, competition, previous_time, metrics_tests) - print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") + print("[OK] running team metrics") + start = time.time() + metricloop(tbakey, apikey, competition, previous_time, metrics_tests) + print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") - print("[OK] running pit analysis") - start = time.time() - pitloop(apikey, competition, pit_data, pit_tests) - print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") - - set_current_time(apikey, current_time) - print("[OK] finished all tests, looping") + print("[OK] running pit analysis") + start = time.time() + pitloop(apikey, competition, pit_data, pit_tests) + print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") + + set_current_time(apikey, current_time) + print("[OK] finished all tests, looping") - # clear() + # clear() def clear(): diff --git a/src/superscript.spec b/src/superscript.spec new file mode 100644 index 0000000..b9f9ca7 --- /dev/null +++ b/src/superscript.spec @@ -0,0 +1,37 @@ +# -*- mode: python ; coding: utf-8 -*- + +block_cipher = None + + +a = Analysis(['superscript.py'], + pathex=['/workspaces/tra-data-analysis/src'], + binaries=[], + datas=[], + hiddenimports=[ + "dnspython", + "sklearn.utils._weight_vector", + "requests", + ], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='superscript', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True ) From 99e28f5e83d80b45fc5d140c51da5223403263bb Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 2 Apr 2021 21:58:35 +0000 Subject: [PATCH 09/26] fixed .gitignore added build-CLI script fixed threading in superscript --- .gitignore | 2 -- build/build-CLI.sh | 5 +++++ src/superscript.py | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 build/build-CLI.sh diff --git a/.gitignore b/.gitignore index dbe53f9..325f585 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,5 @@ **/.pytest_cache/ **/*.pyc -**/build/ **/*.egg-info/ -**/dist/ **/config.json \ No newline at end of file diff --git a/build/build-CLI.sh b/build/build-CLI.sh new file mode 100644 index 0000000..8d8a0b8 --- /dev/null +++ b/build/build-CLI.sh @@ -0,0 +1,5 @@ +pathtospec="../src/superscript.spec" +pathtodist="../dist/" +pathtowork="/temp/" + +pyinstaller --onefile --clean --distpath ${pathtodist} --workpath ${pathtowork} ${pathtospec} \ No newline at end of file diff --git a/src/superscript.py b/src/superscript.py index 1f4b511..4c80206 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -135,11 +135,11 @@ from concurrent.futures import ThreadPoolExecutor import time import warnings -# global exec_threads +global exec_threads def main(): - # global exec_threads + global exec_threads warnings.filterwarnings("ignore") @@ -203,7 +203,7 @@ def main(): set_current_time(apikey, current_time) print("[OK] finished all tests, looping") - # clear() + #clear() def clear(): @@ -314,7 +314,7 @@ def matchloop(apikey, competition, data, tests): # expects 3D array with [Team][ variable_data.append((data[team][variable], test)) test_filtered.append(test) - result_filtered = map(simplestats, variable_data) + result_filtered = exec_threads.map(simplestats, variable_data) i = 0 result_filtered = list(result_filtered) From d2f9c802b3721d9e363450997e8d4d0f250ad8b0 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 2 Apr 2021 22:04:06 +0000 Subject: [PATCH 10/26] built and verified threading fixes From 69c707689b0ee7b5cfd82ba29dc447b42d711b32 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sat, 3 Apr 2021 20:47:45 +0000 Subject: [PATCH 11/26] superscript v 0.8.3 --- .gitignore | 3 ++- src/superscript.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 325f585..c1d3443 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ **/*.pyc **/*.egg-info/ -**/config.json \ No newline at end of file +**/config.json +**/tra_analysis/ \ No newline at end of file diff --git a/src/superscript.py b/src/superscript.py index 4c80206..fbc8b99 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -3,10 +3,12 @@ # Notes: # setup: -__version__ = "0.8.2" +__version__ = "0.8.3" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 0.8.3: + - updated matchloop with new regression format (requires tra_analysis 3.x) 0.8.2: - readded while true to main function - added more thread config options @@ -284,6 +286,8 @@ def matchloop(apikey, competition, data, tests): # expects 3D array with [Team][ global exec_threads + short_mapping = {"regression_linear": "lin", "regression_logarithmic": "log", "regression_exponential": "exp", "regression_polynomial": "ply", "regression_sigmoidal": "sig"} + class AutoVivification(dict): def __getitem__(self, item): try: @@ -321,7 +325,13 @@ def matchloop(apikey, competition, data, tests): # expects 3D array with [Team][ for result in result_filtered: - return_vector[team_filtered[i]][variable_filtered[i]][test_filtered[i]] = result + filtered = test_filtered[i] + + try: + short = short_mapping[filtered] + return_vector[team_filtered[i]][variable_filtered[i]][test_filtered[i]] = result[short] + except KeyError: # not in mapping + return_vector[team_filtered[i]][variable_filtered[i]][test_filtered[i]] = result i += 1 push_match(apikey, competition, return_vector) From f211d00f2da59569edda6bfd21143d56ae1484b1 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 9 Apr 2021 23:45:16 +0000 Subject: [PATCH 12/26] superscript v 0.8.4 --- src/superscript.py | 92 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 4 deletions(-) diff --git a/src/superscript.py b/src/superscript.py index fbc8b99..6adaf6f 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -3,10 +3,14 @@ # Notes: # setup: -__version__ = "0.8.3" +__version__ = "0.8.4" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 0.84: + - added better error message for missing config.json + - added automatic config.json creation + - added splash text with version and system info 0.8.3: - updated matchloop with new regression format (requires tra_analysis 3.x) 0.8.2: @@ -132,6 +136,7 @@ import os from os import system, name from pathlib import Path from multiprocessing import Pool +import platform import matplotlib.pyplot as plt from concurrent.futures import ThreadPoolExecutor import time @@ -145,6 +150,8 @@ def main(): warnings.filterwarnings("ignore") + splash() + while (True): current_time = time.time() @@ -169,7 +176,7 @@ def main(): elif cfg_max_threads == 0: alloc_processes = sys_max_threads else: - print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) + print("[ERROR] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) exit() exec_threads = Pool(processes = alloc_processes) print("[OK] " + str(alloc_processes) + " threads started") @@ -205,6 +212,8 @@ def main(): set_current_time(apikey, current_time) print("[OK] finished all tests, looping") + print_hrule() + #clear() def clear(): @@ -217,11 +226,39 @@ def clear(): else: _ = system('clear') +def print_hrule(): + + print("#"+38*"-"+"#") + +def print_box(s): + + temp = "|" + temp += s + temp += (40-len(s)-2)*" " + temp += "|" + print(temp) + +def splash(): + + print_hrule() + print_box(" superscript version: " + __version__) + print_box(" os: " + platform.system()) + print_box(" python: " + platform.python_version()) + print_hrule() + def load_config(file): config_vector = {} - with open(file) as f: - config_vector = json.load(f) + + try: + f = open(file) + except: + print("[ERROR] could not locate config.json, generating blank config.json and exiting") + f = open(file, "w") + f.write(sample_json) + exit() + + config_vector = json.load(f) return config_vector @@ -543,4 +580,51 @@ def graph_pit_histogram(apikey, competition, figsize=(80,15)): plt.show() +sample_json = """{ + "max-threads": 0.5, + "team": "", + "competition": "2020ilch", + "key":{ + "database":"", + "tba":"" + }, + "statistics":{ + "match":{ + "balls-blocked":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-collected":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-lower-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-lower-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-started":["basic_stats","historical_analyss","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-upper-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], + "balls-upper-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"] + + }, + "metric":{ + "elo":{ + "score":1500, + "N":400, + "K":24 + }, + "gl2":{ + "score":1500, + "rd":250, + "vol":0.06 + }, + "ts":{ + "mu":25, + "sigma":8.33 + } + }, + "pit":{ + "wheel-mechanism":true, + "low-balls":true, + "high-balls":true, + "wheel-success":true, + "strategic-focus":true, + "climb-mechanism":true, + "attitude":true + } + } +}""" + main() \ No newline at end of file From d10c16d48340ca2f88c79a4e6636378494c7a95f Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sat, 10 Apr 2021 06:08:18 +0000 Subject: [PATCH 13/26] superscript v 0.8.5 --- .gitignore | 4 +- src/superscript.py | 119 ++++++++++++++++++++++++++------------------- 2 files changed, 71 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index c1d3443..edba599 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ **/*.egg-info/ **/config.json -**/tra_analysis/ \ No newline at end of file +**/tra_analysis/ + +**/errorlog.txt \ No newline at end of file diff --git a/src/superscript.py b/src/superscript.py index 6adaf6f..d93f7e0 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -3,11 +3,14 @@ # Notes: # setup: -__version__ = "0.8.4" +__version__ = "0.8.5" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: - 0.84: + 0.8.5: + - added more gradeful KeyboardInterrupt exiting + - redirected stderr to errorlog.txt + 0.8.4: - added better error message for missing config.json - added automatic config.json creation - added splash text with version and system info @@ -138,6 +141,7 @@ from pathlib import Path from multiprocessing import Pool import platform import matplotlib.pyplot as plt +import sys from concurrent.futures import ThreadPoolExecutor import time import warnings @@ -148,71 +152,84 @@ def main(): global exec_threads + sys.stderr = open("errorlog.txt", "w") + warnings.filterwarnings("ignore") splash() while (True): - current_time = time.time() - print("[OK] time: " + str(current_time)) + try: - config = load_config("config.json") - competition = config["competition"] - match_tests = config["statistics"]["match"] - pit_tests = config["statistics"]["pit"] - metrics_tests = config["statistics"]["metric"] - print("[OK] configs loaded") + current_time = time.time() + print("[OK] time: " + str(current_time)) - print("[OK] starting threads") - cfg_max_threads = config["max-threads"] - sys_max_threads = os.cpu_count() - if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : - alloc_processes = sys_max_threads + cfg_max_threads - elif cfg_max_threads > 0 and cfg_max_threads < 1: - alloc_processes = math.floor(cfg_max_threads * sys_max_threads) - elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: - alloc_processes = cfg_max_threads - elif cfg_max_threads == 0: - alloc_processes = sys_max_threads - else: - print("[ERROR] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) - exit() - exec_threads = Pool(processes = alloc_processes) - print("[OK] " + str(alloc_processes) + " threads started") + config = load_config("config.json") + competition = config["competition"] + match_tests = config["statistics"]["match"] + pit_tests = config["statistics"]["pit"] + metrics_tests = config["statistics"]["metric"] + print("[OK] configs loaded") - apikey = config["key"]["database"] - tbakey = config["key"]["tba"] - print("[OK] loaded keys") + print("[OK] starting threads") + cfg_max_threads = config["max-threads"] + sys_max_threads = os.cpu_count() + if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : + alloc_processes = sys_max_threads + cfg_max_threads + elif cfg_max_threads > 0 and cfg_max_threads < 1: + alloc_processes = math.floor(cfg_max_threads * sys_max_threads) + elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: + alloc_processes = cfg_max_threads + elif cfg_max_threads == 0: + alloc_processes = sys_max_threads + else: + print("[ERROR] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) + exit() + exec_threads = Pool(processes = alloc_processes) + print("[OK] " + str(alloc_processes) + " threads started") - previous_time = get_previous_time(apikey) - print("[OK] analysis backtimed to: " + str(previous_time)) + apikey = config["key"]["database"] + tbakey = config["key"]["tba"] + print("[OK] loaded keys") - print("[OK] loading data") - start = time.time() - match_data = load_match(apikey, competition) - pit_data = load_pit(apikey, competition) - print("[OK] loaded data in " + str(time.time() - start) + " seconds") + previous_time = get_previous_time(apikey) + print("[OK] analysis backtimed to: " + str(previous_time)) - print("[OK] running match stats") - start = time.time() - matchloop(apikey, competition, match_data, match_tests) - print("[OK] finished match stats in " + str(time.time() - start) + " seconds") + print("[OK] loading data") + start = time.time() + match_data = load_match(apikey, competition) + pit_data = load_pit(apikey, competition) + print("[OK] loaded data in " + str(time.time() - start) + " seconds") - print("[OK] running team metrics") - start = time.time() - metricloop(tbakey, apikey, competition, previous_time, metrics_tests) - print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") + print("[OK] running match stats") + start = time.time() + matchloop(apikey, competition, match_data, match_tests) + print("[OK] finished match stats in " + str(time.time() - start) + " seconds") - print("[OK] running pit analysis") - start = time.time() - pitloop(apikey, competition, pit_data, pit_tests) - print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") + print("[OK] running team metrics") + start = time.time() + metricloop(tbakey, apikey, competition, previous_time, metrics_tests) + print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") + + print("[OK] running pit analysis") + start = time.time() + pitloop(apikey, competition, pit_data, pit_tests) + print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") + + set_current_time(apikey, current_time) + print("[OK] finished all tests, looping") + + print_hrule() - set_current_time(apikey, current_time) - print("[OK] finished all tests, looping") + except KeyboardInterrupt: + print("\n[OK] caught KeyboardInterrupt, killing processes") + exec_threads.terminate() + print("[OK] processes killed, exiting") + exit() - print_hrule() + else: + pass #clear() From aa7d7ca927c40008b7d0cc20a97b5374741e19ce Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Mon, 12 Apr 2021 06:27:50 +0000 Subject: [PATCH 14/26] quick patch for devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 824072f..31f7e98 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -24,5 +24,5 @@ "ms-python.python", "waderyan.gitblame" ], - "postCreateCommand": "/usr/bin/pip3 install -r /workspaces/tra-data-analysis/src/requirements.txt && /usr/bin/pip3 install --no-cache-dir pylint && /usr/bin/pip3 install pytest" + "postCreateCommand": "/usr/bin/pip3 install -r /workspaces/tra-superscript/src/requirements.txt && /usr/bin/pip3 install --no-cache-dir pylint && /usr/bin/pip3 install pytest" } \ No newline at end of file From 224f64e8b7f7ffb776b598a86f4fe1e388e45803 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Mon, 12 Apr 2021 06:30:21 +0000 Subject: [PATCH 15/26] better fix for devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 31f7e98..c380475 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -24,5 +24,5 @@ "ms-python.python", "waderyan.gitblame" ], - "postCreateCommand": "/usr/bin/pip3 install -r /workspaces/tra-superscript/src/requirements.txt && /usr/bin/pip3 install --no-cache-dir pylint && /usr/bin/pip3 install pytest" + "postCreateCommand": "/usr/bin/pip3 install -r ${containerWorkspaceFolder}/src/requirements.txt && /usr/bin/pip3 install --no-cache-dir pylint && /usr/bin/pip3 install pytest" } \ No newline at end of file From 391d4e1996a5b2e6bdf35688fd9ec6eb316b422e Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Mon, 12 Apr 2021 14:39:00 -0700 Subject: [PATCH 16/26] created batch script for windows compilation --- build/build-CLI.bat | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 build/build-CLI.bat diff --git a/build/build-CLI.bat b/build/build-CLI.bat new file mode 100644 index 0000000..77790bb --- /dev/null +++ b/build/build-CLI.bat @@ -0,0 +1,5 @@ +set pathtospec="../src/superscript.spec" +set pathtodist="../dist/" +set pathtowork="/temp/" + +pyinstaller --onefile --clean --distpath %pathtodist% --workpath %pathtowork% %pathtospec% \ No newline at end of file From 30469a32111307de7db10f2bf4859d074f2b015e Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Mon, 12 Apr 2021 15:13:54 -0700 Subject: [PATCH 17/26] removed matplotlib import removed plotting pit analysis fixed warning supression for win exe superscript v 0.8.6 --- src/requirements.txt | 1 - src/superscript.py | 33 +++++++-------------------------- src/superscript.spec | 2 +- 3 files changed, 8 insertions(+), 28 deletions(-) diff --git a/src/requirements.txt b/src/requirements.txt index a8f7063..a3d30e7 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -12,7 +12,6 @@ numpy scipy scikit-learn six -matplotlib pyparsing pandas diff --git a/src/superscript.py b/src/superscript.py index d93f7e0..b408369 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -3,10 +3,12 @@ # Notes: # setup: -__version__ = "0.8.5" +__version__ = "0.8.6" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 0.8.6: + - added proper main function 0.8.5: - added more gradeful KeyboardInterrupt exiting - redirected stderr to errorlog.txt @@ -140,7 +142,6 @@ from os import system, name from pathlib import Path from multiprocessing import Pool import platform -import matplotlib.pyplot as plt import sys from concurrent.futures import ThreadPoolExecutor import time @@ -574,29 +575,6 @@ def get_team_metrics(apikey, tbakey, competition): return {"elo-ranks": elo_ranked, "glicko2-ranks": gl2_ranked} -def graph_pit_histogram(apikey, competition, figsize=(80,15)): - - pit = d.get_pit_variable_formatted(apikey, competition) - - fig, ax = plt.subplots(1, len(pit), sharey=True, figsize=figsize) - - i = 0 - - for variable in pit: - - ax[i].hist(pit[variable]) - ax[i].invert_xaxis() - - ax[i].set_xlabel('') - ax[i].set_ylabel('Frequency') - ax[i].set_title(variable) - - plt.yticks(np.arange(len(pit[variable]))) - - i+=1 - - plt.show() - sample_json = """{ "max-threads": 0.5, "team": "", @@ -644,4 +622,7 @@ sample_json = """{ } }""" -main() \ No newline at end of file +if __name__ == "__main__": + if sys.platform.startswith('win'): + multiprocessing.freeze_support() + main() \ No newline at end of file diff --git a/src/superscript.spec b/src/superscript.spec index b9f9ca7..5ffc4bf 100644 --- a/src/superscript.spec +++ b/src/superscript.spec @@ -26,7 +26,7 @@ exe = EXE(pyz, a.binaries, a.zipfiles, a.datas, - [], + [('W ignore', None, 'OPTION')], name='superscript', debug=False, bootloader_ignore_signals=False, From 2b0f718aa589c4c9f6242a808f9d2b659089adba Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Tue, 13 Apr 2021 04:03:07 +0000 Subject: [PATCH 18/26] removed compiled binaries added compiled binaries in /dist/ to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index edba599..616629e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ **/config.json **/tra_analysis/ -**/errorlog.txt \ No newline at end of file +**/errorlog.txt +/dist/superscript.* \ No newline at end of file From 8977f8c27772d13e39ac99ce93cb0f01c1dfe08c Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Tue, 13 Apr 2021 04:05:46 +0000 Subject: [PATCH 19/26] added compiled binaries with no file endings to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 616629e..6b1a37d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ **/tra_analysis/ **/errorlog.txt -/dist/superscript.* \ No newline at end of file +/dist/superscript.* +/dist/superscript \ No newline at end of file From 28e423942ff43ba57730c52ca7166e6a58cfcf27 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Thu, 15 Apr 2021 19:41:10 +0000 Subject: [PATCH 20/26] added .gitattributes --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..262f911 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# Auto detect text files and perform LF normalization +* text=auto eol=lf +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf \ No newline at end of file From f5a0e0fe8c5e9548689d24afc7ba772164c31fab Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sun, 25 Apr 2021 03:51:01 +0000 Subject: [PATCH 21/26] added sample build-cli workflow --- .github/workflows/build-cli.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/build-cli.yml diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml new file mode 100644 index 0000000..681ab31 --- /dev/null +++ b/.github/workflows/build-cli.yml @@ -0,0 +1,17 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Superscript Unit Tests + +on: + release: + types: [published, edited] + +jobs: + generate: + name: Build Linux + runs-on: ubuntu-latest + + steps: + - name: Checkout master + uses: actions/checkout@master From 99e722c4002b278c25a383db843db33d99369a65 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sun, 25 Apr 2021 06:05:33 +0000 Subject: [PATCH 22/26] removed ThreadPoolExecutor import --- src/superscript.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/superscript.py b/src/superscript.py index b408369..e912951 100644 --- a/src/superscript.py +++ b/src/superscript.py @@ -143,7 +143,6 @@ from pathlib import Path from multiprocessing import Pool import platform import sys -from concurrent.futures import ThreadPoolExecutor import time import warnings From 26079f3180f5715d4031aaa52d6c21ff63954dd0 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Tue, 27 Apr 2021 07:26:14 +0000 Subject: [PATCH 23/26] fixed pathing for build-CLI.* added temp directory to gitignore --- .gitignore | 1 + build/build-CLI.bat | 2 +- build/build-CLI.sh | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6b1a37d..0e3db09 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ **/*.egg-info/ **/config.json **/tra_analysis/ +**/temp/* **/errorlog.txt /dist/superscript.* diff --git a/build/build-CLI.bat b/build/build-CLI.bat index 77790bb..522e5fc 100644 --- a/build/build-CLI.bat +++ b/build/build-CLI.bat @@ -1,5 +1,5 @@ set pathtospec="../src/superscript.spec" set pathtodist="../dist/" -set pathtowork="/temp/" +set pathtowork="temp/" pyinstaller --onefile --clean --distpath %pathtodist% --workpath %pathtowork% %pathtospec% \ No newline at end of file diff --git a/build/build-CLI.sh b/build/build-CLI.sh index 8d8a0b8..9837f2a 100644 --- a/build/build-CLI.sh +++ b/build/build-CLI.sh @@ -1,5 +1,5 @@ pathtospec="../src/superscript.spec" pathtodist="../dist/" -pathtowork="/temp/" +pathtowork="temp/" pyinstaller --onefile --clean --distpath ${pathtodist} --workpath ${pathtowork} ${pathtospec} \ No newline at end of file From c415225afecc9f1ae7807038876d8b66d741c788 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Thu, 26 Aug 2021 18:11:25 -0700 Subject: [PATCH 24/26] Update release badge --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b864a3a..371be0c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscout2022/red-alliance-analysis) +# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscouting/tra-superscript) Titan Robotics 2022 Strategy Team Repository for Data Analysis Tools. Included with these tools are the backend data analysis engine formatted as a python package, associated binaries for the analysis package, and premade scripts that can be pulled directly from this repository and will integrate with other Red Alliance applications to quickly deploy FRC scouting tools. @@ -43,4 +43,4 @@ don't worry, you may have just not configured the application correctly, but wou # Build Statuses -Coming soon! \ No newline at end of file +Coming soon! From d56411253c42e59e7e2d062fbc51ee1373388b31 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Thu, 26 Aug 2021 18:20:11 -0700 Subject: [PATCH 25/26] fixed badge url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 371be0c..beee077 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscouting/tra-superscript) +# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscout2022/tra-superscript) Titan Robotics 2022 Strategy Team Repository for Data Analysis Tools. Included with these tools are the backend data analysis engine formatted as a python package, associated binaries for the analysis package, and premade scripts that can be pulled directly from this repository and will integrate with other Red Alliance applications to quickly deploy FRC scouting tools. From de4d3d4967fdc3b50b41341c055b10fe90719993 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 21 Oct 2021 14:21:20 -0500 Subject: [PATCH 26/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index beee077..371be0c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscout2022/tra-superscript) +# Red Alliance Analysis · ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscouting/tra-superscript) Titan Robotics 2022 Strategy Team Repository for Data Analysis Tools. Included with these tools are the backend data analysis engine formatted as a python package, associated binaries for the analysis package, and premade scripts that can be pulled directly from this repository and will integrate with other Red Alliance applications to quickly deploy FRC scouting tools.