Repository: geomet/geomet (language: python)

Issue:
Release version 1.0.0
Several significant changes have happened since the last [0.3.0 release](https://github.com/geomet/geomet/pull/69). For instance:
- #73
- #77 
- #79 
- #82 
- #84 

A few things are needed before this release is done:
- [x] Update documentation on release procedures, and clearly define the process. With the addition of branch protection and a new automation workflow in CircleCI, there needs to be a clearly defined process to streamline future release.
- [x] Update repository, GitHub org, and README to reflect the addition of support for new geospatial formats (related: https://github.com/geomet/geomet/issues/59). For instance, instead of saying we just convert between GeoJSON/WKT/WKB, I think we should say something more general like "Conversion library for common geospatial data formats".
- [x] Update repository tags to include new supported formats (esri json, geopackage, etc.) to make the library easier to find.
- [x] Release 1.0.0 package to PyPI.
- [x] Create and push a 1.0.0 tag to GitHub.
- [x] Compile release notes and create a release for 1.0.0 on GitHub.
Update documentation and project metadata to include support for GeoPackage
With the addition of #56, WKT, WKB, and GeoJSON aren't the only supported formats anymore.

Prerequisites:
- [x] Merge of #56 
- [x] Resolution of #42 
- [x] New minor version (0.3.0) release to PyPI

Once these prereqs are done, update:
- [x] The GitHub repo title
- [x] Update GitHub repo "topics" to include `geopackage`
- [ ] Update any docs which are similar to "GeoMet - Convert GeoJSON to WKT/WKB, and vice versa" <-- include GeoPackage in the list of supported formats.


Discussion / hints:

Hey @larsbutler, when do you think we could get a new release out? I want to use the geopackage serializer at work and I don't want to have to re-write it. =)
@tomplex Sure, I'll get on that. I'll put up a few PRs; it would be great to get your review on them.
Absolutely! Will do. 
Cool. First one is easy: https://github.com/geomet/geomet/pull/67. :)

Fix patch:
diff --git a/README.md b/README.md
index fe45be5..20d7e1c 100644
--- a/README.md
+++ b/README.md
@@ -1,71 +1,38 @@
-GeoMet [![Build Status](https://secure.travis-ci.org/geomet/geomet.png?branch=master)](http://travis-ci.org/geomet/geomet)
-======
+# GeoMet [![geomet](https://circleci.com/gh/geomet/geomet.svg?style=shield)](https://app.circleci.com/pipelines/github/geomet)
 
-Convert [GeoJSON](http://www.geojson.org/geojson-spec.html) to
-[WKT/WKB](http://en.wikipedia.org/wiki/Well-known_text) (Well-Known
-Text/Binary) or [GeoPackage Binary](http://www.geopackage.org/spec/#gpb_format), and vice versa. [Extended WKB/WKT](https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT)
-are also supported. Conversion functions are exposed through
-idiomatic `load/loads/dump/dumps` interfaces.
+Pure-Python conversion library for common geospatial data formats.
+Supported formats include:
+- [GeoJSON](http://www.geojson.org/geojson-spec.html)
+- [WKT/WKB](http://en.wikipedia.org/wiki/Well-known_text) (Well-Known Text/Binary)
+- [Extended WKB/WKT](https://postgis.net/docs/using_postgis_dbmanagement.html#EWKB_EWKT)
+- [GeoPackage Binary](http://www.geopackage.org/spec/#gpb_format)
 
-The name "GeoMet" was inspired by "met", the German word for
-[mead](http://en.wikipedia.org/wiki/Mead). It is also a shortened version of
-the word "geometry".
-
-GeoMet is intended to cover all common use cases for dealing with 2D, 3D, and
-4D geometries (including 'Z', 'M', and 'ZM').
-
-The following conversion functions are supported.
-
-WKT/EWKT <--> GeoJSON:
-
-- Point
-- LineString
-- Polygon
-- MultiPoint
-- MultiLineString
-- MultiPolygon
-- GeometryCollection
-
-WKB/EWKB <--> GeoJSON:
-
-- Point
-- LineString
-- Polygon
-- MultiPoint
-- MultiLineString
-- MultiPolygon
-- GeometryCollection
-
-Note: Reading and writing empty WKB geometries is not currently supported.
-
-GeoPackage Binary <--> GeoJSON:
-
-- Point
-- LineString
-- Polygon
-- MultiPoint
-- MultiLineString
-- MultiPolygon
-- GeometryCollection
-
-Note: Reading and writing empty GeoPackage geometries is not currently supported.
 
+## Install
 
-### Installation ###
-
-Install from [PyPI](https://pypi.python.org/pypi) (easiest method):
+Install the latest version from [PyPI](https://pypi.org/project/geomet/):
 
     $ pip install geomet
 
-Clone the source code from git and run:
+## Functionality
 
-    $ python setup.py install
+Converion functions are exposed through idiomatic `load/loads/dump/dumps`
+interfaces.
 
-You can also install directly from the git repo using pip:
+GeoMet is intended to cover all common use cases for dealing with 2D, 3D, and
+4D geometries (including 'Z', 'M', and 'ZM').
 
-    $ pip install git+git://github.com/geomet/geomet.git
+| Geometry | WKT/EWKT | WKB/EWKB | GeoPackage Binary | EsriJSON |
+| -------- | :------: | :------: | :---------------: | :------: |
+| Point    | ✅ | ✅ | ✅| ✅ |
+| LineString    | ✅ | ✅ | ✅| ✅ |
+| Polygon    | ✅ | ✅ | ✅| ✅ |
+| MultiPoint    | ✅ | ✅ | ✅| ✅ |
+| MultiLineString    | ✅ | ✅ | ✅| ✅ |
+| MultiPolygon    | ✅ | ✅ | ✅| ✅ |
+| GeometryCollection    | ✅ | ✅ | ✅| ✅ |
 
-### Example usage ###
+## Example usage
 
 Coverting a 'Point' GeoJSON object to WKT:
 
@@ -155,8 +122,52 @@ header of the GeoPackage geometry:
 If an integer SRID identifier is present in a `'meta'` key (like `'meta': {'srid': 4326}`), then the SRID will be included in the
 GeoPackage header.
 
+## History
+
+This library was originally created as the result of a bug report related
+to another project: https://bugs.launchpad.net/openquake-old/+bug/1073909.
+The source of this issue was largely due to a dependency on
+[GEOS](https://libgeos.org/), which is written in C/C++. Depending on GEOS
+requires any data conversion bug fixes to happen upstream, which takes time
+and effort. Ultimately, this was the inspiration to create a more
+lightweight, pure-Python conversion library as an alterntive tool for
+reliably converting data between various geospatial formats.
+
+The name "GeoMet" was inspired by "met", the German word for
+[mead](http://en.wikipedia.org/wiki/Mead). It is also a shortened version of
+the word "geometry".
+
+## Limitations
+
+### Outputing "empty" geometries to binary formats is not supported
+
+Attempting to output an empty geometry to a binary format will result in an exception: `ValueError: Empty geometries cannot be represented in WKB. Reason: The dimensionality of the WKB would be ambiguous.` There are a few reasons for this this limitation:
+- Any `EMTPY` geometry (e.g., `POINT EMPTY`, `MULTIPOLYGON EMPTY`, etc.) cannot be converted into binary format because binary formats such as WKB require an explicit dimension type (2d, Z, M, or ZM). This means that some objects cannot be reliably converted to and from different formats in a [bijective](https://en.wikipedia.org/wiki/Bijection) manner.
+- The [GeoJSON standard](https://www.rfc-editor.org/rfc/rfc7946) does have a way of representing empty geometries; however, details are minimal and the dimensionality of such an object remains ambiguous.
+- Representing some geometry types (such as points and lines) as "empty" is [deeply flawed to begin with](http://aleph0.clarku.edu/~djoyce/elements/bookI/defI1.html). For example, a point can represent any location in 2d, 3d, or 4d space. However, a point is infinitesimally small (it has no size) and it can't contain anything (it can't be "full"), therefore, it doesn't make sense for a point to be "empty".
+
+As a result, GeoMet has chosen to not attempt to address these problems, and
+simply raise an exception instead.
+
+Example:
+
+    >>> import geomet
+    >>> import geomet.wkt as wkt
+    >>> import geomet.wkb as wkb
+    >>> pt = wkt.loads('POINT EMPTY')
+    >>> pt
+    {'type': 'Point', 'coordinates': []}
+    >>> wkb.dumps(pt)
+    Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+    File "/home/jdoe/geomet/geomet/wkb.py", line 216, in dumps
+        return _dumps(obj, big_endian)
+    File "/home/jdoe/geomet/geomet/wkb.py", line 238, in _dumps
+        raise ValueError(
+    ValueError: Empty geometries cannot be represented in WKB. Reason: The dimensionality of the WKB would be ambiguous.
+
 
-### See Also ###
+## See also
 
 - [wellknown](https://github.com/mapbox/wellknown): A similar package for Node.js.
 - [geo](https://github.com/bryanjos/geo): A nearly-identical package for Elixir.
diff --git a/build-scripts/00-install-dependencies.sh b/build-scripts/00-install-dependencies.sh
index 9ac4e89..27b6af7 100755
--- a/build-scripts/00-install-dependencies.sh
+++ b/build-scripts/00-install-dependencies.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 ROOT_DIR=${DIR}/..
diff --git a/build-scripts/01-build.sh b/build-scripts/01-build.sh
index 4a59344..7b3b05d 100755
--- a/build-scripts/01-build.sh
+++ b/build-scripts/01-build.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 ROOT_DIR=${DIR}/..
@@ -15,4 +15,4 @@ python setup.py -q install
 # Verify that the `geomet` CLI was installed:
 which geomet
 # Check the package for publishing suitability:
-twine check dist/*
\ No newline at end of file
+twine check dist/*
diff --git a/build-scripts/03-package.sh b/build-scripts/03-package.sh
index a4f7954..99911b7 100755
--- a/build-scripts/03-package.sh
+++ b/build-scripts/03-package.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 ROOT_DIR=${DIR}/..
@@ -11,4 +11,4 @@ pushd ${ROOT_DIR}
 trap cleanup EXIT
 
 # Create source and binary distributions:
-python setup.py sdist bdist_wheel
\ No newline at end of file
+python setup.py sdist bdist_wheel
diff --git a/build-scripts/05-push.sh b/build-scripts/05-push.sh
index d2853ed..7b6328e 100755
--- a/build-scripts/05-push.sh
+++ b/build-scripts/05-push.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 ROOT_DIR=${DIR}/..
@@ -10,4 +10,4 @@ function cleanup {
 pushd ${ROOT_DIR}
 trap cleanup EXIT
 
-twine upload dist/*
\ No newline at end of file
+twine upload dist/*
diff --git a/build-scripts/README.md b/build-scripts/README.md
index fb885f7..d62743d 100644
--- a/build-scripts/README.md
+++ b/build-scripts/README.md
@@ -5,6 +5,6 @@ environment. The numeric prefix on each file name indicates the order in which
 each script should be run in order to set up the build environment, build
 packages, run tests, and push packages to PyPI.
 
-It's assumed that Python is avaible in the test environment. Tests are run
+It's assumed that Python is available in the test environment. Tests are run
 for a single Python version at a time, due to the complexity involved in having
 all supported Python versions in a single build environment.
\ No newline at end of file
diff --git a/docs/dev_guide.md b/docs/dev_guide.md
new file mode 100644
index 0000000..490c244
--- /dev/null
+++ b/docs/dev_guide.md
@@ -0,0 +1,36 @@
+# Development Guide
+
+## Packaging and Releasing New Versions to PyPI
+
+Follow these steps for release new versions of `geomet` to https://pypi.org/.
+
+NOTE: Only members of the `Owners` team on GitHub have the permissions to
+trigger a release of a new package versions to PyPI.
+
+NOTE: Release branches should not include new features or bug fixes, unless
+prescribed by the process below.
+
+1. Update the major or minor version string in `geomet/__init__.py`, following
+  https://semver.org/ guidelines.
+2. Create a new branch called `release-X.Y`, where X is the major version,
+  Y is the minor version.
+3. Push the branch to the central repo: https://github.com/geomet/geomet.
+4. Open a pull request from branch `release-X.Y` to the `master` branch.
+5. Ensure that all CI/CD tests and checks pass.
+6. Obtain a review/approval from a Maintainer.
+7. Trigger the manual approval gate in CircleCI to publish the package.
+8. Verify that the publishing step was successul. (Check CircleCI output, check PyPI.)
+9. Merge the pull request.
+10. Create a Tag and a Release from the head commit of the branch. The release
+   text should contain some relevant information about features/bugfixes that
+   have been added since the last release.
+11. Delete the `release-X.Y.Z` branch.
+
+NOTE: Sometimes releases don't always work on the first try. If something goes
+wrong while publishing to PyPI, due to tooling errors, bugs, misconfigurations,
+etc.:
+
+1. Add 1 or more new commits to attempt to fix the issue and push to the `release-X.Y` branch
+2. Increment the "patch" version (the last number) in the
+version string in `geomet/__init__.py`. As a separate commit from the fix.
+3. Repeat the process above beginning from step 5.
diff --git a/wkb_detail.md b/docs/wkb_detail.md
similarity index 100%
rename from wkb_detail.md
rename to docs/wkb_detail.md
diff --git a/setup.py b/setup.py
index 6954be1..38031d5 100644
--- a/setup.py
+++ b/setup.py
@@ -33,13 +33,24 @@ def get_version():
     maintainer='Lars Butler',
     maintainer_email='lars.butler@gmail.com',
     url='https://github.com/geomet/geomet',
-    description='GeoJSON <-> WKT/WKB conversion utilities',
+    description='Conversion library for common geospatial data formats (GeoJSON/WKT/EWKT/WKB/EWKB/GeoPackage/EsriJson)',
     long_description=__doc__,
     platforms=['any'],
     packages=find_packages(exclude=['geomet.tests', 'geomet.tests.*']),
     entry_points={'console_scripts': ['geomet=geomet.tool:cli']},
     license='Apache 2.0',
-    keywords='wkb wkt geojson',
+    keywords=[
+        'esri',
+        'ewkb',
+        'ewkt',
+        'geojson',
+        'geopackage',
+        'geospatial',
+        'gis',
+        'spatial',
+        'wkb',
+        'wkt',
+    ],
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'License :: OSI Approved :: Apache Software License',


Test patch:
diff --git a/build-scripts/02-test.sh b/build-scripts/02-test.sh
index cdcbf3e..efa004e 100755
--- a/build-scripts/02-test.sh
+++ b/build-scripts/02-test.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 # Specify a tox env/version to run
 # If not specified, default to running everything
diff --git a/build-scripts/04-push-test-pypi.sh b/build-scripts/04-push-test-pypi.sh
index fbafbce..f6392ce 100755
--- a/build-scripts/04-push-test-pypi.sh
+++ b/build-scripts/04-push-test-pypi.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-set -euxo pipefail
+set -euo pipefail
 
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 ROOT_DIR=${DIR}/..
@@ -10,4 +10,4 @@ function cleanup {
 pushd ${ROOT_DIR}
 trap cleanup EXIT
 
-twine upload --repository-url https://test.pypi.org/legacy/ dist/*
\ No newline at end of file
+twine upload --repository-url https://test.pypi.org/legacy/ dist/*