Skip to content

Commit fcdf31a

Browse files
authored
ADSECGH-61: add pre commit configuration and workflow (#97)
* feat: added gitignore for .venv python environment * feat: added configuration for pre-commit * ci: made sure tests only run on pre-push * ci: added ci for pre-commit on workflow or PRs
1 parent a1ae929 commit fcdf31a

File tree

4 files changed

+132
-2
lines changed

4 files changed

+132
-2
lines changed

.github/workflows/pre-commit.yml

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
name: Pre-commit checks
2+
3+
on:
4+
pull_request:
5+
types: [opened, edited, reopened, synchronize]
6+
branches:
7+
- main
8+
workflow_call:
9+
inputs:
10+
mark_as_draft:
11+
required: false
12+
type: boolean
13+
description: Mark PR as draft if checks fail
14+
default: false
15+
skip_hooks:
16+
required: false
17+
type: string
18+
description: Comma separated list of pre-commit hook ids to skip
19+
default: ''
20+
21+
env:
22+
MARK_AS_DRAFT: ${{ github.event.inputs.mark_as_draft }}
23+
24+
jobs:
25+
pre-commit:
26+
runs-on: ubuntu-latest
27+
steps:
28+
- name: Setup python
29+
uses: actions/setup-python@v5
30+
31+
- name: Checkout Repository
32+
uses: actions/checkout@v4
33+
with:
34+
fetch-depth: 0
35+
36+
- name: Get changed files
37+
id: changed-files
38+
env:
39+
GITHUB_BASE_REF: ${{ github.base_ref }}
40+
GITHUB_HEAD_REF: ${{ github.head_ref }}
41+
run: |
42+
FILES=$(git diff --name-only "origin/$GITHUB_BASE_REF" "origin/$GITHUB_HEAD_REF" | awk '{printf("\"%s\" ",$0)} END { printf "\n" }')
43+
echo "files=$FILES" >> "$GITHUB_OUTPUT"
44+
45+
- uses: pre-commit/[email protected]
46+
env:
47+
SKIP: ${{ inputs.skip_hooks }}
48+
with:
49+
extra_args: --files ${{ steps.changed-files.outputs.files }}
50+
51+
- name: Mark as draft
52+
if: failure() && env.MARK_AS_DRAFT
53+
uses: voiceflow/draft-pr@latest
54+
with:
55+
token: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/.idea
22
/results
33
/.vs
4+
/.venv
45
packages
56
AdSecGH/bin
67
AdSecGH/obj

.pre-commit-config.yaml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
default_stages: [pre-commit]
2+
3+
repos:
4+
- repo: local
5+
hooks:
6+
7+
- id: dotnet-build
8+
name: Build
9+
entry: msbuild /p:AppxBundlePlatforms="x64" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload /m /nr:false
10+
language: system
11+
pass_filenames: false
12+
stages: [pre-push]
13+
always_run: true
14+
15+
- id: dotnet-format
16+
name: Format
17+
entry: dotnet format --exclude-diagnostics --verify-no-changes --verbosity diagnostic AdSecGH.sln
18+
language: system
19+
pass_filenames: false
20+
always_run: true
21+
22+
- id: dotnet-test-coverage
23+
name: Run dotnet tests with coverage
24+
entry: powershell.exe -NoProfile -ExecutionPolicy Bypass -File coverage.ps1
25+
stages: [pre-push]
26+
language: system
27+
28+
- repo: https://github.com/commitizen-tools/commitizen
29+
rev: v3.13.0
30+
hooks:
31+
- id: commitizen
32+
stages: [commit-msg]
33+
34+
# this should go last since it will fix line endings broken by other tools
35+
- repo: https://github.com/pre-commit/pre-commit-hooks
36+
rev: v4.5.0
37+
hooks:
38+
- id: check-added-large-files
39+
- id: check-case-conflict
40+
- id: check-yaml
41+
- id: check-ast
42+
- id: check-merge-conflict
43+
- id: double-quote-string-fixer
44+
- id: trailing-whitespace
45+
exclude: .github
46+
args: [--markdown-linebreak-ext=md]
47+
- id: end-of-file-fixer

README.md

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
# AdSec-Grasshopper
2+
23
![Downloads](https://img.shields.io/badge/dynamic/json?color=success&label=downloads&query=download_count&url=https%3A%2F%2Fyak.rhino3d.com%2Fpackages%2Fadsec&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB3SURBVHgB7ZRBDoAgDASr8SH8/1PwE6yHJogEd5UeNMyNpN2hhFTEmQUtzMqpUUH6VnFmCqbASaBfPuaKRk1NhAXu6G1Ca4oOR21gHIyEDyckz8MByfvwjoQLty5Qcht+yUMEDGXe91fFVh5GPpNhEyQZT5JfsAN5UByV3bhHmAAAAABJRU5ErkJggg==) [![Install plugin](https://img.shields.io/badge/install-Food4Rhino-green?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADxSURBVHgB3ZTtDcIgEIaPxgHqBnUCV3CEbmA3cAVXcIJ2A0foCm7QOoHdAF8SGgFpORB/6JO8oSUH3Acc0ZcRHCMpZYmhgSYhREe5wQGtfNHHrOVGIK1FgJgUTLvLwnceVA3m/FAkG44RMjJh74kSsHKZ4qHhhLcu3Bok838HjHq8QVtop7/zgBpX0Fm3hnnuIHmU2r7RKmMO5nD1tZTgk1dRYRgoAXV1C2ezEzRAtTF9pDTGtxkn5NYJOYTKe6UdfMxOxr7kDrpDe8iMktdhAx7Wjq11u5b2ZEfg89C0/7gXKY/X/rmbrNE7ti0nRb/PEyfNcxAV2WX+AAAAAElFTkSuQmCC)](https://www.food4rhino.com/en/app/adsec)
34

4-
AdSec-Grasshopper is a plugin for Grasshopper wrapping Oasys AdSec's .NET API. The plugin allows users of Grasshopper to create, edit and analyse AdSec models seemlesly.
5+
AdSec-Grasshopper is a plugin for Grasshopper wrapping Oasys AdSec's .NET API. The plugin allows users of Grasshopper to create, edit and analyse AdSec models seemlesly.
56

67
| Latest | CI Pipeline | Unit Tests | Deployment | Dependencies |
78
| ------ | ----------- | ---------- | ---------- | ------------ |
89
| [![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/arup-group/AdSec-Grasshopper?include_prereleases&logo=github&style=flat-square)](https://github.com/arup-group/AdSec-Grasshopper/releases) <br /> ![Yak](https://img.shields.io/badge/dynamic/json?color=blue&label=yak&prefix=v&query=version&url=https%3A%2F%2Fyak.rhino3d.com%2Fpackages%2Fadsec&logo=rhinoceros&style=flat-square) <br /> ![Nuget](https://img.shields.io/nuget/vpre/adsecgh?logo=nuget&style=flat-square) | ![Azure DevOps builds](https://img.shields.io/azure-devops/build/oasys-software/89fd051d-5c77-48bf-9b0e-05bca3e3e596/138?logo=azurepipelines&style=flat-square&label=Azure%20Pipelines) <br /> ![GitHub branch checks state](https://img.shields.io/github/checks-status/arup-group/adsec-grasshopper/main?logo=github&style=flat-square) | [![codecov](https://img.shields.io/codecov/c/github/arup-group/adsec-grasshopper?logo=codecov&logoColor=white&&style=flat-square)](https://codecov.io/gh/arup-group/AdSec-Grasshopper) <br /> ![Azure DevOps tests](https://img.shields.io/azure-devops/tests/oasys-software/OASYS%2520libraries/138/main?compact_message&logo=azurepipelines&style=flat-square) | ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/arup-group/adsec-grasshopper/github-release-yak.yml?label=Push%20AdSecGH%20Yak%20package&logo=rhinoceros&style=flat-square) <br /> ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/arup-group/adsec-grasshopper/github-release-nuget.yml?label=Push%20AdSecGH%20NuGet%20package&logo=nuget&style=flat-square) | ![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/arup-group/adsec-grasshopper?logo=nuget&style=flat-square) <br /> ![Dependents (via libraries.io)](https://img.shields.io/librariesio/dependents/nuget/adsecgh?logo=librariesdotio&logoColor=white) |
910

1011
## Documentation
12+
1113
[![Docs](https://img.shields.io/badge/Docs-AdSec%20API-125DA9?logo=readme&logoColor=white&style=flat-square)](https://arup-group.github.io/oasys-combined/adsec-api/)
1214

1315
AdSecGH documentation tbd
1416

1517
## Example Files
18+
1619
[![ExampleFiles](https://img.shields.io/badge/Grasshopper-Example%20Files-green?logo=data:image/png;base64,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&style=flat-square)](/ExampleFiles)
1720

1821
This repository contains a number of example files that are also used for testing on new releases, please check out the [ExampleFiles folder](/ExampleFiles) for a growing list of Grasshopper files.
1922

2023
## Contributing
21-
![GitHub pull requests](https://img.shields.io/github/issues-pr-raw/arup-group/adsec-grasshopper?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADNSURBVHgB7VXbDcMgDHSjDpCRMgojZIOwQdMJ6CYZiRFco7qSi3gYSqV+5KSTcOTzEZAOgH8EIm7QgyAkeuat0IPQijAQX3DEB69tanivQdi1E3Uw8anhEQ6iyc2dSp5Rfcn0LURXvZdwHOKIHK/3TA9yPRNX8TdLzWQXzTbTs8Z3IIwPqEHusNBjonpmmYcRBi26CX6M0+A0GGwg8wQzcZ2CSoeKuP5Kh5W4LhgUdS1xrcWH7irWd+Im4sTwtxr0Oo7r95tsQYle3RA8AW71bDMxGCXJAAAAAElFTkSuQmCC)
24+
25+
![GitHub pull requests](https://img.shields.io/github/issues-pr-raw/arup-group/adsec-grasshopper?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADNSURBVHgB7VXbDcMgDHSjDpCRMgojZIOwQdMJ6CYZiRFco7qSi3gYSqV+5KSTcOTzEZAOgH8EIm7QgyAkeuat0IPQijAQX3DEB69tanivQdi1E3Uw8anhEQ6iyc2dSp5Rfcn0LURXvZdwHOKIHK/3TA9yPRNX8TdLzWQXzTbTs8Z3IIwPqEHusNBjonpmmYcRBi26CX6M0+A0GGwg8wQzcZ2CSoeKuP5Kh5W4LhgUdS1xrcWH7irWd+Im4sTwtxr0Oo7r95tsQYle3RA8AW71bDMxGCXJAAAAAElFTkSuQmCC)
2226
![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed-raw/arup-group/adsec-grasshopper?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACbSURBVHgBnVJbEYAgELwIRCCCEYxgBJtoBBsYwQhGuQhEOL2Zc1wRFNgZPoB9sABRA0TEncNTC1QoN1ytWJMZDHyNXg1WEM+xs/8RjyDeKNOpy4iVE4zDjzBLv7BnDBg4Q4qwAKGP9qZk74jk8IiwPoCY6QvqjknWm20epOTJIsEGhiOVQPvLGyvVQF8Ce0vDd+3AwFML7AKLkg/1iD3k8fl0tQAAAABJRU5ErkJggg==)
2327
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/arup-group/adsec-grasshopper?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAC7SURBVHgB7VWBDYMwDMt2wU7gBE7ZCftg/WD9YPuAE3bCTukJOyEkUpBCRdsUgRAISxUlqe1ErVqAE2sDEQMmwPkr7AVUcBN3YyE5Gp7JFeLBZED5tyqGSa1RvCkaUO6uxL9q7kriEk8bRCQvMa9MXjlxyfF/SBl0QvpFcRd1NSmeBS185ki8Dzg+KVXi3PJfiI/Cuo+MG1ihKutgafDGqZbtVVUYDCeihROHw2WYJO+OucIE/u7nwdkMPUCUeIAsCfP+AAAAAElFTkSuQmCC)
2428
![GitHub top language](https://img.shields.io/github/languages/top/arup-group/adsec-grasshopper?logo=dotnet&style=flat-square)
@@ -28,14 +32,37 @@ Pull requests are welcome. For major changes, please open an issue first to disc
2832

2933
Please make sure to update tests as appropriate.
3034

35+
## Development
36+
37+
You will need to setup [pre-commit](https://pre-commit.com/) for doing development.
38+
39+
```bash
40+
# Setup virtual environment (.venv is excluded by default on the gitignore)
41+
python -m venv .venv
42+
# Activate virtual environment
43+
.\.venv\Scripts\activate
44+
# Install pre-commit
45+
pip install pre-commit
46+
# Install commitizen
47+
pip install Commitizen
48+
# Install and Add commit-msg and pre-push hook types
49+
pre-commit install --hook-type commit-msg --hook-type pre-push
50+
# Setup Hooks (repeat on new branches where the configuration might be different)
51+
pre-commit install
52+
```
53+
54+
55+
3156
## License
57+
3258
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADLSURBVHgB7ZPRDcIwDESvnYAROgIbkA1ghG7CKDACTNBs0m5QNgiO5I/IuLGLhJCgT7JUWXe5OHKBvyIxazytckhIC8gghQDHLYf0PoN1eFe7jZzE45NPdC6+T/Bj+yh5J8adc09oXiawfG0lOYt62FR9ZcBRMQfY+Hw8mmQWGu2Jqr6mNEOhIaRG6y35yieKiu4Gm+jy8S5feeRcF+cWmT43WoBFiw+zBXw/oNGavGY91YFqz+1OyB5UE9edKtK/NcEDBYxpPSN+kidmAJvClBsULQAAAABJRU5ErkJggg==)](/LICENSE)
3359

3460
The plugin is free to download but can only be loaded with a license for AdSec API available. Contact Oasys for a free trial. For licensing of AdSec and AdSec API refer to Oasys Software [licensing terms](https://www.oasys-software.com/support/licensing-of-oasys-software/).
3561

3662
For third party packages used by AdSec-Grasshopper, the individual licenses apply. See a list of these in the ['License'](/AdSecGH/licenses) subfolder of each project.
3763

3864
## About
65+
3966
[![AdSec](https://img.shields.io/badge/Oasys-AdSec-125DA9?style=flat-square&logoWidth=35&logo=data:image/png;base64,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)](https://www.oasys-software.com/products/adsec/)
4067

4168
AdSec-Grasshopper is a plugin for Grasshopper wrapping Oasys AdSec's [.NET API](https://arup-group.github.io/oasys-combined/adsec-api/). The plugin allows users of Grasshopper to create, edit and analyse AdSec sections seemlesly. AdSecGH requires a licensed version of [AdSec API](https://www.oasys-software.com/products/adsec/).

0 commit comments

Comments
 (0)