[Git][debian-gis-team/geolinks][master] 13 commits: Update branch in gbp.conf & Vcs-Git URL.

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Sun Jun 11 12:11:08 BST 2023



Bas Couwenberg pushed to branch master at Debian GIS Project / geolinks


Commits:
41a2cb9f by Bas Couwenberg at 2023-02-26T17:40:36+01:00
Update branch in gbp.conf & Vcs-Git URL.

- - - - -
314978ae by Bas Couwenberg at 2023-02-26T17:40:51+01:00
New upstream version 0.2.1
- - - - -
b1677a27 by Bas Couwenberg at 2023-02-26T17:40:52+01:00
Update upstream source from tag 'upstream/0.2.1'

Update to upstream version '0.2.1'
with Debian dir 53ad13feb8098f8bbb76c789c55d4ee6bb1059a6
- - - - -
41feb86c by Bas Couwenberg at 2023-02-26T17:41:09+01:00
New upstream release.

- - - - -
e8c0d64a by Bas Couwenberg at 2023-02-26T17:45:16+01:00
Update copyright file.

- - - - -
00af0769 by Bas Couwenberg at 2023-02-26T17:45:27+01:00
Drop patches, applied upstream.

- - - - -
3adef746 by Bas Couwenberg at 2023-02-26T17:50:41+01:00
Add python3-click to build dependencies.

- - - - -
78efd8fb by Bas Couwenberg at 2023-02-26T17:57:56+01:00
Set PYTHONPATH to fix version import.

- - - - -
0005f7e8 by Bas Couwenberg at 2023-02-26T18:15:32+01:00
Override dh_auto_test to run test script.

- - - - -
030437f8 by Bas Couwenberg at 2023-02-26T18:17:09+01:00
Update lintian overrides.

- - - - -
64919edd by Bas Couwenberg at 2023-02-26T18:17:09+01:00
Set distribution to experimental.

- - - - -
ef15c19e by Bas Couwenberg at 2023-06-11T13:03:48+02:00
Revert "Update branch in gbp.conf & Vcs-Git URL."

This reverts commit 41a2cb9fb53bea0b8f4062b2a8a5f7ae0fa92c1a.

- - - - -
d9c8b794 by Bas Couwenberg at 2023-06-11T13:04:02+02:00
Move from experimental to unstable.

- - - - -


23 changed files:

- + .github/workflows/main.yml
- + .gitignore
- + CODE_OF_CONDUCT.md
- + CONTRIBUTING.md
- + LICENSE.md
- + MANIFEST.in
- − PKG-INFO
- README.md
- + SECURITY.md
- debian/changelog
- debian/control
- debian/copyright
- + debian/lintian-overrides
- − debian/patches/no-distutils.patch
- − debian/patches/series
- debian/rules
- geolinks/__init__.py
- + pyproject.toml
- + requirements-dev.txt
- + requirements.txt
- setup.py
- + tests/run_tests.py
- + tests/test_data.json


Changes:

=====================================
.github/workflows/main.yml
=====================================
@@ -0,0 +1,34 @@
+name: build ⚙️
+
+on: [ push, pull_request ]
+
+jobs:
+  main:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: [3.7, 3.8]
+    steps:
+    - uses: actions/checkout at v2
+    - uses: actions/setup-python at v2
+      name: Setup Python ${{ matrix.python-version }}
+      with:
+        python-version: ${{ matrix.python-version }}
+    - name: Install system dependencies 📦
+      run: sudo apt-get install -y dh-python devscripts fakeroot debhelper python3-all python3-setuptools
+    - name: Install requirements 📦
+      run: |
+        python3 -m pip install --upgrade pip
+        pip3 install -r requirements.txt
+        pip3 install -r requirements-dev.txt
+    - name: Install package 📦
+      run: python3 setup.py install
+    - name: run tests ⚙️
+      run: python3 setup.py test
+    - name: run flake8 ⚙️
+      run: flake8
+    - name: build Python package 🏗️
+      run: python3 setup.py sdist bdist_wheel --universal
+    - name: build Debian package 🏗️
+      run: sudo debuild -b -uc -us
+


=====================================
.gitignore
=====================================
@@ -0,0 +1,56 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+bin/
+build/
+develop-eggs/
+dist/
+eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.cache
+nosetests.xml
+coverage.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+# Rope
+.ropeproject
+
+# Django stuff:
+*.log
+*.pot
+
+# Sphinx documentation
+docs/_build/
+
+# build artefacts
+MANIFEST


=====================================
CODE_OF_CONDUCT.md
=====================================
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at tomkralidis at gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq


=====================================
CONTRIBUTING.md
=====================================
@@ -0,0 +1,101 @@
+# Contributing to geolinks
+
+We welcome contributions to geolinks, in the form of issues, bug fixes, or
+suggestions for enhancements. This document sets out our guidelines and best
+practices for such contributions.
+
+It's based on the [Contributing to Open Source Projects
+Guide](https://contribution-guide-org.readthedocs.io/).
+
+geolinks has the following modes of contribution:
+
+- GitHub Commit Access
+- GitHub Pull Requests
+
+## Code of Conduct
+
+Contributors to this project are expected to act respectfully toward others in accordance with the [OSGeo Code of Conduct](https://www.osgeo.org/code_of_conduct).
+
+## Submitting Bugs
+
+### Due Diligence
+
+Before submitting a bug, please do the following:
+
+* Perform __basic troubleshooting__ steps:
+
+    * __Make sure you're on the latest version.__ If you're not on the most
+      recent version, your problem may have been solved already! Upgrading is
+      always the best first step.
+    * [__Search the issue
+      tracker__](https://github.com/geopython/geolinks/issues)
+      to make sure it's not a known issue.
+
+### What to put in your bug report
+
+Make sure your report gets the attention it deserves: bug reports with missing
+information may be ignored or punted back to you, delaying a fix.  The below
+constitutes a bare minimum; more info is almost always better:
+
+* __What version of Python are you using?__ For example, are you using Python
+  2.7, Python 3.7, PyPy 2.0?
+* __What operating system are you using?__ Windows (7, 8, 10, 32-bit, 64-bit),
+  Mac OS X,  (10.7.4, 10.9.0), GNU/Linux (which distribution, which version?)
+  Again, more detail is better.
+* __Which version or versions of the software are you using?__ Ideally, you've
+  followed the advice above and are on the latest version, but please confirm
+  this.
+* __How can the we recreate your problem?__ Imagine that we have never used
+  geolinks before and have downloaded it for the first time. Exactly what steps
+  do we need to take to reproduce your problem?
+
+## Contributions and Licensing
+
+### Contributor License Agreement
+
+Your contribution will be under our [license](https://github.com/geopython/geolinks/blob/master/LICENSE.md) as per [GitHub's terms of service](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license).
+
+### GitHub Commit Access
+
+* Proposals to provide developers with GitHub commit access shall be emailed to the geolinks [mailing list](https://lists.osgeo.org/mailman/listinfo/geolinks). Proposals shall be approved by the geolinks development team.  Committers shall be added by the project admin.
+* Removal of commit access shall be handled in the same manner.
+
+### GitHub Pull Requests
+
+* Pull requests may include copyright in the source code header by the contributor if the contribution is significant or the contributor wants to claim copyright on their contribution.
+* All contributors shall be listed at https://github.com/geopython/geolinks/graphs/contributors
+* Unclaimed copyright, by default, is assigned to the main copyright holders as specified in https://github.com/geopython/geolinks/blob/master/LICENSE.md
+
+### Version Control Branching
+
+* Always __make a new branch__ for your work, no matter how small. This makes
+  it easy for others to take just that one set of changes from your repository,
+  in case you have multiple unrelated changes floating around.
+
+    * __Don't submit unrelated changes in the same branch/pull request!__ If it
+      is not possible to review your changes quickly and easily, we may reject
+      your request.
+
+* __Base your new branch off of the appropriate branch__ on the main repository:
+
+    * In general the released version of geolinks is based on the ``master``
+      (default) branch whereas development work is done under other non-default
+      branches. Unless you are sure that your issue affects a non-default
+      branch, __base your branch off the ``master`` one__.
+
+* Note that depending on how long it takes for the dev team to merge your
+  patch, the copy of ``master`` you worked off of may get out of date! 
+    * If you find yourself 'bumping' a pull request that's been sidelined for a
+      while, __make sure you rebase or merge to latest ``master``__ to ensure a
+        speedier resolution.
+
+### Code Formatting
+
+* __Please follow the coding conventions and style used in the geolinks repository.__ 
+* geolinks endeavours to follow the
+  [PEP-8](http://www.python.org/dev/peps/pep-0008/) guidelines.
+
+## Suggesting Enhancements
+
+We welcome suggestions for enhancements, but reserve the right to reject them
+if they do not follow future plans for geolinks.


=====================================
LICENSE.md
=====================================
@@ -0,0 +1,23 @@
+# The MIT License (MIT)
+
+Copyright © 2014-2022 Tom Kralidis
+
+* * *
+
+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.


=====================================
MANIFEST.in
=====================================
@@ -0,0 +1 @@
+include README.md


=====================================
PKG-INFO deleted
=====================================
@@ -1,56 +0,0 @@
-Metadata-Version: 1.1
-Name: geolinks
-Version: 0.2.0
-Summary: Utilities to deal with geospatial links
-Home-page: https://github.com/geopython/geolinks
-Author: Tom Kralidis
-Author-email: tomkralidis at gmail.com
-License: MIT
-Description: [![Build Status](https://travis-ci.org/geopython/geolinks.png)](https://travis-ci.org/geopython/geolinks)
-        
-        geolinks
-        ========
-        
-        Utilities to deal with geospatial links.  Working implementation
-        of the Cat-Interop work at https://github.com/OSGeo/Cat-Interop
-        
-        Install
-        -------
-        
-        ```bash
-        pip install geolinks
-        ```
-        
-        Use
-        ---
-        
-        ```python
-        >>> from geolinks import sniff_link
-        >>> sniff_link('http://host/wms?service=WMS')
-        'OGC:WMS'
-        >>> sniff_link('http://host/wms?service=WPS')
-        'OGC:WPS'
-        >>> sniff_link('http://host/wms?service=CSW')
-        'OGC:CSW'
-        >>> sniff_link('http://host/data/roads.kmz')
-        'OGC:KML'
-        >>> sniff_link('http://host/data/roads.kml')
-        'OGC:KML'
-        ```
-        
-Keywords: links geo protocol url href
-Platform: all
-Classifier: Development Status :: 4 - Beta
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: Science/Research
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Topic :: Scientific/Engineering :: GIS


=====================================
README.md
=====================================
@@ -1,20 +1,49 @@
-[![Build Status](https://travis-ci.org/geopython/geolinks.png)](https://travis-ci.org/geopython/geolinks)
+[![Build Status](https://github.com/geopython/geolinks/workflows/build%20%E2%9A%99%EF%B8%8F/badge.svg)](https://github.com/geopython/geolinks/actions)
 
-geolinks
-========
+# geolinks
 
 Utilities to deal with geospatial links.  Working implementation
 of the Cat-Interop work at https://github.com/OSGeo/Cat-Interop
 
-Install
--------
+## Installation
 
+geolinks is best installed and used within a Python virtualenv.
+
+### Requirements
+
+* Python 3 and above
+* Python [virtualenv](https://virtualenv.pypa.io/) package
+
+### Dependencies
+
+Dependencies are listed in [requirements.txt](requirements.txt). Dependencies
+are automatically installed during geolinks's installation.
+
+### Installing the Package
+
+from source:
+```bash
+python3 -m venv my-env
+cd my-env
+. bin/activate
+git clone https://github.com/geopython/geolinks.git
+cd geolinks
+python setup.py build
+python setup.py install
+```
+
+via pip:
 ```bash
 pip install geolinks
 ```
 
-Use
----
+## Running
+
+```bash
+geolinks link sniff 'http://host/wms?service=WMS'
+```
+
+## Using the API from Python
 
 ```python
 >>> from geolinks import sniff_link
@@ -29,3 +58,52 @@ Use
 >>> sniff_link('http://host/data/roads.kml')
 'OGC:KML'
 ```
+
+### Running Tests
+
+```bash
+# via setuptools
+python setup.py test
+# manually
+cd tests
+python run_tests.py
+```
+
+## Development
+
+### Setting up a Development Environment
+
+Same as installing a package.  Use a virtualenv.  Also install developer
+requirements:
+
+```bash
+pip install -r requirements-dev.txt
+```
+
+## Releasing
+
+```bash
+vi geolinks/__init__.py
+git commit -m 'update release version' geolinks/__init__.py
+vi debian/changelog  # add changelog entry and summary of updates
+# push changes
+git push origin master
+git tag -a x.y.z -m 'tagging release x.y.z'
+# push tag
+git push --tags
+rm -fr build dist *.egg-info
+python setup.py sdist bdist_wheel --universal
+twine upload dist/*
+```
+
+### Code Conventions
+
+* [PEP8](https://www.python.org/dev/peps/pep-0008)
+
+### Bugs and Issues
+
+All bugs, enhancements and issues are managed on [GitHub](https://github.com/geopython/geolinks/issues).
+
+## Contact
+
+* [Tom Kralidis](https://github.com/tomkralidis)


=====================================
SECURITY.md
=====================================
@@ -0,0 +1,15 @@
+# geolinks Security Policy
+
+## Reporting
+
+Security/vulnerability reports **should not** be submitted through GitHub issues or public discussions, but instead please send your report 
+to **geopython-security nospam @ lists.osgeo.org** - (remove the blanks and 'nospam').  
+
+## Supported Versions
+
+geolinks developers will release patches for security vulnerabilities for the following versions:
+
+| Version | Supported          |
+| ------- | ------------------ |
+| latest stable version | :white_check_mark: |
+| previous versions | :x:                |


=====================================
debian/changelog
=====================================
@@ -1,13 +1,25 @@
-geolinks (0.2.0-7) UNRELEASED; urgency=medium
+geolinks (0.2.1-1) unstable; urgency=medium
 
   * Team upload.
+  * Move from experimental to unstable.
+
+ -- Bas Couwenberg <sebastic at debian.org>  Sun, 11 Jun 2023 13:03:52 +0200
+
+geolinks (0.2.1-1~exp1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release.
   * Update watch file to use GitHub tags.
   * Bump Standards-Version to 4.6.2, no changes.
   * Drop unused repacksuffix from watch file.
-  * Add patch to not use deprecated distutils module.
   * Add pybuild-plugin-pyproject to build dependencies.
+  * Update copyright file.
+  * Add python3-click to build dependencies.
+  * Set PYTHONPATH to fix version import.
+  * Override dh_auto_test to run test script.
+  * Update lintian overrides.
 
- -- Bas Couwenberg <sebastic at debian.org>  Sat, 17 Dec 2022 15:42:32 +0100
+ -- Bas Couwenberg <sebastic at debian.org>  Sun, 26 Feb 2023 17:45:51 +0100
 
 geolinks (0.2.0-6) unstable; urgency=medium
 


=====================================
debian/control
=====================================
@@ -7,8 +7,9 @@ Priority: optional
 Build-Depends: debhelper-compat (= 12),
                dh-python,
                pybuild-plugin-pyproject,
-               python3-setuptools,
                python3-all,
+               python3-click,
+               python3-setuptools
 Standards-Version: 4.6.2
 Vcs-Browser: https://salsa.debian.org/debian-gis-team/geolinks
 Vcs-Git: https://salsa.debian.org/debian-gis-team/geolinks.git


=====================================
debian/copyright
=====================================
@@ -3,11 +3,11 @@ Upstream-Name: geolinks
 Source: https://github.com/geopython/geolinks
 
 Files: *
-Copyright: 2014-2015 Tom Kralidis <tomkralidis at gmail.com>
+Copyright: 2014-2023, Tom Kralidis <tomkralidis at gmail.com>
 License: MIT
 
 Files: debian/*
-Copyright: 2014-2015 Johan Van de Wauw <johan at vandewauw.be>
+Copyright: 2014-2015, Johan Van de Wauw <johan at vandewauw.be>
 License: MIT
 
 License: MIT


=====================================
debian/lintian-overrides
=====================================
@@ -0,0 +1,3 @@
+# Not worth the effort
+no-manual-page *
+


=====================================
debian/patches/no-distutils.patch deleted
=====================================
@@ -1,23 +0,0 @@
-Description: Don't use deprecated distutils module.
-Author: Bas Couwenberg <sebastic at debian.org>
-Forwarded: https://github.com/geopython/geolinks/pull/9
-Applied-Upstream: https://github.com/geopython/geolinks/commit/87a2c8be979edecf5afc9cbf22a65a7d669d3491
-
---- /dev/null
-+++ b/pyproject.toml
-@@ -0,0 +1,3 @@
-+[build-system]
-+requires = ["setuptools"]
-+build-backend = "setuptools.build_meta"
---- a/setup.py
-+++ b/setup.py
-@@ -27,8 +27,8 @@
- #
- # =================================================================
- 
--from distutils.core import setup
- from geolinks import __version__ as version
-+from setuptools import setup
- 
- setup(
-     name='geolinks',


=====================================
debian/patches/series deleted
=====================================
@@ -1 +0,0 @@
-no-distutils.patch


=====================================
debian/rules
=====================================
@@ -2,6 +2,14 @@
 # -*- makefile -*-
 
 export PYBUILD_NAME=geolinks
+export PYBUILD_BEFORE_TEST=cp -r {dir}/tests {build_dir}
+export PYBUILD_AFTER_TEST=rm -rf {build_dir}/tests
+export PYTHONPATH=$(CURDIR)
+
 
 %:
 	dh  $@ --with python3 --buildsystem pybuild
+
+override_dh_auto_test:
+	PYBUILD_SYSTEM=custom \
+	PYBUILD_TEST_ARGS="{interpreter} tests/run_tests.py -v" dh_auto_test


=====================================
geolinks/__init__.py
=====================================
@@ -2,7 +2,7 @@
 #
 # Authors: Tom Kralidis <tomkralidis at gmail.com>
 #
-# Copyright (c) 2014 Tom Kralidis
+# Copyright (c) 2023 Tom Kralidis
 #
 # Permission is hereby granted, free of charge, to any person
 # obtaining a copy of this software and associated documentation
@@ -28,14 +28,40 @@
 # =================================================================
 
 import logging
+import sys
+from typing import Union
+
+import click
 
 LOGGER = logging.getLogger(__name__)
 
-__version__ = '0.2.0'
+__version__ = '0.2.1'
+
+
+def CLICK_OPTION_VERBOSITY(f):
+    logging_options = ['ERROR', 'WARNING', 'INFO', 'DEBUG']
+
+    def callback(ctx, param, value):
+        if value is not None:
+            logging.basicConfig(stream=sys.stdout,
+                                level=getattr(logging, value))
+        return True
+
+    return click.option('--verbosity', '-v',
+                        type=click.Choice(logging_options),
+                        help='Verbosity',
+                        callback=callback)(f)
 
 
-def inurl(needles, haystack, position='any'):
-    """convenience function to make string.find return bool"""
+def inurl(needles, haystack, position='any') -> bool:
+    """
+    convenience function to find a given value in a URL
+
+    :param needles: `list` of patterns to test
+    :param haystack: value to search / detect for patterns
+
+    returns: `bool` of assessment
+    """
 
     count = 0
 
@@ -60,8 +86,14 @@ def inurl(needles, haystack, position='any'):
     return False
 
 
-def sniff_link(url):
-    """performs basic heuristics to detect what the URL is"""
+def sniff_link(url) -> Union[str, None]:
+    """
+    performs basic heuristics to detect what the URL is
+
+    :param url: `str` of URL
+
+    :returns: possible link type or `None`
+    """
 
     protocol = None
     link = url.strip()
@@ -108,3 +140,32 @@ def sniff_link(url):
         LOGGER.info('No link type detected')
 
     return protocol
+
+
+ at click.group()
+ at click.version_option(version=__version__)
+def cli():
+    pass
+
+
+ at click.group()
+def link():
+    """Link utilities"""
+    pass
+
+
+ at click.command()
+ at click.argument('link')
+ at CLICK_OPTION_VERBOSITY
+def sniff(link, verbosity):
+    """Sniff link"""
+
+    click.echo(f'Sniffing link: {link}')
+
+    link_type = sniff_link(link)
+
+    click.echo(f'Link type: {link_type}')
+
+
+link.add_command(sniff)
+cli.add_command(link)


=====================================
pyproject.toml
=====================================
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"


=====================================
requirements-dev.txt
=====================================
@@ -0,0 +1,3 @@
+flake8
+twine
+wheel


=====================================
requirements.txt
=====================================
@@ -0,0 +1 @@
+click


=====================================
setup.py
=====================================
@@ -2,7 +2,7 @@
 #
 # Authors: Tom Kralidis <tomkralidis at gmail.com>
 #
-# Copyright (c) 2014 Tom Kralidis
+# Copyright (c) 2022 Tom Kralidis
 #
 # Permission is hereby granted, free of charge, to any person
 # obtaining a copy of this software and associated documentation
@@ -27,14 +27,56 @@
 #
 # =================================================================
 
-from distutils.core import setup
+import io
+import os
+import re
+import sys
+
 from geolinks import __version__ as version
+from setuptools import Command, find_packages, setup
+
+
+class PyTest(Command):
+    user_options = []
+
+    def initialize_options(self):
+        pass
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        import subprocess
+        errno = subprocess.call([sys.executable, 'tests/run_tests.py'])
+        raise SystemExit(errno)
+
+
+def read(filename, encoding='utf-8'):
+    """read file contents"""
+    full_path = os.path.join(os.path.dirname(__file__), filename)
+    with io.open(full_path, encoding=encoding) as fh:
+        return fh.read().strip()
+
+
+def get_package_version():
+    """get version from top-level package init"""
+    version_file = read('geolinks/__init__.py')
+    version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
+                              version_file, re.M)
+    if version_match:
+        return version_match.group(1)
+    raise RuntimeError("Unable to find version string.")
+
+
+LONG_DESCRIPTION = read('README.md')
+
 
 setup(
     name='geolinks',
     version=version,
     description='Utilities to deal with geospatial links',
-    long_description=open('README.md').read(),
+    long_description=LONG_DESCRIPTION,
+    long_description_content_type='text/markdown',
     license='MIT',
     platforms='all',
     keywords='links geo protocol url href',
@@ -43,7 +85,12 @@ setup(
     maintainer='Tom Kralidis',
     maintainer_email='tomkralidis at gmail.com',
     url='https://github.com/geopython/geolinks',
-    packages=['geolinks'],
+    packages=find_packages(),
+    entry_points={
+        'console_scripts': [
+            'geolinks=geolinks:cli'
+        ]
+    },
     classifiers=[
         'Development Status :: 4 - Beta',
         'Environment :: Console',
@@ -52,12 +99,9 @@ setup(
         'License :: OSI Approved :: MIT License',
         'Operating System :: OS Independent',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.6',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.3',
-        'Programming Language :: Python :: 3.4',
+        'Programming Language :: Python :: 3.5',
         'Topic :: Scientific/Engineering :: GIS',
-    ]
+    ],
+    cmdclass={'test': PyTest},
+    test_suite='tests.run_tests'
 )


=====================================
tests/run_tests.py
=====================================
@@ -0,0 +1,67 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2022 Tom Kralidis
+#
+# 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.
+#
+# =================================================================
+
+import json
+import os.path
+import unittest
+
+from geolinks import sniff_link
+
+
+class GeolinksTest(unittest.TestCase):
+    """Test suite for package Foo"""
+    def setUp(self):
+        """setup test fixtures, etc."""
+
+        test_data = None
+
+        if os.path.exists('test_data.json'):
+            test_data = 'test_data.json'
+        elif os.path.exists('tests/test_data.json'):
+            test_data = 'tests/test_data.json'
+        else:
+            raise FileNotFoundError()
+
+        with open(test_data) as f:
+            self.test_data = json.load(f)
+
+    def tearDown(self):
+        """return to pristine state"""
+        pass
+
+    def test_link_types(self):
+        """simple link type tests"""
+
+        for test in self.test_data['test_data']:
+            self.assertEqual(sniff_link(test['link']), test['expected'],
+                             f"Expected {test['link']} and {test['expected']} to be equal")  # noqa
+
+
+if __name__ == '__main__':
+    unittest.main()


=====================================
tests/test_data.json
=====================================
@@ -0,0 +1,22 @@
+{
+    "test_data": [
+        {"link": "http://host/wms?service=WMS", "expected": "OGC:WMS"},
+        {"link": "http://host/ows?service=WFS", "expected": "OGC:WFS"},
+        {"link": "http://host/ows?service=WCS", "expected": "OGC:WCS"},
+        {"link": "http://host/ows?service=WPS", "expected": "OGC:WPS"},
+        {"link": "http://host/csw?service=CSW", "expected": "OGC:CSW"},
+        {"link": "http://host/data/roads.kmz", "expected": "OGC:KML"},
+        {"link": "http://host/data/roads.kml", "expected": "OGC:KML"},
+        {"link": "http://host/data/data.html", "expected": "WWW:LINK"},
+        {"link": "http://host/download/admin.mpk", "expected": "ESRI:MPK"},
+        {"link": "http://host/data.7z", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/data.tgz", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/data/data.zip", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/data/data.gz", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/data/file.gml", "expected": "OGC:GML"},
+        {"link": "http://host/data/file.gml.gz", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/data.tar.gz", "expected": "WWW:DOWNLOAD"},
+        {"link": "http://host/sos?service=SOS&request=GetObservation", "expected": "OGC:SOS"},
+        {"link": "http://host/sos?service=SOS&request=GetObservation", "expected": "OGC:SOS"}
+    ]
+}



View it on GitLab: https://salsa.debian.org/debian-gis-team/geolinks/-/compare/77c3d4fcab9b544a90cefdfb60b9c048a2dc7dda...d9c8b794e942d6da6e5d0dea0260f4a38392bd16

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/geolinks/-/compare/77c3d4fcab9b544a90cefdfb60b9c048a2dc7dda...d9c8b794e942d6da6e5d0dea0260f4a38392bd16
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20230611/d5d895e1/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list