diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 97aff48..6edf4c5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -ENTER_YOUR_EMAIL_ADDRESS. +sam.louvito@gmail.com. All complaints will be reviewed and investigated promptly and fairly. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b899aff..d814132 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# template-python-repository pull request guidelines +# eeg_research pull request guidelines -Pull requests are always welcome, and we appreciate any help you give. Note that a code of conduct applies to all spaces managed by the template-python-repository project, including issues and pull requests. Please see the [Code of Conduct](CODE_OF_CONDUCT.md) for details. +Pull requests are always welcome, and we appreciate any help you give. Note that a code of conduct applies to all spaces managed by the eeg_research project, including issues and pull requests. Please see the [Code of Conduct](CODE_OF_CONDUCT.md) for details. When submitting a pull request, we ask you to check the following: diff --git a/LICENSE b/LICENSE index 20566e6..0a04128 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,165 @@ -MIT License - -Copyright (c) 2023 Child Mind Institute - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md index d47182c..2bdf2ac 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![DOI](https://zenodo.org/badge/657341621.svg)](https://zenodo.org/doi/10.5281/zenodo.10383685) # Todo -- [ ] Run `setup_template.py` to initialize the repository. +- [x] Run `setup_template.py` to initialize the repository. - [ ] Replace the content of this `README.md` with details specific to your project. - [ ] Install the `pre-commit` hooks to ensure code quality on each commit. - [ ] Revise SECURITY.md to reflect supported versions or remove it if not applicable. @@ -12,12 +12,12 @@ # EEG research -[![Build](https://github.com/childmindresearch/template-python-repository/actions/workflows/test.yaml/badge.svg?branch=main)](https://github.com/childmindresearch/template-python-repository/actions/workflows/test.yaml?query=branch%3Amain) -[![codecov](https://codecov.io/gh/childmindresearch/template-python-repository/branch/main/graph/badge.svg?token=22HWWFWPW5)](https://codecov.io/gh/childmindresearch/template-python-repository) +[![Build](https://github.com/childmindresearch/eeg_research/actions/workflows/test.yaml/badge.svg?branch=main)](https://github.com/childmindresearch/eeg_research/actions/workflows/test.yaml?query=branch%3Amain) +[![codecov](https://codecov.io/gh/childmindresearch/eeg_research/branch/main/graph/badge.svg?token=22HWWFWPW5)](https://codecov.io/gh/childmindresearch/eeg_research) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) ![stability-stable](https://img.shields.io/badge/stability-experimental-red.svg) -[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/childmindresearch/template-python-repository/blob/main/LICENSE) -[![pages](https://img.shields.io/badge/api-docs-blue)](https://childmindresearch.github.io/template-python-repository) +[![LGPL--3.0 License](https://img.shields.io/badge/license-LGPL--3.0-blue.svg)](https://github.com/childmindresearch/eeg_research/blob/main/LICENSE) +[![pages](https://img.shields.io/badge/api-docs-blue)](https://childmindresearch.github.io/eeg_research) The purpose of this monorepository is to group all software tools and pipelines related to EEG (experiment, cleaning, analysis etc.) diff --git a/SECURITY.md b/SECURITY.md index 9fd57bf..4556d32 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -15,6 +15,6 @@ Note which version(s) will receive security updates. For example: ## Reporting Vulnerabilities -To report security vulnerabilities, please do NOT use our issues page. Instead, kindly email us at ENTER_YOUR_EMAIL_ADDRESS. Please refrain from using other communication channels. +To report security vulnerabilities, please do NOT use our issues page. Instead, kindly email us at sam.louvito@gmail.com. Please refrain from using other communication channels. For non-security-related issues, we welcome your input and feedback on our issues page. Feel free to share your ideas and suggestions to help us improve our services. diff --git a/pyproject.toml b/pyproject.toml index 38d783d..9bd4ba6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,11 @@ [tool.poetry] -name = "app-name" +name = "eeg_research" version = "0.1.0" -description = "A beautiful description." -authors = ["Reinder Vos de Wael "] +description = "All tools and pipelines developed for eeg research" +authors = ["Samuel Louviot "] license = "LGPL-2.1" readme = "README.md" -packages = [{include = "APP_NAME", from = "src"}] +packages = [{include = "eeg_research", from = "src"}] [tool.poetry.dependencies] python = "~3.11" diff --git a/setup/__init__.py b/setup/__init__.py deleted file mode 100644 index 5b41398..0000000 --- a/setup/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for code required by the setup_template.py script.""" diff --git a/setup/licenses.py b/setup/licenses.py deleted file mode 100644 index 6633d2b..0000000 --- a/setup/licenses.py +++ /dev/null @@ -1,128 +0,0 @@ -"""Functions for fetching and replacing the license file.""" - -from __future__ import annotations - -import json -import re -from datetime import datetime -from typing import Optional -from urllib import request - -from setup import settings - -DIR_REPO = settings.DIR_REPO -LICENSES = settings.LICENSES - - -def get_license(name: str) -> dict[str, str]: - """Fetches the license files from GitHub. - - Args: - name: The name of the license to fetch. - - Returns: - The license text. - - """ - if name not in LICENSES: - raise ValueError(f"License {name} is not in {LICENSES}.") - with request.urlopen(f"https://api.github.com/licenses/{name}") as response: - license_info = response.read().decode() - return json.loads(license_info) - - -def modify_license_placeholder_text(selected_license: dict[str, str]) -> dict[str, str]: - """Modifies the placeholder text in the license. - - Args: - selected_license: The license to modify. - - Returns: - The modified license. - - """ - if selected_license["key"] == "mit": - license_holder = input("Who is the holder of the license? ") - current_year = datetime.now().year - selected_license["body"] = selected_license["body"].replace( - "[year]", - str(current_year), - ) - selected_license["body"] = selected_license["body"].replace( - "[fullname]", - license_holder, - ) - - return selected_license - - -def request_license() -> Optional[dict[str, str]]: - """Asks the user to select a license. - - Returns: - The path to the selected license. - - """ - print("Available licenses:") - print("\t0. No license") - for i, option in enumerate(LICENSES): - print(f"\t{i + 1}. {option}") - while True: - try: - choice = int(input("Enter the number of the license you want to use: ")) - if choice == 0: - return None - if 0 < choice <= len(LICENSES): - selected_license = get_license(LICENSES[choice - 1]) - break - raise ValueError("Invalid choice. Please try again.") - except ValueError: - print("Invalid choice. Please try again.") - - final_license = modify_license_placeholder_text(selected_license) - return final_license - - -def replace_license_badge(content: str, repo_license: Optional[dict[str, str]]) -> str: - """Replaces the license badge with the specified license. - - Args: - content: Content of any file that might contain a license badge. - repo_license: The license to replace the current license with. If None, - the current license badge will be deleted. - - Returns: - The content with the license badge replaced. - """ - if repo_license is None: - # remove line containing license badge - return re.sub( - r"\[!\[.*License\]\(https://img\.shields\.io/badge/license.*\)\]\(.*\)\n", - "", - content, - ) - # shield.io uses -- as an escape character, so we need to replace - with -- - license_name_upper = repo_license["key"].upper().replace("-", "--") - return content.replace( - "![MIT License]" "(https://img.shields.io/badge/license-MIT-blue.svg)]", - f"![{license_name_upper} License]" - f"(https://img.shields.io/badge/license-{license_name_upper}-blue.svg)]", - ) - - -def replace_license(repo_license: Optional[dict[str, str]]) -> None: - """Replaces the license file in the repository with the specified license. - - Args: - repo_license: The license to replace the current license with. If None, - the current license file will be deleted. - - """ - license_file = DIR_REPO / "LICENSE" - license_file.unlink(missing_ok=True) - - if repo_license is None: - return - - with open(license_file, "w", encoding="utf-8") as file_buffer: - file_buffer.write(repo_license["body"]) diff --git a/setup/settings.py b/setup/settings.py deleted file mode 100644 index cd8faa8..0000000 --- a/setup/settings.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Constants for the setup module.""" - -import pathlib as pl - -DIR_REPO = pl.Path(__file__).parent.parent -LICENSES = ("mit", "lgpl-2.1", "lgpl-3.0", "mpl-2.0", "unlicense") -TARGET_EXTENSIONS = { - ".py", - ".md", - ".yml", - ".yaml", - ".toml", - ".txt", -} diff --git a/setup_template.py b/setup_template.py deleted file mode 100644 index 551b918..0000000 --- a/setup_template.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin python3 -"""Setup template for Python repositories.""" - -import os -import pathlib as pl -import shutil - -from setup import licenses, settings - -DIR_REPO = settings.DIR_REPO -TARGET_EXTENSIONS = settings.TARGET_EXTENSIONS - - -def main() -> None: - """Entrypoint to the template setup script. - - This script will ask the user for details of the repository and then replace - the template values with the user input. It will also remove the setup files - and the setup directory. - """ - # Collect some data - git_uncommitted_changes = ( - os.popen(f"git -C {DIR_REPO} status -s").read().strip() != "" - ) - git_username = os.popen(f"git -C {DIR_REPO} config user.name").read().strip() - git_email = os.popen(f"git -C {DIR_REPO} config user.email").read().strip() - git_repo_name = ( - os.popen(f"git -C {DIR_REPO} remote get-url origin") - .read() - .split("/")[-1] - .split(".")[0] - .strip() - ) - - # Ask for some data - if git_uncommitted_changes: - print("You have uncommitted changes. Please commit or stash them first.") - exit(1) - repo_name = ( - input(f"Enter the name of the repository [{git_repo_name}]: ").strip() - or git_repo_name - ) - module_name = ( - input(f"Enter the name of the module [{repo_name}]: ").strip() or repo_name - ) - username = input(f"Enter your username [{git_username}]: ").strip() or git_username - email = input(f"Enter your email [{git_email}]: ").strip() or git_email - description = ( - input("Enter a short description of the project: ").strip() - or "A beautiful description." - ) - repo_license = licenses.request_license() - - # Print the data - print( - f"Using the following values:\n" - f"\tRepository name: '{repo_name}'\n" - f"\tModule name: '{module_name}'\n" - f"\tAuthor: '{username} <{email}'>\n" - f"\tDescription: '{description}'\n" - f"\tLicense: '{repo_license['name'] if repo_license else 'No license'}'", - ) - input("Press enter to continue...") - - # Replace the template values - for file in pl.Path(DIR_REPO).glob("**/*"): - if ( - not file.is_file() - or file.suffix not in TARGET_EXTENSIONS - or file.name == "setup_template.py" - ): - continue - - with open(file, encoding="utf-8") as f: - content = f.read() - - content_before = content - content = content.replace( - "- [ ] Run `setup_template.py`", - "- [x] Run `setup_template.py`", - ) - content = content.replace( - "- [ ] Update the `LICENSE`", - "- [x] Update the `LICENSE`", - ) - content = content.replace("template-python-repository", repo_name) - content = content.replace("APP_NAME", module_name) - content = content.replace("app-name", module_name) - content = content.replace("A beautiful description.", description) - content = content.replace("reinder.vosdewael@childmind.org", email) - content = content.replace("ENTER_YOUR_EMAIL_ADDRESS", email) - content = content.replace("Reinder Vos de Wael", username) - - content = licenses.replace_license_badge(content, repo_license) - - if content != content_before: - print(f"Updating {file.relative_to(DIR_REPO)}") - with open(file, "w", encoding="utf-8") as f: - f.write(content) - - licenses.replace_license(repo_license) - - dir_module = DIR_REPO / "src" / "APP_NAME" - if dir_module.exists(): - dir_module.rename(dir_module.parent / module_name) - - # Remove setup files - print("Removing setup files.") - setup_files = pl.Path(DIR_REPO / "setup").glob("*.py") - for setup_file in setup_files: - pl.Path(DIR_REPO / "setup" / setup_file).unlink() - if pl.Path(DIR_REPO / "setup" / "__pycache__").exists(): - # Use a more robust method to remove the cache directory - shutil.rmtree(DIR_REPO / "setup" / "__pycache__") - pl.Path(DIR_REPO / "setup").rmdir() - pl.Path(__file__).unlink() - - -if __name__ == "__main__": - main() diff --git a/src/APP_NAME/__init__.py b/src/APP_NAME/__init__.py deleted file mode 100644 index 7cff8c5..0000000 --- a/src/APP_NAME/__init__.py +++ /dev/null @@ -1 +0,0 @@ -""".. include:: ../../README.md""" # noqa: D415 diff --git a/src/APP_NAME/algorithms.py b/src/APP_NAME/algorithms.py deleted file mode 100644 index 020e25f..0000000 --- a/src/APP_NAME/algorithms.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Example functions for APP_NAME.""" - - -def fibonacci(n: int) -> int: - """Return the n-th Fibonacci number. - - Args: - n: The index of the Fibonacci number to return. - - Returns: - The n-th Fibonacci number. - """ - if n < 0: - raise ValueError("n must be non-negative") - - if int(n) != n: - raise ValueError("n must be an integer") - - if n == 0: - return 0 - if n <= 2: - return 1 - return fibonacci(n - 1) + fibonacci(n - 2) diff --git a/tests/test_fibonacci.py b/tests/test_fibonacci.py index b09e49c..fcd1738 100644 --- a/tests/test_fibonacci.py +++ b/tests/test_fibonacci.py @@ -2,7 +2,7 @@ import pytest -from APP_NAME import algorithms +from eeg_research import algorithms def test_fibonacci_success_0() -> None: