diff -pruN 1.1.4+ds-1/LICENSE 1.1.5-1/LICENSE
--- 1.1.4+ds-1/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 1.1.5-1/LICENSE	2025-08-17 10:35:46.000000000 +0000
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Lorenz Diener
+
+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.
diff -pruN 1.1.4+ds-1/MANIFEST.in 1.1.5-1/MANIFEST.in
--- 1.1.4+ds-1/MANIFEST.in	1970-01-01 00:00:00.000000000 +0000
+++ 1.1.5-1/MANIFEST.in	2025-08-17 10:35:46.000000000 +0000
@@ -0,0 +1,2 @@
+recursive-include tests *
+recursive-exclude * __pycache__ *.py[cod]
diff -pruN 1.1.4+ds-1/PKG-INFO 1.1.5-1/PKG-INFO
--- 1.1.4+ds-1/PKG-INFO	2019-10-11 19:01:32.000000000 +0000
+++ 1.1.5-1/PKG-INFO	2025-08-17 10:35:57.447520500 +0000
@@ -1,18 +1,107 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: blurhash
-Version: 1.1.4
+Version: 1.1.5
 Summary: Pure-Python implementation of the blurhash algorithm.
 Home-page: https://github.com/halcy/blurhash-python
 Author: Lorenz Diener
 Author-email: lorenzd+blurhashpypi@gmail.com
 License: MIT
-Description: UNKNOWN
 Keywords: blurhash graphics web_development
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Topic :: Multimedia :: Graphics
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 3
+Description-Content-Type: text/markdown
+License-File: LICENSE
 Provides-Extra: test
+Requires-Dist: pytest; extra == "test"
+Requires-Dist: Pillow; extra == "test"
+Requires-Dist: numpy; extra == "test"
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: license-file
+Dynamic: provides-extra
+Dynamic: summary
+
+# blurhash-python
+```python
+import blurhash
+import PIL.Image
+import numpy
+
+PIL.Image.open("cool_cat_small.jpg")
+# Result:
+```
+![A picture of a cool cat.](/cool_cat_small.jpg?raw=true "A cool cat.")
+```python
+blurhash.encode(numpy.array(PIL.Image.open("cool_cat_small.jpg").convert("RGB")))
+# Result: 'UBL_:rOpGG-oBUNG,qRj2so|=eE1w^n4S5NH'
+
+PIL.Image.fromarray(numpy.array(blurhash.decode('UBL_:rOpGG-oBUNG,qRj2so|=eE1w^n4S5NH', 128, 128)).astype('uint8'))
+# Result:
+```
+![Blurhash example output: A blurred cool cat.](/blurhash_example.png?raw=true "Blurhash example output: A blurred cool cat.")
+    
+Blurhash is an algorithm that lets you transform image data into a small text representation of a blurred version of the image. This is useful since this small textual representation can be included when sending objects that may have images attached around, which then can be used to quickly create a placeholder for images that are still loading or that should be hidden behind a content warning.
+
+This library contains a pure-python implementation of the blurhash algorithm, closely following the original swift implementation by Dag Ågren. The module has no dependencies (the unit tests require PIL and numpy). You can install it via pip:
+
+```bash
+$ pip3 install blurhash
+```
+
+It exports five functions:
+* "encode" and "decode" do the actual en- and decoding of blurhash strings
+* "components" returns the number of components x- and y components of a blurhash
+* "srgb_to_linear" and "linear_to_srgb" are colour space conversion helpers
+
+Have a look at example.py for an example of how to use all of these working together.
+
+Documentation for each function:
+
+```python
+blurhash.encode(image, components_x = 4, components_y = 4, linear = False):
+"""
+Calculates the blurhash for an image using the given x and y component counts.
+
+Image should be a 3-dimensional array, with the first dimension being y, the second
+being x, and the third being the three rgb components that are assumed to be 0-255 
+srgb integers (incidentally, this is the format you will get from a PIL RGB image).
+
+You can also pass in already linear data - to do this, set linear to True. This is
+useful if you want to encode a version of your image resized to a smaller size (which
+you should ideally do in linear colour).
+"""
+
+blurhash.decode(blurhash, width, height, punch = 1.0, linear = False)
+"""
+Decodes the given blurhash to an image of the specified size.
+    
+Returns the resulting image a list of lists of 3-value sRGB 8 bit integer
+lists. Set linear to True if you would prefer to get linear floating point 
+RGB back.
+
+The punch parameter can be used to de- or increase the contrast of the
+resulting image.
+
+As per the original implementation it is suggested to only decode
+to a relatively small size and then scale the result up, as it
+basically looks the same anyways.
+"""
+
+blurhash.srgb_to_linear(value):
+"""
+srgb 0-255 integer to linear 0.0-1.0 floating point conversion.
+"""
+    
+blurhash.linear_to_srgb(value):
+"""
+linear 0.0-1.0 floating point to srgb 0-255 integer conversion.
+"""
+```
diff -pruN 1.1.4+ds-1/blurhash.egg-info/PKG-INFO 1.1.5-1/blurhash.egg-info/PKG-INFO
--- 1.1.4+ds-1/blurhash.egg-info/PKG-INFO	2019-10-11 19:01:32.000000000 +0000
+++ 1.1.5-1/blurhash.egg-info/PKG-INFO	2025-08-17 10:35:57.000000000 +0000
@@ -1,18 +1,107 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: blurhash
-Version: 1.1.4
+Version: 1.1.5
 Summary: Pure-Python implementation of the blurhash algorithm.
 Home-page: https://github.com/halcy/blurhash-python
 Author: Lorenz Diener
 Author-email: lorenzd+blurhashpypi@gmail.com
 License: MIT
-Description: UNKNOWN
 Keywords: blurhash graphics web_development
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Topic :: Multimedia :: Graphics
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 3
+Description-Content-Type: text/markdown
+License-File: LICENSE
 Provides-Extra: test
+Requires-Dist: pytest; extra == "test"
+Requires-Dist: Pillow; extra == "test"
+Requires-Dist: numpy; extra == "test"
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: license-file
+Dynamic: provides-extra
+Dynamic: summary
+
+# blurhash-python
+```python
+import blurhash
+import PIL.Image
+import numpy
+
+PIL.Image.open("cool_cat_small.jpg")
+# Result:
+```
+![A picture of a cool cat.](/cool_cat_small.jpg?raw=true "A cool cat.")
+```python
+blurhash.encode(numpy.array(PIL.Image.open("cool_cat_small.jpg").convert("RGB")))
+# Result: 'UBL_:rOpGG-oBUNG,qRj2so|=eE1w^n4S5NH'
+
+PIL.Image.fromarray(numpy.array(blurhash.decode('UBL_:rOpGG-oBUNG,qRj2so|=eE1w^n4S5NH', 128, 128)).astype('uint8'))
+# Result:
+```
+![Blurhash example output: A blurred cool cat.](/blurhash_example.png?raw=true "Blurhash example output: A blurred cool cat.")
+    
+Blurhash is an algorithm that lets you transform image data into a small text representation of a blurred version of the image. This is useful since this small textual representation can be included when sending objects that may have images attached around, which then can be used to quickly create a placeholder for images that are still loading or that should be hidden behind a content warning.
+
+This library contains a pure-python implementation of the blurhash algorithm, closely following the original swift implementation by Dag Ågren. The module has no dependencies (the unit tests require PIL and numpy). You can install it via pip:
+
+```bash
+$ pip3 install blurhash
+```
+
+It exports five functions:
+* "encode" and "decode" do the actual en- and decoding of blurhash strings
+* "components" returns the number of components x- and y components of a blurhash
+* "srgb_to_linear" and "linear_to_srgb" are colour space conversion helpers
+
+Have a look at example.py for an example of how to use all of these working together.
+
+Documentation for each function:
+
+```python
+blurhash.encode(image, components_x = 4, components_y = 4, linear = False):
+"""
+Calculates the blurhash for an image using the given x and y component counts.
+
+Image should be a 3-dimensional array, with the first dimension being y, the second
+being x, and the third being the three rgb components that are assumed to be 0-255 
+srgb integers (incidentally, this is the format you will get from a PIL RGB image).
+
+You can also pass in already linear data - to do this, set linear to True. This is
+useful if you want to encode a version of your image resized to a smaller size (which
+you should ideally do in linear colour).
+"""
+
+blurhash.decode(blurhash, width, height, punch = 1.0, linear = False)
+"""
+Decodes the given blurhash to an image of the specified size.
+    
+Returns the resulting image a list of lists of 3-value sRGB 8 bit integer
+lists. Set linear to True if you would prefer to get linear floating point 
+RGB back.
+
+The punch parameter can be used to de- or increase the contrast of the
+resulting image.
+
+As per the original implementation it is suggested to only decode
+to a relatively small size and then scale the result up, as it
+basically looks the same anyways.
+"""
+
+blurhash.srgb_to_linear(value):
+"""
+srgb 0-255 integer to linear 0.0-1.0 floating point conversion.
+"""
+    
+blurhash.linear_to_srgb(value):
+"""
+linear 0.0-1.0 floating point to srgb 0-255 integer conversion.
+"""
+```
diff -pruN 1.1.4+ds-1/blurhash.egg-info/SOURCES.txt 1.1.5-1/blurhash.egg-info/SOURCES.txt
--- 1.1.4+ds-1/blurhash.egg-info/SOURCES.txt	2019-10-11 19:01:32.000000000 +0000
+++ 1.1.5-1/blurhash.egg-info/SOURCES.txt	2025-08-17 10:35:57.000000000 +0000
@@ -1,3 +1,5 @@
+LICENSE
+MANIFEST.in
 README.md
 setup.cfg
 setup.py
@@ -7,4 +9,7 @@ blurhash.egg-info/PKG-INFO
 blurhash.egg-info/SOURCES.txt
 blurhash.egg-info/dependency_links.txt
 blurhash.egg-info/requires.txt
-blurhash.egg-info/top_level.txt
\ No newline at end of file
+blurhash.egg-info/top_level.txt
+tests/blurhash_out.npy
+tests/cool_cat.jpg
+tests/test_blurhash.py
\ No newline at end of file
diff -pruN 1.1.4+ds-1/blurhash.egg-info/requires.txt 1.1.5-1/blurhash.egg-info/requires.txt
--- 1.1.4+ds-1/blurhash.egg-info/requires.txt	2019-10-11 19:01:32.000000000 +0000
+++ 1.1.5-1/blurhash.egg-info/requires.txt	2025-08-17 10:35:57.000000000 +0000
@@ -1,5 +1,5 @@
 
 [test]
+pytest
 Pillow
 numpy
-pytest
diff -pruN 1.1.4+ds-1/debian/changelog 1.1.5-1/debian/changelog
--- 1.1.4+ds-1/debian/changelog	2025-07-12 09:19:46.000000000 +0000
+++ 1.1.5-1/debian/changelog	2025-08-26 16:22:24.000000000 +0000
@@ -1,3 +1,10 @@
+blurhash-python (1.1.5-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Upstream add LICENSE file, update copyright details.
+
+ -- Edward Betts <edward@4angle.com>  Tue, 26 Aug 2025 17:22:24 +0100
+
 blurhash-python (1.1.4+ds-1) unstable; urgency=medium
 
   * Switch to correct upstream source. (Closes: #1101140)
diff -pruN 1.1.4+ds-1/debian/copyright 1.1.5-1/debian/copyright
--- 1.1.4+ds-1/debian/copyright	2025-02-17 11:26:02.000000000 +0000
+++ 1.1.5-1/debian/copyright	2025-08-26 16:21:51.000000000 +0000
@@ -4,7 +4,7 @@ Upstream-Contact: Lorenz Diener <lorenzd
 Source: https://github.com/halcy/blurhash-python
 
 Files: *
-Copyright: 2018 Wolt Enterprises Oy
+Copyright: 2019 Lorenz Diener
 License: MIT
 
 Files: debian/*
diff -pruN 1.1.4+ds-1/setup.cfg 1.1.5-1/setup.cfg
--- 1.1.4+ds-1/setup.cfg	2019-10-11 19:01:32.000000000 +0000
+++ 1.1.5-1/setup.cfg	2025-08-17 10:35:57.447520500 +0000
@@ -7,6 +7,10 @@ test = pytest
 [tool:pytest]
 addopts = --cov=blurhash
 
+[metadata]
+long_description = file: README.md
+long_description_content_type = text/markdown
+
 [egg_info]
 tag_build = 
 tag_date = 0
diff -pruN 1.1.4+ds-1/setup.py 1.1.5-1/setup.py
--- 1.1.4+ds-1/setup.py	2019-10-11 18:59:07.000000000 +0000
+++ 1.1.5-1/setup.py	2025-08-17 10:35:46.000000000 +0000
@@ -6,7 +6,7 @@ extras = {
 }
 
 setup(name='blurhash',
-      version='1.1.4',
+      version='1.1.5',
       description='Pure-Python implementation of the blurhash algorithm.',
       packages=['blurhash'],
       install_requires=[],
Binary files 1.1.4+ds-1/tests/blurhash_out.npy and 1.1.5-1/tests/blurhash_out.npy differ
Binary files 1.1.4+ds-1/tests/cool_cat.jpg and 1.1.5-1/tests/cool_cat.jpg differ
diff -pruN 1.1.4+ds-1/tests/test_blurhash.py 1.1.5-1/tests/test_blurhash.py
--- 1.1.4+ds-1/tests/test_blurhash.py	1970-01-01 00:00:00.000000000 +0000
+++ 1.1.5-1/tests/test_blurhash.py	2025-08-17 10:35:46.000000000 +0000
@@ -0,0 +1,67 @@
+import sys, os
+base_path = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(base_path, '..'))
+
+import PIL
+import PIL.Image
+import blurhash
+import numpy as np
+import pytest
+
+def test_encode():
+    image = PIL.Image.open(os.path.join(base_path, "cool_cat.jpg"))
+    blur_hash = blurhash.encode(np.array(image.convert("RGB")))
+    assert blur_hash == "UBMOZfK1GG%LBBNG,;Rj2skq=eE1s9n4S5Na"
+    
+def test_decode():
+    image = blurhash.decode("UBMOZfK1GG%LBBNG,;Rj2skq=eE1s9n4S5Na", 32, 32)
+    reference_image = np.load(os.path.join(base_path, "blurhash_out.npy"))
+    assert np.sum(np.abs(image - reference_image)) < 1.0
+
+def test_asymmetric():
+    image = PIL.Image.open(os.path.join(base_path, "cool_cat.jpg"))
+    blur_hash = blurhash.encode(np.array(image.convert("RGB")), components_x = 2, components_y = 8)
+    assert blur_hash == "%BMOZfK1BBNG2skqs9n4?HvgJ.Nav}J-$%sm"
+    
+    decoded_image = blurhash.decode(blur_hash, 32, 32)
+    assert np.sum(np.var(decoded_image, axis = 0)) > np.sum(np.var(decoded_image, axis = 1))
+
+    blur_hash = blurhash.encode(np.array(image.convert("RGB")), components_x = 8, components_y = 2)
+    decoded_image = blurhash.decode(blur_hash, 32, 32)
+    assert np.sum(np.var(decoded_image, axis = 0)) < np.sum(np.var(decoded_image, axis = 1))
+
+def test_components():
+    image = PIL.Image.open(os.path.join(base_path, "cool_cat.jpg"))
+    blur_hash = blurhash.encode(np.array(image.convert("RGB")), components_x = 8, components_y = 3)
+    size_x, size_y = blurhash.components(blur_hash)
+    assert size_x == 8
+    assert size_y == 3
+
+def test_linear_dc_only():
+    image = PIL.Image.open(os.path.join(base_path, "cool_cat.jpg"))
+    linearish_image = np.array(image.convert("RGB")) / 255.0
+    blur_hash = blurhash.encode(linearish_image, components_x = 1, components_y = 1, linear = True)
+    avg_color = blurhash.decode(blur_hash, 1, 1, linear = True)
+    reference_avg_color = np.mean(linearish_image.reshape(linearish_image.shape[0] * linearish_image.shape[1], -1), 0)
+    assert np.sum(np.abs(avg_color - reference_avg_color)) < 0.01
+    
+def test_invalid_parameters():
+    image = np.array(PIL.Image.open(os.path.join(base_path, "cool_cat.jpg")).convert("RGB"))
+    
+    with pytest.raises(ValueError):
+         blurhash.decode("UBMO", 32, 32)
+         
+    with pytest.raises(ValueError):
+         blurhash.decode("UBMOZfK1GG%LBBNG", 32, 32)
+         
+    with pytest.raises(ValueError):
+        blurhash.encode(image, components_x = 0, components_y = 1)
+    
+    with pytest.raises(ValueError):
+        blurhash.encode(image, components_x = 1, components_y = 0)    
+    
+    with pytest.raises(ValueError):
+        blurhash.encode(image, components_x = 1, components_y = 10)
+      
+    with pytest.raises(ValueError):
+        blurhash.encode(image, components_x = 10, components_y = 1)
