From 8314b2afb21018656e79b8b26e6a44e71dcb9bee Mon Sep 17 00:00:00 2001 From: Projects <> Date: Sun, 1 Dec 2024 02:13:49 -0800 Subject: [PATCH] Initial commit --- .gitea/PULL_REQUEST_TEMPLATE.md | 15 +++ .gitea/conventional_commits/commit-msg | 47 ++++++++ .../conventional_commits/generate-version.sh | 105 ++++++++++++++++++ .../conventional_commits/hooks/text-styles.sh | 44 ++++++++ .gitea/release_message.sh | 3 + .gitea/rename_project.sh | 40 +++++++ .gitea/template.yml | 1 + .gitea/workflows/main.yml | 84 ++++++++++++++ .gitea/workflows/release.yml | 65 +++++++++++ .gitea/workflows/rename_project.yml | 48 ++++++++ .gitea/workflows/sonar.yml | 27 +++++ .gitignore | 3 + CONTRIBUTING.md | 95 ++++++++++++++++ Containerfile | 4 + HISTORY.md | 11 ++ LICENSE | 24 ++++ MANIFEST.in | 5 + Makefile | 67 +++++++++++ README.md | 46 ++++++++ docs/index.md | 17 +++ mkdocs.yml | 2 + nuget.config | 11 ++ project_name.Tests/UnitTest1.cs | 14 +++ project_name.Tests/project_name.Tests.csproj | 26 +++++ project_name.sln | 32 ++++++ project_name/HelloWorldProvider.cs | 16 +++ project_name/VERSION | 1 + project_name/project_name.csproj | 9 ++ 28 files changed, 862 insertions(+) create mode 100644 .gitea/PULL_REQUEST_TEMPLATE.md create mode 100755 .gitea/conventional_commits/commit-msg create mode 100755 .gitea/conventional_commits/generate-version.sh create mode 100755 .gitea/conventional_commits/hooks/text-styles.sh create mode 100755 .gitea/release_message.sh create mode 100755 .gitea/rename_project.sh create mode 100644 .gitea/template.yml create mode 100644 .gitea/workflows/main.yml create mode 100644 .gitea/workflows/release.yml create mode 100644 .gitea/workflows/rename_project.yml create mode 100644 .gitea/workflows/sonar.yml create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Containerfile create mode 100644 HISTORY.md create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 Makefile create mode 100644 README.md create mode 100644 docs/index.md create mode 100644 mkdocs.yml create mode 100644 nuget.config create mode 100644 project_name.Tests/UnitTest1.cs create mode 100644 project_name.Tests/project_name.Tests.csproj create mode 100644 project_name.sln create mode 100644 project_name/HelloWorldProvider.cs create mode 100644 project_name/VERSION create mode 100644 project_name/project_name.csproj diff --git a/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..9ccc736 --- /dev/null +++ b/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +### Summary :memo: +_Write an overview about it._ + +### Details +_Describe more what you did on changes._ +1. (...) +2. (...) + +### Bugfixes :bug: (delete if dind't have any) +- + +### Checks +- [ ] Closed #798 +- [ ] Tested Changes +- [ ] Stakeholder Approval diff --git a/.gitea/conventional_commits/commit-msg b/.gitea/conventional_commits/commit-msg new file mode 100755 index 0000000..335984a --- /dev/null +++ b/.gitea/conventional_commits/commit-msg @@ -0,0 +1,47 @@ +#!/usr/bin/env sh +echo "Running commit message checks..." + +. "$(dirname -- "$0")/../../.gitea/conventional_commits/hooks/text-styles.sh" + + +# Get the commit message +commit="$(cat .git/COMMIT_EDITMSG)" +# Define the conventional commit regex +regex='^((build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\(.+\))?(!?):\s([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE))))|(release: .*)$' + +# Check if the commit message matches the conventional commit format +if ! echo "$commit" | grep -Pq "$regex" +then + echo + colorPrint red "❌ Failed to create commit. Your commit message does not follow the conventional commit format." + colorPrint red "Please use the following format: $(colorPrint brightRed 'type(scope)?: description')" + colorPrint red "Available types are listed below. Scope is optional. Use ! after type to indicate breaking change." + echo + colorPrint brightWhite "Quick examples:" + echo "feat: add email notifications on new direct messages refs ABC-1213" + echo "feat(shopping cart): add the amazing button ref: DEFG-23" + echo "feat!: remove ticket list endpoint ref DADA-109" + echo "fix(api): handle empty message in request body refs: MINE-82" + echo "chore(deps): bump some-package-name to version 2.0.0 refs ASDF-12" + echo + colorPrint brightWhite "Commit types:" + colorPrint brightCyan "build: $(colorPrint white "Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)" -n)" + colorPrint brightCyan "ci: $(colorPrint white "Changes to CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)" -n)" + colorPrint brightCyan "chore: $(colorPrint white "Changes which doesn't change source code or tests e.g. changes to the build process, auxiliary tools, libraries" -n)" + colorPrint brightCyan "docs: $(colorPrint white "Documentation only changes" -n)" + colorPrint brightCyan "feat: $(colorPrint white "A new feature" -n)" + colorPrint brightCyan "fix: $(colorPrint white "A bug fix" -n)" + colorPrint brightCyan "perf: $(colorPrint white "A code change that improves performance" -n)" + colorPrint brightCyan "refactor: $(colorPrint white "A code change that neither fixes a bug nor adds a feature" -n)" + colorPrint brightCyan "revert: $(colorPrint white "Revert a change previously introduced" -n)" + colorPrint brightCyan "test: $(colorPrint white "Adding missing tests or correcting existing tests" -n)" + echo + + colorPrint brightWhite "Reminders" + echo "Put newline before extended commit body" + echo "More details at $(underline "http://www.conventionalcommits.org")" + echo + echo "The commit message you attempted was: $commit" + echo + exit 1 +fi \ No newline at end of file diff --git a/.gitea/conventional_commits/generate-version.sh b/.gitea/conventional_commits/generate-version.sh new file mode 100755 index 0000000..b4654db --- /dev/null +++ b/.gitea/conventional_commits/generate-version.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# Rules for generating semantic versioning +# major: breaking change +# minor: feat, style +# patch: build, fix, perf, refactor, revert + +PREVENT_REMOVE_FILE=$1 +TEMP_FILE_PATH=.gitea/conventional_commits/tmp + +LAST_TAG=$(git describe --tags --abbrev=0 --always) +echo "Last tag: #$LAST_TAG#" +PATTERN="^[0-9]+\.[0-9]+\.[0-9]+$" + +increment_version() { + local version=$1 + local increment=$2 + local major=$(echo $version | cut -d. -f1) + local minor=$(echo $version | cut -d. -f2) + local patch=$(echo $version | cut -d. -f3) + + if [ "$increment" == "major" ]; then + major=$((major + 1)) + minor=0 + patch=0 + elif [ "$increment" == "minor" ]; then + minor=$((minor + 1)) + patch=0 + elif [ "$increment" == "patch" ]; then + patch=$((patch + 1)) + fi + + echo "${major}.${minor}.${patch}" +} + +create_file() { + local with_range=$1 + if [ -s $TEMP_FILE_PATH/messages.txt ]; then + return 1 + fi + if [ "$with_range" == "true" ]; then + git log $LAST_TAG..HEAD --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt + else + git log --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt + fi +} + +get_commit_range() { + rm $TEMP_FILE_PATH/messages.txt + if [[ $LAST_TAG =~ $PATTERN ]]; then + create_file true + else + create_file + LAST_TAG="0.0.0" + fi + echo " " >> $TEMP_FILE_PATH/messages.txt +} + +start() { + mkdir -p $TEMP_FILE_PATH + get_commit_range + new_version=$LAST_TAG + increment_type="" + + while read message; do + echo $message + if echo $message | grep -Pq '(feat|style)(\([\w]+\))?!:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then + increment_type="major" + echo "a" + break + elif echo $message | grep -Pq '(feat|style)(\([\w]+\))?:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then + if [ -z "$increment_type" ] || [ "$increment_type" == "patch" ]; then + increment_type="minor" + echo "b" + fi + elif echo $message | grep -Pq '(build|fix|perf|refactor|revert)(\(.+\))?:\s([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then + if [ -z "$increment_type" ]; then + increment_type="patch" + echo "c" + fi + fi + done < $TEMP_FILE_PATH/messages.txt + + if [ -n "$increment_type" ]; then + new_version=$(increment_version $LAST_TAG $increment_type) + echo "New version: $new_version" + + gitchangelog | grep -v "[rR]elease:" > HISTORY.md + git add DotnetTestLib/VERSION HISTORY.md + echo $new_version > DotnetTestLib/VERSION + git commit -m "release: version $new_version 🚀" + echo "creating git tag : $new_version" + git tag $new_version + git push -u origin HEAD --tags + echo "Gitea Actions will detect the new tag and release the new version." + else + echo "No changes requiring a version increment." + fi +} + +start + +if [ -z "$PREVENT_REMOVE_FILE" ]; then + rm -f $TEMP_FILE_PATH/messages.txt +fi \ No newline at end of file diff --git a/.gitea/conventional_commits/hooks/text-styles.sh b/.gitea/conventional_commits/hooks/text-styles.sh new file mode 100755 index 0000000..73d91ef --- /dev/null +++ b/.gitea/conventional_commits/hooks/text-styles.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +colorPrint() { + local color=$1 + local text=$2 + shift 2 + local newline="\n" + local tab="" + + for arg in "$@" + do + if [ "$arg" = "-t" ]; then + tab="\t" + elif [ "$arg" = "-n" ]; then + newline="" + fi + done + + case $color in + black) color_code="30" ;; + red) color_code="31" ;; + green) color_code="32" ;; + yellow) color_code="33" ;; + blue) color_code="34" ;; + magenta) color_code="35" ;; + cyan) color_code="36" ;; + white) color_code="37" ;; + brightBlack) color_code="90" ;; + brightRed) color_code="91" ;; + brightGreen) color_code="92" ;; + brightYellow) color_code="93" ;; + brightBlue) color_code="94" ;; + brightMagenta) color_code="95" ;; + brightCyan) color_code="96" ;; + brightWhite) color_code="97" ;; + *) echo "Invalid color"; return ;; + esac + + printf "\e[${color_code}m${tab}%s\e[0m${newline}" "$text" +} + +underline () { + printf "\033[4m%s\033[24m" "$1" +} \ No newline at end of file diff --git a/.gitea/release_message.sh b/.gitea/release_message.sh new file mode 100755 index 0000000..f5a9062 --- /dev/null +++ b/.gitea/release_message.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +previous_tag=$(git tag --sort=-creatordate | sed -n 2p) +git shortlog "${previous_tag}.." | sed 's/^./ &/' diff --git a/.gitea/rename_project.sh b/.gitea/rename_project.sh new file mode 100755 index 0000000..022fc64 --- /dev/null +++ b/.gitea/rename_project.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +while getopts a:n:u:d: flag +do + case "${flag}" in + a) author=${OPTARG};; + n) name=${OPTARG};; + u) urlname=${OPTARG};; + d) description=${OPTARG};; + esac +done + +echo "Author: $author"; +echo "Project Name: $name"; +echo "Project URL name: $urlname"; +echo "Description: $description"; + +echo "Renaming project..." + +original_author="author_name" +original_name="project_name" +original_urlname="project_urlname" +original_description="project_description" +# for filename in $(find . -name "*.*") +for filename in $(git ls-files) +do + sed -i "s/$original_author/$author/g" $filename + sed -i "s/$original_name/$name/g" $filename + sed -i "s/$original_urlname/$urlname/g" $filename + sed -i "s/$original_description/$description/g" $filename + echo "Renamed $filename" +done + +mv project_name $name +mv project_name.Tests $name.Tests +mv project_name.sln $name.sln +mv $name/project_name.csproj $name/$name.csproj +mv $name.Tests/project_name.Tests.csproj $name.Tests/$name.Tests.csproj + +# This command runs only once on GHA! +rm -rf .gitea/template.yml diff --git a/.gitea/template.yml b/.gitea/template.yml new file mode 100644 index 0000000..3386bee --- /dev/null +++ b/.gitea/template.yml @@ -0,0 +1 @@ +author: rochacbruno diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml new file mode 100644 index 0000000..bffb70d --- /dev/null +++ b/.gitea/workflows/main.yml @@ -0,0 +1,84 @@ +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + linter: + strategy: + fail-fast: false + matrix: + dotnet-version: [9.0.X] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.dotnet-version }} + - name: Run linter + run: make lint + + tests_linux: + needs: linter + strategy: + fail-fast: false + matrix: + dotnet-version: [9.0.X] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.dotnet-version }} + - name: Run tests + run: make test + + # tests_mac: + # needs: linter + # strategy: + # fail-fast: false + # matrix: + # dotnet-version: [9.0.X] + # os: [macos-latest] + # runs-on: ${{ matrix.os }} + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/setup-dotnet@v4 + # with: + # dotnet-version: ${{ matrix.dotnet-version }} + # - name: Install project + # run: make install + # - name: Run tests + # run: make test + + # tests_win: + # needs: linter + # strategy: + # fail-fast: false + # matrix: + # dotnet-version: [9.0.X] + # os: [windows-latest] + # runs-on: ${{ matrix.os }} + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/setup-dotnet@v4 + # with: + # dotnet-version: ${{ matrix.dotnet-version }} + # - name: Install Pip + # run: pip install --user --upgrade pip + # - name: Install project + # run: pip install -e .[test] + # - name: run tests + # run: pytest -s -vvvv -l --tb=long tests diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..89c423e --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,65 @@ +name: Upload Python Package +permissions: + contents: write + +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - '*' # Push events to matching v*, i.e. v1.0, v20.15.10 + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + release: + name: Create Release + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + with: + # by default, it uses a depth of 1 + # this fetches all history so that we can read each commit + fetch-depth: 0 + - name: Generate Changelog + run: .gitea/release_message.sh > release_message.md + - name: Release + uses: softprops/action-gh-release@v1 + with: + body_path: release_message.md + + deploy: + needs: release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up dotnet + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.0.X' + - name: Check version match + run: | + REPOSITORY_NAME=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $2}' | tr '-' '_') + if [ "$(cat $REPOSITORY_NAME/VERSION)" = "${GITHUB_REF_NAME}" ] ; then + echo "Version matches successfully!" + else + echo "Version must match!" + exit -1 + fi + - name: Build and publish + env: + GITEA_PAT: ${{ secrets.PACKAGE_GITEA_PAT }} + run: | + REPOSITORY_OWNER=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $1}') + REPOSITORY_NAME=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $2}' | tr '-' '_') + REPOSITORY_SOURCE_NAME=gitea-repo + if [ -z "$(dotnet nuget config get all | grep "/packages/${REPOSITORY_OWNER}/nuget/index.json")" ]; then + dotnet nuget add source --name $REPOSITORY_SOURCE_NAME https://git.disi.dev/api/packages/$REPOSITORY_OWNER/nuget/index.json + else + QUOTED_REPOSITORY_SOURCE_NAME=$(dotnet nuget config get all | grep "/packages/${REPOSITORY_OWNER}/nuget/index.json" | awk '{print $2}' | awk -F= '{print $2}') + REPOSITORY_SOURCE_NAME=${QUOTED_REPOSITORY_SOURCE_NAME:1:-1} + fi + dotnet pack --include-symbols --include-source -p:PackageVersion=$(cat $REPOSITORY_NAME/VERSION) DotnetTestLib.sln + dotnet nuget push -k $GITEA_PAT --source $REPOSITORY_SOURCE_NAME $REPOSITORY_NAME/bin/Release/$REPOSITORY_NAME.$(cat $REPOSITORY_NAME/VERSION).symbols.nupkg diff --git a/.gitea/workflows/rename_project.yml b/.gitea/workflows/rename_project.yml new file mode 100644 index 0000000..f43225e --- /dev/null +++ b/.gitea/workflows/rename_project.yml @@ -0,0 +1,48 @@ +name: Rename the project from template + +on: [push] + +permissions: write-all + +jobs: + rename-project: + if: ${{ !endsWith (gitea.repository, 'Templates/Dotnet_Library') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + # by default, it uses a depth of 1 + # this fetches all history so that we can read each commit + fetch-depth: 0 + ref: ${{ gitea.head_ref }} + + - run: echo "REPOSITORY_NAME=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $2}' | tr '-' '_')" >> $GITHUB_ENV + shell: bash + + - run: echo "REPOSITORY_URLNAME=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $2}')" >> $GITHUB_ENV + shell: bash + + - run: echo "REPOSITORY_OWNER=$(echo "$GITHUB_REPOSITORY" | awk -F '/' '{print $1}')" >> $GITHUB_ENV + shell: bash + + - name: Is this still a template + id: is_template + run: echo "::set-output name=is_template::$(ls .gitea/template.yml &> /dev/null && echo true || echo false)" + + - name: Rename the project + if: steps.is_template.outputs.is_template == 'true' + run: | + echo "Renaming the project with -a(author) ${{ env.REPOSITORY_OWNER }} -n(name) ${{ env.REPOSITORY_NAME }} -u(urlname) ${{ env.REPOSITORY_URLNAME }}" + .gitea/rename_project.sh -a ${{ env.REPOSITORY_OWNER }} -n ${{ env.REPOSITORY_NAME }} -u ${{ env.REPOSITORY_URLNAME }} -d "Awesome ${{ env.REPOSITORY_NAME }} created by ${{ env.REPOSITORY_OWNER }}" + + - name: Remove renaming workflow + if: steps.is_template.outputs.is_template == 'true' + run: | + rm .gitea/workflows/rename_project.yml + rm .gitea/rename_project.sh + + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: "✅ Ready to clone and code." + # commit_options: '--amend --no-edit' + push_options: --force diff --git a/.gitea/workflows/sonar.yml b/.gitea/workflows/sonar.yml new file mode 100644 index 0000000..7f62db9 --- /dev/null +++ b/.gitea/workflows/sonar.yml @@ -0,0 +1,27 @@ +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + +name: SonarQube Scan +jobs: + sonarqube: + name: SonarQube Trigger + runs-on: ubuntu-latest + if: ${{ !contains ('project_name', format('{0}_{1}', 'project', 'name')) }} + steps: + - name: Checking out + uses: actions/checkout@v4 + with: + # Disabling shallow clone is recommended for improving relevancy of reporting + fetch-depth: 0 + - name: SonarQube Scan + uses: sonarsource/sonarqube-scan-action@master + env: + SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONARQUBE_HOST }} + with: + args: > + -Dsonar.projectKey=project_name \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..185aa60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/bin +**/obj +.gitea/conventional_commits/tmp/* \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..aff917f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,95 @@ +# How to develop on this project + +project_name welcomes contributions from the community. + +**You need Dotnet 9!** + +This instructions are for linux base systems. (Linux, MacOS, BSD, etc.) +## Setting up your own fork of this repo. + +- On gitea interface click on `Fork` button. +- Clone your fork of this repo. `git clone git@git.disi.dev:YOUR_GIT_USERNAME/project_urlname.git` +- Enter the directory `cd project_urlname` +- Add upstream repo `git remote add upstream https://git.disi.dev/author_name/project_urlname` + +## Run the tests to ensure everything is working + +Run `make test` to run the tests. + +## Create a new branch to work on your contribution + +Run `git checkout -b my_contribution` + +## Make your changes + +Edit the files using your preferred editor. (we recommend VIM or VSCode) + +## Format the code + +Run `make fmt` to format the code. + +## Lint the code + +Run `make lint` to lint the code. + +## Test your changes + +Run `make test` to run the tests. + +Ensure code coverage report shows `100%` coverage, add tests to your PR. + +## Build the docs locally + +Run `make docs` to build the docs. + +Ensure your new changes are documented. + +## Commit your changes + +This project uses [conventional git commit messages](https://www.conventionalcommits.org/en/v1.0.0/). + +Example: `fix(package): update setup.py arguments 🎉` (emojis are fine too) + +## Push your changes to your fork + +Run `git push origin my_contribution` + +## Submit a pull request + +On gitea interface, click on `Pull Request` button. + +Wait CI to run and one of the developers will review your PR. +## Makefile utilities + +This project comes with a `Makefile` that contains a number of useful utility. + +```bash +❯ make +Usage: make + +Targets: +help: ## Show the help. +fmt: ## Format code using black & isort. +test: lint ## Run tests and generate coverage report. +clean: ## Clean unused files. +release: ## Create a new tag for release. +docs: ## Build the documentation. +``` + +## Making a new release + +This project uses [semantic versioning](https://semver.org/) and tags releases with `X.Y.Z` +Every time a new tag is created and pushed to the remote repo, gitea actions will +automatically create a new release on gitea. + +To trigger a new release all you need to do is. + +1. If you have changes to add to the repo + * Make your changes following the steps described above. + * Commit your changes following the [conventional git commit messages](https://www.conventionalcommits.org/en/v1.0.0/). +2. Run the tests to ensure everything is working. +4. Run `make release` to create a new tag and push it to the remote repo. + +the `make release` will ask you the version number to create the tag, ex: type `0.1.1` when you are asked. + +> **CAUTION**: The make release will change local changelog files and commit all the unstaged changes you have. diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..21c0a2b --- /dev/null +++ b/Containerfile @@ -0,0 +1,4 @@ +FROM mcr.microsoft.com/dotnet/runtime:9.0 +COPY ./project_name/bin/Release/net9.0/ /app +WORKDIR /app +CMD ["project_name"] diff --git a/HISTORY.md b/HISTORY.md new file mode 100644 index 0000000..85bef6f --- /dev/null +++ b/HISTORY.md @@ -0,0 +1,11 @@ +Changelog +========= + + +(unreleased) +------------ +- More bugfixes. [Simon Diesenreiter] +- Fix linting errors. [Simon Diesenreiter] +- Initial commit. [Simon Diesenreiter] + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..ef198d6 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +include LICENSE +include HISTORY.md +include Containerfile +graft tests +graft project_name diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ceb6b7c --- /dev/null +++ b/Makefile @@ -0,0 +1,67 @@ +.ONESHELL: + +.PHONY: issetup +issetup: + @[ -f .git/hooks/commit-msg ] || (echo "You must run 'make setup' first to initialize the repo!" && exit 1) + +.PHONY: setup +setup: + @cp .gitea/conventional_commits/commit-msg .git/hooks/ + +.PHONY: help +help: ## Show the help. + @echo "Usage: make " + @echo "" + @echo "Targets:" + @fgrep "##" Makefile | fgrep -v fgrep + +.PHONY: buildrel +buildrel: issetup ## Format code. + dotnet build -c Release project_name.sln + +.PHONY: build +build: issetup ## Format code. + dotnet build project_name.sln + +.PHONY: publish +publish: issetup ## Format code. + dotnet publish -c Release project_name.sln + +.PHONY: fmt +fmt: issetup ## Format code. + dotnet format project_name.sln + +.PHONY: lint +lint: issetup ## Lint code. + dotnet format --verify-no-changes --verbosity diagnostic project_name.sln + +.PHONY: test +test: issetup ## Run tests and generate coverage report. + dotnet test project_name.sln + +.PHONY: clean +clean: issetup ## Clean unused files. + dotnet clean project_name.sln + +.PHONY: release +release: issetup ## Create a new tag for release. + @echo "WARNING: This operation will create a version tag and push to gitea" + @read -p "Version? (provide the next x.y.z semver) : " TAG; echo "$$TAG" > project_name/VERSION + @gitchangelog > HISTORY.md + @git add project_name/VERSION HISTORY.md + @git commit -m "release: version $$(cat project_name/VERSION) 🚀" + @echo "creating git tag : $$(cat project_name/VERSION)" + @git tag $$(cat project_name/VERSION) + @git push -u origin HEAD --tags + @echo "Gitea Actions will detect the new tag and release the new version." + +.PHONY: docs +docs: issetup ## Build the documentation. + @echo "building documentation ..." + @mkdocs build + URL="site/index.html"; xdg-open $$URL || sensible-browser $$URL || x-www-browser $$URL || gnome-open $$URL || open $$URL + +# This project has been generated from rochacbruno/python-project-template +# __author__ = 'rochacbruno' +# __repo__ = https://github.com/rochacbruno/python-project-template +# __sponsor__ = https://github.com/sponsors/rochacbruno/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..76882e0 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ + +# Dotnet Project Template + +A low dependency and really simple to start project template for Python Projects. + +See also +- [Dotnet-Executable-Template](https://git.disi.dev/Templates/Dotnet_Executable/) for a library template. + +### HOW TO USE THIS TEMPLATE + +1. Create a new repository from this template and choose a name for your project + (e.g. `my_awesome_project` - recommendation is to use underscores separation for repo names.) +2. Wait until the first run of CI finishes (Gitea Actions will process the template and commit to your new repo) +3. Read the file [CONTRIBUTING.md](CONTRIBUTING.md) +4. Then clone your new project and happy coding! + +> **NOTE**: **WAIT** until first CI run on gitea actions before cloning your new project. + +### What is included on this template? + +- 🖼️ Templates for starting multiple application types: + **Run `make init` after cloning to generate a new project based on a template.** +- 🤖 A [Makefile](Makefile) with the most useful commands to install, test, lint, format and release your project. +- 📃 Documentation structure using [mkdocs](http://www.mkdocs.org) +- 💬 Auto generation of change log using **gitchangelog** to keep a HISTORY.md file automatically based on your commit history on every release. +- 🐋 A simple [Containerfile](Containerfile) to build a container image for your project. + `Containerfile` is a more open standard for building container images than Dockerfile, you can use buildah or docker with this file. +- 🧪 Testing structure +- ✅ Code linting +- 🎯 Entry points to execute your program with basic CLI argument parsing. +- 🔄 Continuous integration using [Gitea Actions](.gitea/workflows/) with jobs to lint, test and release your project on Linux, Mac and Windows environments. + + + +--- +# project_name + +project_description + +## Usage + +TODO: dotnet sample code on usage + +## Development + +Read the [CONTRIBUTING.md](CONTRIBUTING.md) file. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..000ea34 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,17 @@ +# Welcome to MkDocs + +For full documentation visit [mkdocs.org](https://www.mkdocs.org). + +## Commands + +* `mkdocs new [dir-name]` - Create a new project. +* `mkdocs serve` - Start the live-reloading docs server. +* `mkdocs build` - Build the documentation site. +* `mkdocs -h` - Print help message and exit. + +## Project layout + + mkdocs.yml # The configuration file. + docs/ + index.md # The documentation homepage. + ... # Other markdown pages, images and other files. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..33a69ca --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,2 @@ +site_name: project_name +theme: readthedocs diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..1550c4a --- /dev/null +++ b/nuget.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/project_name.Tests/UnitTest1.cs b/project_name.Tests/UnitTest1.cs new file mode 100644 index 0000000..2e6a555 --- /dev/null +++ b/project_name.Tests/UnitTest1.cs @@ -0,0 +1,14 @@ +namespace project_name.Tests; + +using project_name; + +public class UnitTest1 +{ + [Fact] + public void Test1() + { + var hwp = new HelloWorldProvider(); + Assert.Equal("Hello, Simon!", hwp.GetHelloWorld("Simon")); + Assert.Equal("Hello world!", hwp.GetHelloWorld()); + } +} diff --git a/project_name.Tests/project_name.Tests.csproj b/project_name.Tests/project_name.Tests.csproj new file mode 100644 index 0000000..184e6f4 --- /dev/null +++ b/project_name.Tests/project_name.Tests.csproj @@ -0,0 +1,26 @@ + + + + net9.0 + enable + enable + false + true + + + + + + + + + + + + + + + + + + diff --git a/project_name.sln b/project_name.sln new file mode 100644 index 0000000..5098aa7 --- /dev/null +++ b/project_name.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "project_name", "project_name\project_name.csproj", "{5AF6E15A-7BFC-49EB-AC97-A2AA1B131608}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "project_name.Tests", "project_name.Tests\project_name.Tests.csproj", "{FD1B8A2E-3BA7-4FDD-96FB-18551A15A5F3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B25F5E39-D0A6-4548-A3B6-428275AB154D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B25F5E39-D0A6-4548-A3B6-428275AB154D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B25F5E39-D0A6-4548-A3B6-428275AB154D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B25F5E39-D0A6-4548-A3B6-428275AB154D}.Release|Any CPU.Build.0 = Release|Any CPU + {FD1B8A2E-3BA7-4FDD-96FB-18551A15A5F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD1B8A2E-3BA7-4FDD-96FB-18551A15A5F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD1B8A2E-3BA7-4FDD-96FB-18551A15A5F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD1B8A2E-3BA7-4FDD-96FB-18551A15A5F3}.Release|Any CPU.Build.0 = Release|Any CPU + {5AF6E15A-7BFC-49EB-AC97-A2AA1B131608}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AF6E15A-7BFC-49EB-AC97-A2AA1B131608}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AF6E15A-7BFC-49EB-AC97-A2AA1B131608}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AF6E15A-7BFC-49EB-AC97-A2AA1B131608}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/project_name/HelloWorldProvider.cs b/project_name/HelloWorldProvider.cs new file mode 100644 index 0000000..141d83a --- /dev/null +++ b/project_name/HelloWorldProvider.cs @@ -0,0 +1,16 @@ +namespace project_name; + +public class HelloWorldProvider +{ + public string GetHelloWorld(string? name = null) + { + if (string.IsNullOrEmpty(name)) + { + return "Hello world!"; + } + else + { + return $"Hello, {name}!"; + } + } +} diff --git a/project_name/VERSION b/project_name/VERSION new file mode 100644 index 0000000..17e51c3 --- /dev/null +++ b/project_name/VERSION @@ -0,0 +1 @@ +0.1.1 diff --git a/project_name/project_name.csproj b/project_name/project_name.csproj new file mode 100644 index 0000000..125f4c9 --- /dev/null +++ b/project_name/project_name.csproj @@ -0,0 +1,9 @@ + + + + net9.0 + enable + enable + + +