{"id":15065023,"url":"https://github.com/scalarstop/scalarstop","last_synced_at":"2026-02-12T11:36:23.361Z","repository":{"id":42659353,"uuid":"353559839","full_name":"scalarstop/scalarstop","owner":"scalarstop","description":"A Python framework for managing machine learning experiments.","archived":false,"fork":false,"pushed_at":"2022-03-29T14:46:44.000Z","size":1914,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-28T08:35:07.867Z","etag":null,"topics":["keras","machine-learning","reproducibility","reproducible-research","tensorlfow"],"latest_commit_sha":null,"homepage":"https://scalarstop.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scalarstop.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-04-01T03:20:20.000Z","updated_at":"2021-12-01T05:00:51.000Z","dependencies_parsed_at":"2022-08-20T00:40:57.725Z","dependency_job_id":null,"html_url":"https://github.com/scalarstop/scalarstop","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/scalarstop/scalarstop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalarstop%2Fscalarstop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalarstop%2Fscalarstop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalarstop%2Fscalarstop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalarstop%2Fscalarstop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scalarstop","download_url":"https://codeload.github.com/scalarstop/scalarstop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalarstop%2Fscalarstop/sbom","scorecard":{"id":803267,"data":{"date":"2025-08-11","repo":{"name":"github.com/scalarstop/scalarstop","commit":"a407bc33242a7d8aa42d634072b3085b36f2a651"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-mac.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-mac.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-mac.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-ubuntu.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-ubuntu.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-ubuntu.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-ubuntu.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-ubuntu.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-ubuntu.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-windows.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-windows.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-windows.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-windows.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-windows.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/scalarstop/scalarstop/test-windows.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:26","Warn: pipCommand not pinned by hash: .github/workflows/test-mac.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/test-ubuntu.yml:44","Info:   0 out of  14 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test-mac.yml:1","Warn: no topLevel permission defined: .github/workflows/test-ubuntu.yml:1","Warn: no topLevel permission defined: .github/workflows/test-windows.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v6.0.0 not signed: https://api.github.com/repos/scalarstop/scalarstop/releases/62833016","Warn: release artifact v5.0.0 not signed: https://api.github.com/repos/scalarstop/scalarstop/releases/61963575","Warn: release artifact v4.0.0 not signed: https://api.github.com/repos/scalarstop/scalarstop/releases/52108756","Warn: release artifact v3.0.0 not signed: https://api.github.com/repos/scalarstop/scalarstop/releases/52023291","Warn: release artifact v2.0.0 not signed: https://api.github.com/repos/scalarstop/scalarstop/releases/51064334","Warn: release artifact v6.0.0 does not have provenance: https://api.github.com/repos/scalarstop/scalarstop/releases/62833016","Warn: release artifact v5.0.0 does not have provenance: https://api.github.com/repos/scalarstop/scalarstop/releases/61963575","Warn: release artifact v4.0.0 does not have provenance: https://api.github.com/repos/scalarstop/scalarstop/releases/52108756","Warn: release artifact v3.0.0 does not have provenance: https://api.github.com/repos/scalarstop/scalarstop/releases/52023291","Warn: release artifact v2.0.0 does not have provenance: https://api.github.com/repos/scalarstop/scalarstop/releases/51064334"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T11:05:24.274Z","repository_id":42659353,"created_at":"2025-08-23T11:05:24.274Z","updated_at":"2025-08-23T11:05:24.274Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29364518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["keras","machine-learning","reproducibility","reproducible-research","tensorlfow"],"created_at":"2024-09-25T00:29:37.604Z","updated_at":"2026-02-12T11:36:23.309Z","avatar_url":"https://github.com/scalarstop.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. image:: https://static.neocrym.com/images/scalarstop/v1/1x/scalarstop-wordmark-color-black-on-white--1x.png\r\n\r\nKeep track of your machine learning experiments with ScalarStop.\r\n================================================================\r\n\r\nScalarStop is a Python framework for reproducible machine learning research.\r\n\r\nIt was written and open-sourced at `Neocrym \u003chttps://www.neocrym.com\u003e`_, where it is used to train thousands of models every week.\r\n\r\nScalarStop can help you:\r\n\r\n* organize datasets and models with *content-addressable* names.\r\n* save/load datasets and models to/from the filesystem.\r\n* record hyperparameters and metrics to a relational database.\r\n\r\nSystem requirements\r\n-------------------\r\nScalarStop is a Python package that requires Python 3.8 or newer.\r\n\r\nCurrently, ScalarStop only supports tracking\r\n`tf.data.Dataset \u003chttps://www.tensorflow.org/api_docs/python/tf/data/Dataset\u003e`_\r\ndatasets and `tf.keras.Model \u003chttps://www.tensorflow.org/api_docs/python/tf/keras/Model\u003e`_\r\nmodels. As such, ScalarStop requires TensorFlow 2.8.0 or newer.\r\n\r\nWe encourage anybody that would like to add support for other\r\nmachine learning frameworks to ScalarStop. :)\r\n\r\nInstallation\r\n------------\r\n\r\nScalarStop is `available on PyPI \u003chttps://pypi.org/project/scalarstop/\u003e`_.\r\n\r\nSelecting a TensorFlow package variant\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\nIf you are using TensorFlow on a CPU, you can install ScalarStop with the command:\r\n\r\n.. code:: bash\r\n\r\n    python3 -m pip install scalarstop[tensorflow]\r\n\r\nIf you are using TensorFlow with GPUs, you can install ScalarStop with the command:\r\n\r\n.. code:: bash\r\n\r\n    python3 -m pip install scalarstop[tensorflow-gpu]\r\n\r\nSelecting a PostgreSQL psycopg2 package variant\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\nIf you intend to use ScalarStop with PostgreSQL, you should also\r\ninstall either `psycopg2-binary \u003chttps://pypi.org/project/psycopg2-binary/\u003e`_\r\n(`which works out of the box \u003chttps://www.psycopg.org/docs/install.html#psycopg-vs-psycopg-binary\u003e`_)\r\nor `psycopg2 \u003chttps://pypi.org/project/psycopg2/\u003e`_ (which you compile from source).\r\n\r\nTherefore, your installation command could look like either:\r\n\r\n.. code:: bash\r\n\r\n    python3 -m pip install scalarstop[tensorflow,psycopg2]\r\n    python3 -m pip install scalarstop[tensorflow,psycopg2-binary]\r\n    python3 -m pip install scalarstop[tensorflow-gpu,psycopg2]\r\n    python3 -m pip install scalarstop[tensorflow-gpu,psycopg2-binary]\r\n\r\n\r\nDevelopment\r\n-----------\r\n\r\nIf you would like to make changes to ScalarStop, you can `clone the repository \u003chttps://github.com/scalarstop/scalarstop\u003e`_\r\nfrom GitHub.\r\n\r\n.. code:: bash\r\n\r\n    git clone https://github.com/scalarstop/scalarstop.git\r\n    cd scalarstop\r\n    python3 -m pip install .\r\n\r\nUsage\r\n-----\r\n\r\nRead the `ScalarStop Tutorial \u003chttps://github.com/scalarstop/scalarstop/blob/main/notebooks/tutorial.ipynb\u003e`_ to learn the core concepts behind ScalarStop and how to structure your datasets and models.\r\n\r\nAfterwards, you might want to dig deeper into the `ScalarStop Documentation \u003chttps://docs.scalarstop.com\u003e`_. In general, a typical ScalarStop workflow involves four steps:\r\n\r\n1. Organize your datasets with `scalarstop.datablob \u003chttps://www.scalarstop.com/en/latest/autoapi/scalarstop/datablob/#module-scalarstop.datablob\u003e`_.\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n2. Describe your machine learning model architectures using `scalarstop.model_template \u003chttps://www.scalarstop.com/en/latest/autoapi/scalarstop/model_template/#module-scalarstop.model_template\u003e`_.\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n3. Load, train, and save machine learning models with `scalarstop.model \u003chttps://www.scalarstop.com/en/latest/autoapi/scalarstop/model/#module-scalarstop.model\u003e`_.\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n4. Save hyperparameters and training metrics to a SQLite or PostgreSQL database using `scalarstop.train_store \u003chttps://www.scalarstop.com/en/latest/autoapi/scalarstop/train_store/#module-scalarstop.train_store\u003e`_.\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\nContributing to ScalarStop\r\n--------------------------\r\n\r\nWe warmly welcome contributions to ScalarStop. Here are the technical details for getting started with adding code to ScalarStop.\r\n\r\nGetting started\r\n^^^^^^^^^^^^^^^\r\nFirst, clone this repository from GitHub. All development happens on the ``main`` branch.\r\n\r\n.. code:: bash\r\n\r\n    git clone https://github.com/scalarstop/scalarstop.git\r\n\r\nThen, run ``make install`` to install Python dependencies in a Poetry virtualenv.\r\n\r\nYou can run ``make help`` to see the other commands that are available.\r\n\r\nChecking your code\r\n^^^^^^^^^^^^^^^^^^\r\nRun ``make fmt`` to automatically format code.\r\n\r\nRun ``make lint`` to run Pylint and MyPy to check for errors.\r\n\r\nGenerating documentation\r\n^^^^^^^^^^^^^^^^^^^^^^^^\r\nDocumentation is important! Here is how to add to it.\r\n\r\nGenerating Sphinx documentation\r\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\n\r\nYou can generate a local copy of our Sphinx documentation at `scalarstop.com \u003chttps://www.scalarstop.com/en/latest/\u003e`_ with ``make docs``.\r\n\r\nThe generated documentation can be found at ``docs/_build/dirhtml``. To view it, you should start an HTTP server in this directory, such as:\r\n\r\n.. code:: bash\r\n\r\n    make docs\r\n    cd docs/_build/dirhtml\r\n    python3 -m http.server 5000\r\n\r\nThen visit http://localhost:5000 in your browser to preview changes to the documentation.\r\n\r\nIf you want to use Sphinx's ability to automatically generate hyperlinks to the Sphinx documentation of other Python projects, then you should configure `intersphinx \u003chttps://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html\u003e`_ settings at the path docs/conf.py. If you need to download an objects.inv file, make sure to update the ``make update-sphinx`` command in the `Makefile \u003chttps://github.com/scalarstop/scalarstop/blob/main/Makefile\u003e`_.\r\n\r\nEditing the tutorial notebook\r\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\nThe main ScalarStop tutorial is `in a Jupyter notebook \u003chttps://github.com/scalarstop/scalarstop/blob/main/notebooks/tutorial.ipynb\u003e`_. If you have made changes to ScalarStop, you should rerun the Jupyter notebook on your machine with your changes to make sure that it still runs without error.\r\n\r\nRunning unit tests\r\n^^^^^^^^^^^^^^^^^^\r\nRun ``make test`` to run all unit tests.\r\n\r\nIf you want to run a specific unit test, try running ``python3 -m poetry run python -m unittest -k {name of your test}``.\r\n\r\nUnit tests with SQLite3\r\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\nIf you are running tests using a Python interpreter that does not have the `SQLite3 JSON1 extension \u003chttps://www.sqlite.org/json1.html\u003e`_, then `TrainStore \u003chttps://www.scalarstop.com/en/latest/autoapi/scalarstop/train_store/#module-scalarstop.train_store\u003e`_ unit tests involving SQLite3 will be skipped. This is likely to happen if you are using Python 3.8 on Windows. If you suspect that you are missing the SQLite3 JSON1 extension, the `Django documentation has some suggestions \u003chttps://code.djangoproject.com/wiki/JSON1Extension\u003e`_ for how to fix it.\r\n\r\nUnit tests with PostgreSQL\r\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\nBy default, tests involving PostgreSQL are skipped. To enable PostgreSQL, run ``make test`` in a shell where the environment variable ``TRAIN_STORE_CONNECTION_STRING`` is set to a `SQLAlchemy database connection URL \u003chttps://docs.sqlalchemy.org/en/14/core/engines.html\u003e`_--which looks something like ``\"postgresql://scalarstop:changeme@localhost:5432/train_store\"``. The connection URL should point to a working PostgreSQL database with an existing database and user.\r\n\r\nThe docker-compose.yml file in the root of this directory can set up a PostgreSQL instance on your local machine. If you have `Docker \u003chttps://docs.docker.com/get-docker/\u003e`_ and `Docker Compose \u003chttps://docs.docker.com/compose/install/\u003e`_ installed, you can start the PostgreSQL database by running ``docker-compose up`` in the same directory as the docker-compose.yml file.\r\n\r\nMeasuring test coverage\r\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\nYou can run ``make test-with-coverage`` to collect Python line and branch coverage information. Afterwards, run ``make coverage-html`` to generate an HTML report of unit test coverage. You can view the report in a web browser at the path ``htmlcov/index.html``.\r\n\r\nCredits\r\n-------\r\nScalarStop's documentation is built with `Sphinx \u003chttps://www.sphinx-doc.org/\u003e`_ using `@pradyunsg \u003chttps://pradyunsg.me\u003e`_'s `Furo \u003chttps://github.com/pradyunsg/furo\u003e`_ theme and is hosted by `Read the Docs \u003chttps://readthedocs.org/\u003e`_.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscalarstop%2Fscalarstop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscalarstop%2Fscalarstop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscalarstop%2Fscalarstop/lists"}