haloviewer 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. haloviewer-0.2.0/.github/workflows/release.yml +41 -0
  2. haloviewer-0.2.0/.gitignore +9 -0
  3. haloviewer-0.2.0/.gitlab-ci.yml +392 -0
  4. haloviewer-0.2.0/LICENSE +200 -0
  5. haloviewer-0.2.0/LICENSE-EUPL-1.2.txt +15 -0
  6. haloviewer-0.2.0/PKG-INFO +198 -0
  7. haloviewer-0.2.0/README.md +177 -0
  8. haloviewer-0.2.0/ci_build_deb.sh +281 -0
  9. haloviewer-0.2.0/debian/control +15 -0
  10. haloviewer-0.2.0/debian/copyright +208 -0
  11. haloviewer-0.2.0/debian/rules +3 -0
  12. haloviewer-0.2.0/debian/source/format +1 -0
  13. haloviewer-0.2.0/docs/api.rst +132 -0
  14. haloviewer-0.2.0/docs/cli.rst +174 -0
  15. haloviewer-0.2.0/docs/conf.py +96 -0
  16. haloviewer-0.2.0/docs/index.rst +214 -0
  17. haloviewer-0.2.0/docs/sync.rst +162 -0
  18. haloviewer-0.2.0/docs/viewer.rst +212 -0
  19. haloviewer-0.2.0/environment.yml +28 -0
  20. haloviewer-0.2.0/haloviewer/__init__.py +69 -0
  21. haloviewer-0.2.0/haloviewer/_metadata.py +44 -0
  22. haloviewer-0.2.0/haloviewer/_version.py +24 -0
  23. haloviewer-0.2.0/haloviewer/api.py +566 -0
  24. haloviewer-0.2.0/haloviewer/cli.py +150 -0
  25. haloviewer-0.2.0/haloviewer/data.py +450 -0
  26. haloviewer-0.2.0/haloviewer/gui.py +1303 -0
  27. haloviewer-0.2.0/haloviewer/halosync.py +1369 -0
  28. haloviewer-0.2.0/haloviewer/hpl.py +661 -0
  29. haloviewer-0.2.0/haloviewer/plotting.py +515 -0
  30. haloviewer-0.2.0/haloviewer/scan.py +269 -0
  31. haloviewer-0.2.0/haloviewer.egg-info/PKG-INFO +198 -0
  32. haloviewer-0.2.0/haloviewer.egg-info/SOURCES.txt +47 -0
  33. haloviewer-0.2.0/haloviewer.egg-info/dependency_links.txt +1 -0
  34. haloviewer-0.2.0/haloviewer.egg-info/entry_points.txt +4 -0
  35. haloviewer-0.2.0/haloviewer.egg-info/requires.txt +9 -0
  36. haloviewer-0.2.0/haloviewer.egg-info/scm_file_list.json +42 -0
  37. haloviewer-0.2.0/haloviewer.egg-info/scm_version.json +8 -0
  38. haloviewer-0.2.0/haloviewer.egg-info/top_level.txt +1 -0
  39. haloviewer-0.2.0/pyproject.toml +47 -0
  40. haloviewer-0.2.0/setup.cfg +4 -0
  41. haloviewer-0.2.0/tests/conftest.py +27 -0
  42. haloviewer-0.2.0/tests/data/RHI_77_20260921_000812.hpl +101 -0
  43. haloviewer-0.2.0/tests/data/VAD_77_20260921_000721.hpl +143 -0
  44. haloviewer-0.2.0/tests/data/VAD_77_20260921_000721_empty.hpl +17 -0
  45. haloviewer-0.2.0/tests/data/VAD_77_20260921_000721_truncated.hpl +132 -0
  46. haloviewer-0.2.0/tests/test_api_cli.py +328 -0
  47. haloviewer-0.2.0/tests/test_data_and_plotting.py +293 -0
  48. haloviewer-0.2.0/tests/test_halosync.py +50 -0
  49. haloviewer-0.2.0/tests/test_scan.py +57 -0
@@ -0,0 +1,41 @@
1
+ name: Create Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v[0-9]+\.[0-9]+\.[0-9]+' # Escaped dots for literal matching
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+
14
+ steps:
15
+ - name: Checkout code
16
+ uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+
20
+ - name: Generate changelog
21
+ id: changelog
22
+ run: |
23
+ PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
24
+ if [ -z "$PREVIOUS_TAG" ]; then
25
+ COMMITS=$(git log --pretty=format:"- %s" HEAD)
26
+ else
27
+ COMMITS=$(git log --pretty=format:"- %s" $PREVIOUS_TAG..HEAD)
28
+ fi
29
+ echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT
30
+ echo "$COMMITS" >> $GITHUB_OUTPUT
31
+ echo "EOF" >> $GITHUB_OUTPUT
32
+
33
+ - name: Create Release
34
+ uses: softprops/action-gh-release@v2
35
+ with:
36
+ name: Release ${{ github.ref_name }}
37
+ body: |
38
+ ## Changes in ${{ github.ref_name }}
39
+
40
+ ${{ steps.changelog.outputs.CHANGELOG }}
41
+ prerelease: ${{ contains(github.ref_name, '-') }}
@@ -0,0 +1,9 @@
1
+ # generated by setuptools-scm
2
+ haloviewer/_version.py
3
+ # Sphinx output
4
+ build/
5
+ docs/_generated/
6
+ # Python
7
+ __pycache__/
8
+ *.egg-info/
9
+ .pytest_cache/
@@ -0,0 +1,392 @@
1
+ workflow:
2
+ # Run if tag starts v0.00.00 indicating a release
3
+ # or pipeline ist started manually in gitlab
4
+ rules:
5
+ - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+.*/
6
+ - if: $CI_PIPELINE_SOURCE == "web" || $CI_JOB_MANUAL == "true"
7
+
8
+ variables:
9
+ GIT_DEPTH: 0 # Global for setuptools_scm
10
+
11
+ stages:
12
+ - test
13
+ - build
14
+ - release
15
+
16
+ cache:
17
+ paths:
18
+ - .cache/pip
19
+
20
+ # Test stage - run on tags only
21
+ test_latest:
22
+ image: ubuntu:latest
23
+ stage: test
24
+ before_script:
25
+ - apt-get update && apt-get install -y git python3-pip
26
+ # Install system dependencies for GDAL
27
+ - apt-get install -y gdal-bin libgdal-dev
28
+ - apt-get install -y python3-build python3-setuptools-scm python3-gdal
29
+ - export GDAL_CONFIG=/usr/bin/gdal-config # Help pip find GDAL
30
+ # Ensure git tags are available for setuptools_scm
31
+ - git fetch --tags
32
+ # Install package with test dependencies
33
+ - pip install --break-system-packages -e .
34
+ script:
35
+ - |
36
+ PKG_NAME=$(python3 -c "
37
+ import tomllib
38
+ with open('pyproject.toml', 'rb') as f:
39
+ data = tomllib.load(f)
40
+ print(data.get('project', {}).get('name', ''))
41
+ ")
42
+ if [ -z "$PKG_NAME" ]; then
43
+ echo "ERROR: could not determine package name from pyproject.toml" >&2
44
+ exit 1
45
+ fi
46
+ echo "Package name: $PKG_NAME"
47
+ export PKG_NAME
48
+ - echo "Running compile test..."
49
+ - python3 -m py_compile ${PKG_NAME}/*.py
50
+ - echo "Running flake8 style check..."
51
+ - flake8 ${PKG_NAME} --max-line-length=88 --ignore=E501,W503 || true
52
+ - echo "Running tests..."
53
+ - python3 -m pytest tests/ -v || true
54
+ rules:
55
+ - if: '$CI_COMMIT_TAG'
56
+
57
+ build_sdist:
58
+ image: python:latest
59
+ stage: build
60
+ before_script:
61
+ - git fetch --tags # Ensure tags are available
62
+ - pip install build setuptools setuptools-scm wheel
63
+ script:
64
+ - python -m setuptools_scm # This will show what version setuptools-scm detects
65
+ - git describe --tags --dirty # Show current git state
66
+ - python -m build -n --sdist
67
+ - echo 'ls dist/*tar.gz'
68
+ - ls dist/*tar.gz
69
+ - echo 'cd dist && ls *tar.gz'
70
+ - echo "$( cd dist && ls *tar.gz )"
71
+ - echo "BUILD_VERSION=$( cd dist && ls *tar.gz )" >> build.env
72
+ - echo "BUILD_JOB=${CI_JOB_ID}" >> build.env
73
+ artifacts:
74
+ paths:
75
+ - dist
76
+ reports:
77
+ dotenv: build.env
78
+
79
+ build_pages:
80
+ image: python:latest
81
+ stage: build
82
+ rules:
83
+ - exists:
84
+ - docs/conf.py
85
+ needs:
86
+ - job: build_sdist
87
+ artifacts: true
88
+ before_script:
89
+ - git fetch --tags
90
+ script:
91
+ - pip install build setuptools_scm
92
+ - pip install sphinx sphinx-argparse sphinx-rtd-theme myst-parser numpy pandas
93
+ - pip install --no-deps -e . # Install package so docs can import it
94
+ - BUILDING_SPHINX=true sphinx-build -b html docs build/sphinx/html
95
+ - mv build/sphinx/html/ public/
96
+ artifacts:
97
+ paths:
98
+ - public
99
+
100
+ build_deb:
101
+ stage: build
102
+ image: $PUBLISHER:$DISTRIB
103
+ rules:
104
+ # "exists" matches file paths, not directory names, so this has to
105
+ # point at an actual file inside debian/ -- a bare "debian" never
106
+ # matches, since there is no file literally named "debian".
107
+ - exists:
108
+ - debian/control
109
+ needs:
110
+ - job: build_sdist
111
+ artifacts: true
112
+ - job: test_latest
113
+ script:
114
+ - export DEBIAN_FRONTEND=noninteractive
115
+ - apt update
116
+ - apt-get -y install gawk dh-python debhelper dh-make
117
+ - apt-get -y install python3-all
118
+ - apt-get -y install python3-numpy python3-pandas
119
+ - apt-get -y install python3-setuptools python3-stdeb
120
+ - apt-get -y install python3-setuptools-scm python3-build
121
+ - apt-get -y install gpg
122
+ - bash -x ./ci_build_deb.sh $BUILD_VERSION
123
+ - echo "DEB_${DISTRIB^^}_VERSION=$( cd deb_dist/$DISTRIB && ls *deb )" | tee -a build.env
124
+ - echo "DEB_${DISTRIB^^}_JOB=${CI_JOB_ID}" | tee -a build.env
125
+ - echo "DEB_${DISTRIB^^}_VENDOR=${PUBLISHER}" | tee -a build.env
126
+ - cat build.env
127
+ artifacts:
128
+ paths:
129
+ - deb_dist
130
+ reports:
131
+ dotenv: build.env
132
+ parallel:
133
+ matrix:
134
+ - PUBLISHER: ubuntu
135
+ DISTRIB:
136
+ - noble
137
+ - resolute
138
+ - PUBLISHER: debian
139
+ DISTRIB:
140
+ - bookworm
141
+ - trixie
142
+
143
+ release_pages:
144
+ image: python:latest
145
+ stage: release
146
+ # deploy only if a release (no ".devX" or "+"in version string):
147
+ rules:
148
+ - if: $CI_COMMIT_TAG && $CI_COMMIT_TAG !~ /(\.dev|\+)/
149
+ exists:
150
+ - docs/conf.py
151
+ needs:
152
+ - job: build_pages
153
+ artifacts: true
154
+ - job: build_deb
155
+ optional: true
156
+ script:
157
+ - touch public
158
+ pages: true
159
+ artifacts:
160
+ paths:
161
+ - public
162
+
163
+
164
+ release_pypi:
165
+ image: python:latest
166
+ stage: release
167
+ rules:
168
+ # Release
169
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
170
+ when: on_success
171
+ needs:
172
+ - job: build_deb
173
+ optional: true
174
+ - job: build_sdist
175
+ artifacts: true
176
+ script:
177
+ - pip install twine
178
+ - twine check dist/*tar.gz
179
+ - |
180
+ PKG_NAME=$(python3 -c "
181
+ import tomllib
182
+ with open('pyproject.toml', 'rb') as f:
183
+ data = tomllib.load(f)
184
+ print(data.get('project', {}).get('name', ''))
185
+ ")
186
+ if [ -z "$PKG_NAME" ]; then
187
+ echo "ERROR: could not determine package name from pyproject.toml" >&2
188
+ exit 1
189
+ fi
190
+ echo "Package name: $PKG_NAME"
191
+ # Version comes from the already-built sdist filename, not
192
+ # pyproject.toml, since setuptools_scm makes the version dynamic
193
+ # (no static "version" field to read there).
194
+ SDIST=$(ls dist/${PKG_NAME}-*.tar.gz | head -n1)
195
+ VERSION=$(basename "$SDIST" .tar.gz | sed "s/^${PKG_NAME}-//")
196
+ if [ -z "$VERSION" ]; then
197
+ echo "ERROR: could not determine version from sdist filename" >&2
198
+ exit 1
199
+ fi
200
+ echo "Version: $VERSION"
201
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "https://pypi.org/pypi/${PKG_NAME}/${VERSION}/json")
202
+ if [ "$HTTP_CODE" = "200" ]; then
203
+ echo "Version ${VERSION} of ${PKG_NAME} is already on PyPI, skipping upload."
204
+ else
205
+ twine upload --repository-url https://upload.pypi.org/legacy/ --username __token__ --password $PYPI_ID_TOKEN dist/*tar.gz
206
+ fi
207
+
208
+ test_pypi:
209
+ image: python:latest
210
+ stage: release
211
+ rules:
212
+ # Pre-releases: v1.2.3a1, v1.2.3-alpha1, v1.2.3b2, v1.2.3-beta2, v1.2.3rc3, v1.2.3-rc3
213
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+(-(alpha|beta|rc|a|b)\d+|a\d+|b\d+|rc\d+)$/'
214
+ when: on_success
215
+ needs:
216
+ - job: build_deb
217
+ optional: true
218
+ - job: build_sdist
219
+ artifacts: true
220
+ script:
221
+ - pip install twine
222
+ - twine check dist/*tar.gz
223
+ - twine upload --repository-url https://test.pypi.org/legacy/ --username __token__ --password $TEST_PYPI_ID_TOKEN dist/*tar.gz
224
+
225
+ gitlab-release:
226
+ image: ubuntu:latest
227
+ stage: release
228
+ rules:
229
+ # Release
230
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
231
+ when: on_success
232
+ # Pre-releases: v1.2.3a1, v1.2.3-alpha1, v1.2.3b2, v1.2.3-beta2, v1.2.3rc3, v1.2.3-rc3
233
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+(-(alpha|beta|rc|a|b)\d+|a\d+|b\d+|rc\d+)$/ && $CI_COMMIT_TAG !~ /dev/'
234
+ when: on_success
235
+ needs:
236
+ - job: build_sdist
237
+ artifacts: true
238
+ - job: build_deb
239
+ artifacts: true
240
+ optional: true
241
+ - job: test_latest
242
+ before_script:
243
+ - echo "Running the release job."
244
+ - apt update
245
+ - apt -y install curl jq
246
+ - curl --location --output /usr/local/bin/release-cli "https://gitlab.com/api/v4/projects/gitlab-org%2Frelease-cli/packages/generic/release-cli/latest/release-cli-linux-amd64"
247
+ - chmod +x /usr/local/bin/release-cli
248
+ script:
249
+ - echo "Running the release job."
250
+ - export SDIST_NAME="Python install package - ${BUILD_VERSION}"
251
+ - echo SDIST_NAME $SDIST_NAME
252
+ - 'export SDIST_URL=${CI_PROJECT_URL}/-/jobs/${BUILD_JOB}/artifacts/raw/dist/${BUILD_VERSION}'
253
+ - echo SDIST_URL $SDIST_URL
254
+ - export ASSET_ARGS='[{"name":"'$SDIST_NAME'","url":"'$SDIST_URL'"}'
255
+ - echo ASSET_ARGS $ASSET_ARGS
256
+ # this part only runs if deb_dist has run AND produced packages
257
+ - DISTRIBUTIONS=$([ -d deb_dist ] && ls deb_dist | tr "\n" " " || echo "")
258
+ - |
259
+ for DISTRIB in $DISTRIBUTIONS; do
260
+ echo distrib $DISTRIB
261
+ echo DISTRIB ${DISTRIB^^}
262
+ VERNAM=DEB_${DISTRIB^^}_VERSION
263
+ echo VERNAM $VERNAM
264
+ JOBNAM=DEB_${DISTRIB^^}_JOB
265
+ echo JOBNAM $JOBNAM
266
+ name="binary install package for $DISTRIB - ${!VERNAM}"
267
+ echo name $name
268
+ url="${CI_PROJECT_URL}/-/jobs/${!JOBNAM}/artifacts/raw/deb_dist/${DISTRIB}/${!VERNAM}"
269
+ echo url $url
270
+ asset_info='{"name":"'$name'","url":"'$url'"}'
271
+ echo asset_info $asset_info
272
+ ASSET_ARGS="$ASSET_ARGS, $asset_info"
273
+ done
274
+ ASSET_ARGS=$ASSET_ARGS']'
275
+ - echo "..."
276
+ - 'jq . <<< $ASSET_ARGS'
277
+ - echo "..."
278
+ - if [[ "$CI_COMMIT_TAG" == "" ]]; then echo "CI_COMMIT_TAG is empty"; exit 0; fi
279
+ - echo "..."
280
+ - 'echo release-cli create --name "$CI_COMMIT_TAG" --tag-name "$CI_COMMIT_TAG" --description "$CI_COMMIT_MESSAGE" --ref "$CI_COMMIT_TAG" --assets-link "$( jq -c . <<< $ASSET_ARGS )"'
281
+ - 'release-cli create --name "$CI_COMMIT_TAG" --tag-name "$CI_COMMIT_TAG" --description "$CI_COMMIT_MESSAGE" --ref "$CI_COMMIT_TAG" --assets-link "$( jq -c . <<< $ASSET_ARGS )"'
282
+
283
+ merge_github:
284
+ stage: release
285
+ image: alpine
286
+ dependencies: [] # don't download artifacts from other jobs
287
+ rules:
288
+ # Release
289
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
290
+ before_script:
291
+ - apk add --update git
292
+ script:
293
+ - git config --global user.email "$GITLAB_USER_EMAIL"
294
+ - git config --global user.name "$GITLAB_USER_NAME"
295
+ - git remote set-url origin "https://ci_access_token:$CI_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME.git"
296
+ - git fetch origin github main --tags
297
+ # Checkout github branch
298
+ - git checkout github 2>/dev/null || git checkout -b github origin/github
299
+ # Squash merge main into github
300
+ - git merge --squash origin/main -X theirs --allow-unrelated-histories 2>&1 | tee git.out || true
301
+ # Exit gracefully if nothing new
302
+ - if grep -q "Already up to date" git.out; then echo "Nothing to merge"; exit 0; fi
303
+ # Resolve any remaining conflicts by taking version from main
304
+ - git diff --name-only --diff-filter=U | xargs -r git checkout origin/main --
305
+ # Stage all changes and commit
306
+ - git add -A
307
+ - git diff-index --quiet --cached HEAD || git commit -m "Squash merge main into github ($CI_COMMIT_TAG)"
308
+ - git push origin github
309
+ # Push tag to github branch
310
+ - if [ -n "$CI_COMMIT_TAG" ]; then git push origin $CI_COMMIT_TAG; fi
311
+
312
+ release_deb:
313
+ image: ubuntu:latest
314
+ stage: release
315
+ rules:
316
+ # Release -- only if debian packaging exists (same condition as
317
+ # build_deb), otherwise this job is dropped from the pipeline instead
318
+ # of failing on the missing build_deb dependency.
319
+ - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
320
+ exists:
321
+ - debian/control
322
+ when: on_success
323
+ needs:
324
+ - job: build_sdist
325
+ artifacts: true
326
+ - job: build_deb
327
+ artifacts: true
328
+ optional: true
329
+ before_script:
330
+ - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
331
+ - mkdir -p ~/.ssh
332
+ - chmod 700 ~/.ssh
333
+ - cp $SSH_PRIVATE_KEY ~/.ssh/id_rsa
334
+ - chmod 600 ~/.ssh/id_rsa
335
+ - eval $(ssh-agent -s)
336
+ - ssh-add ~/.ssh/id_rsa
337
+ - apt install -y curl dupload gnupg
338
+ - curl ifconfig.me
339
+ - ssh-keyscan -H 'uwmhub.uni-trier.de' >> ~/.ssh/known_hosts
340
+ # Populate a local keyring so dupload's openpgp-check has something
341
+ # to verify the already-signed .changes files against. This only
342
+ # needs the CI signing key's public half -- we reuse the same File
343
+ # variable ci_build_deb.sh uses for signing, since importing it
344
+ # also brings in the public key.
345
+ - gpg --batch --import "$SIGNING_PRIVATE_KEY"
346
+ - gpg --export --output ~/pubring.gpg
347
+ script:
348
+ - ls -l
349
+ - export RESDIR="deb_dist"
350
+ - ls -l $RESDIR
351
+ - |
352
+ cat > ~/.dupload.conf << EOF
353
+ package config;
354
+ \$default_host = "uwmhub";
355
+ \$cfg{'uwmhub'} = {
356
+ fqdn => "uwmhub.uni-trier.de",
357
+ method => "scp",
358
+ login => "reprepro",
359
+ incoming => "/home/reprepro/incoming/",
360
+ # files pass on to dinstall which sends emails itself
361
+ dinstall_runs => 1,
362
+ keyrings => ["$HOME/pubring.gpg"],
363
+ };
364
+ EOF
365
+ - cat ~/.dupload.conf
366
+ - |
367
+ for X in $( ls $RESDIR ); do
368
+ pushd $RESDIR/$X
369
+ ls -l
370
+ VENDNAM="DEB_${X^^}_VENDOR"
371
+ VEND="${!VENDNAM}"
372
+ if [ -z "$VEND" ]; then
373
+ echo "ERROR: no vendor recorded for distribution '$X' (missing $VENDNAM)" >&2
374
+ exit 1
375
+ fi
376
+ for Y in *.changes; do
377
+ cat $Y
378
+ NAMESRC=$(awk -F': ' '/^Source:/{print $2}' "$Y")
379
+ VERSION=$(awk -F': ' '/^Version:/{print $2}' "$Y")
380
+ echo "checking for ${NAMESRC} ${VERSION} in ${VEND}/${X}"
381
+ if ssh reprepro@uwmhub.uni-trier.de \
382
+ "reprepro -b /home/reprepro/repo/${VEND} list ${X} ${NAMESRC}" \
383
+ | awk '{print $NF}' | grep -qxF "${VERSION}"; then
384
+ echo "Package ${NAMESRC} ${VERSION} already in repo for ${X}, skipping upload."
385
+ else
386
+ dupload -f --nomail -t uwmhub "$Y"
387
+ fi
388
+ sleep 60
389
+ done
390
+ popd
391
+ done
392
+ - echo "Ende"
@@ -0,0 +1,200 @@
1
+ HaloViewer
2
+ (c) 2026 Clemens Drüe, Universität Trier
3
+ developed with support of Anthropic Claude Opus 5.5
4
+
5
+ Licensed under the European Union Public Licence v. 1.2 (EUPL-1.2).
6
+ The full licence text follows. Official translations into all EU
7
+ languages: https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
8
+
9
+ ----------------------------------------------------------------------
10
+
11
+ EUROPEAN UNION PUBLIC LICENCE v. 1.2
12
+ EUPL © the European Union 2007, 2016
13
+
14
+ This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the
15
+ terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such
16
+ use is covered by a right of the copyright holder of the Work).
17
+ The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following
18
+ notice immediately following the copyright notice for the Work:
19
+ Licensed under the EUPL
20
+ or has expressed by any other means his willingness to license under the EUPL.
21
+
22
+ 1.Definitions
23
+ In this Licence, the following terms have the following meaning:
24
+ — ‘The Licence’:this Licence.
25
+ — ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available
26
+ as Source Code and also as Executable Code as the case may be.
27
+ — ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or
28
+ modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work
29
+ required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in
30
+ the country mentioned in Article 15.
31
+ — ‘The Work’:the Original Work or its Derivative Works.
32
+ — ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and
33
+ modify.
34
+ — ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by
35
+ a computer as a program.
36
+ — ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence.
37
+ — ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to
38
+ the creation of a Derivative Work.
39
+ — ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the
40
+ Licence.
41
+ — ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating,
42
+ transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential
43
+ functionalities at the disposal of any other natural or legal person.
44
+
45
+ 2.Scope of the rights granted by the Licence
46
+ The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for
47
+ the duration of copyright vested in the Original Work:
48
+ — use the Work in any circumstance and for all usage,
49
+ — reproduce the Work,
50
+ — modify the Work, and make Derivative Works based upon the Work,
51
+ — communicate to the public, including the right to make available or display the Work or copies thereof to the public
52
+ and perform publicly, as the case may be, the Work,
53
+ — distribute the Work or copies thereof,
54
+ — lend and rent the Work or copies thereof,
55
+ — sublicense rights in the Work or copies thereof.
56
+ Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the
57
+ applicable law permits so.
58
+ In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed
59
+ by law in order to make effective the licence of the economic rights here above listed.
60
+ The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the
61
+ extent necessary to make use of the rights granted on the Work under this Licence.
62
+
63
+ 3.Communication of the Source Code
64
+ The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as
65
+ Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with
66
+ each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to
67
+ the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to
68
+ distribute or communicate the Work.
69
+
70
+ 4.Limitations on copyright
71
+ Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the
72
+ exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations
73
+ thereto.
74
+
75
+ 5.Obligations of the Licensee
76
+ The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those
77
+ obligations are the following:
78
+
79
+ Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to
80
+ the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the
81
+ Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work
82
+ to carry prominent notices stating that the Work has been modified and the date of modification.
83
+
84
+ Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this
85
+ Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless
86
+ the Original Work is expressly distributed only under this version of the Licence — for example by communicating
87
+ ‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the
88
+ Work or Derivative Work that alter or restrict the terms of the Licence.
89
+
90
+ Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both
91
+ the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done
92
+ under the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed
93
+ in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with
94
+ his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail.
95
+
96
+ Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide
97
+ a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available
98
+ for as long as the Licensee continues to distribute or communicate the Work.
99
+ Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names
100
+ of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
101
+ reproducing the content of the copyright notice.
102
+
103
+ 6.Chain of Authorship
104
+ The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or
105
+ licensed to him/her and that he/she has the power and authority to grant the Licence.
106
+ Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or
107
+ licensed to him/her and that he/she has the power and authority to grant the Licence.
108
+ Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions
109
+ to the Work, under the terms of this Licence.
110
+
111
+ 7.Disclaimer of Warranty
112
+ The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work
113
+ and may therefore contain defects or ‘bugs’ inherent to this type of development.
114
+ For the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind
115
+ concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or
116
+ errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this
117
+ Licence.
118
+ This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work.
119
+
120
+ 8.Disclaimer of Liability
121
+ Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be
122
+ liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the
123
+ Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss
124
+ of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However,
125
+ the Licensor will be liable under statutory product liability laws as far such laws apply to the Work.
126
+
127
+ 9.Additional agreements
128
+ While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services
129
+ consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole
130
+ responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify,
131
+ defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by
132
+ the fact You have accepted any warranty or additional liability.
133
+
134
+ 10.Acceptance of the Licence
135
+ The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window
136
+ displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of
137
+ applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms
138
+ and conditions.
139
+ Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You
140
+ by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution
141
+ or Communication by You of the Work or copies thereof.
142
+
143
+ 11.Information to the public
144
+ In case of any Distribution or Communication of the Work by means of electronic communication by You (for example,
145
+ by offering to download the Work from a remote location) the distribution channel or media (for example, a website)
146
+ must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence
147
+ and the way it may be accessible, concluded, stored and reproduced by the Licensee.
148
+
149
+ 12.Termination of the Licence
150
+ The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms
151
+ of the Licence.
152
+ Such a termination will not terminate the licences of any person who has received the Work from the Licensee under
153
+ the Licence, provided such persons remain in full compliance with the Licence.
154
+
155
+ 13.Miscellaneous
156
+ Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the
157
+ Work.
158
+ If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or
159
+ enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid
160
+ and enforceable.
161
+ The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of
162
+ the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence.
163
+ New versions of the Licence will be published with a unique version number.
164
+ All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take
165
+ advantage of the linguistic version of their choice.
166
+
167
+ 14.Jurisdiction
168
+ Without prejudice to specific agreement between parties,
169
+ — any litigation resulting from the interpretation of this License, arising between the European Union institutions,
170
+ bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice
171
+ of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union,
172
+ — any litigation arising between other parties and resulting from the interpretation of this License, will be subject to
173
+ the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business.
174
+
175
+ 15.Applicable Law
176
+ Without prejudice to specific agreement between parties,
177
+ — this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat,
178
+ resides or has his registered office,
179
+ — this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside
180
+ a European Union Member State.
181
+
182
+
183
+ Appendix
184
+
185
+ ‘Compatible Licences’ according to Article 5 EUPL are:
186
+ — GNU General Public License (GPL) v. 2, v. 3
187
+ — GNU Affero General Public License (AGPL) v. 3
188
+ — Open Software License (OSL) v. 2.1, v. 3.0
189
+ — Eclipse Public License (EPL) v. 1.0
190
+ — CeCILL v. 2.0, v. 2.1
191
+ — Mozilla Public Licence (MPL) v. 2
192
+ — GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
193
+ — Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software
194
+ — European Union Public Licence (EUPL) v. 1.1, v. 1.2
195
+ — Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+).
196
+
197
+ The European Commission may update this Appendix to later versions of the above licences without producing
198
+ a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the
199
+ covered Source Code from exclusive appropriation.
200
+ All other changes or additions to this Appendix require the production of a new EUPL version.
@@ -0,0 +1,15 @@
1
+ European Union Public Licence V. 1.2 (EUPL-1.2)
2
+
3
+ The file windlidarviewer/hpl.py in this repository is adapted from
4
+ the `hpl` module of the cdruee/python-readmet package
5
+ (https://github.com/cdruee/python-readmet), which is distributed under
6
+ the terms of the European Union Public Licence, Version 1.2 ("EUPL").
7
+
8
+ The full licence text is available at:
9
+ https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12
10
+
11
+ and from the original project's LICENSE.txt at:
12
+ https://github.com/cdruee/python-readmet/blob/master/LICENSE.txt
13
+
14
+ Only windlidarviewer/hpl.py is covered by the EUPL; see LICENSE.txt
15
+ at the project root for the licence covering the rest of this project.