diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 26b3a43..391dde4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,14 @@ Release History =============== +0.9.3 (2019-04-10) +------------------ + +* it is now possible to either pass the location of an image or directly pass + an already opened Image.Image to the hide and reveal methods; +* code re-formatted a bit with black. + + 0.9.2 (2019-04-04) ------------------ diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index 463d672..444f7e9 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -10,5 +10,6 @@ Contributors - Maxwell Gerber - Nejdet Çağdaş Yücesoy - panni +- Peter Justin Thank you to the testers! diff --git a/Pipfile.lock b/Pipfile.lock index 4e7e0e4..9b62923 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -162,20 +162,20 @@ }, "mypy": { "hashes": [ - "sha256:03261a04ace27250cf14f1301969e2cc36ad0343dd437e60007ce42f06ddbaff", - "sha256:6a7923e90dd8f8b8e762327e3a4dd814f0bc5581a627010f4e2ec72d906ada0f", - "sha256:6a7c2b16ff7dee1cd4a913641d6a8da0cd386be812524f41427ea25f8fe337a6", - "sha256:7480db0bc2bb473547c8d519ea549de9f9654170e6f5b34310094ebe5ee1c9dc", - "sha256:863774c896f2cdc62a0e2252e9ba7aaeb7da04c0296f47c82b125dce3437c580", - "sha256:9a990cf039891a83ee90f130256cc06d09c0793242ea38d0fe33fdc449507123", - "sha256:b03573d0cd8c051aa9ef7f47d564cf44bbc5e91e89a7a078b3ca904b3da8855a", - "sha256:b10b16d9aa7a01266f14260344fb25849ef0d508c512a916043f77987489aeff", - "sha256:b1eab82221c3cc94bf22152e701b3efc9d64f60fac4cab20969a0427e5a78261", - "sha256:e663d4424531dc99fb85c947df8a4a107442f53f20a4e0bcefaa1d21c87e1563", - "sha256:ffac30f3fa2c9e10118cbb0faa0b7da7edb6e3c24a4048a15446a1f3409884e3" + "sha256:2afe51527b1f6cdc4a5f34fc90473109b22bf7f21086ba3e9451857cf11489e6", + "sha256:56a16df3e0abb145d8accd5dbb70eba6c4bd26e2f89042b491faa78c9635d1e2", + "sha256:5764f10d27b2e93c84f70af5778941b8f4aa1379b2430f85c827e0f5464e8714", + "sha256:5bbc86374f04a3aa817622f98e40375ccb28c4836f36b66706cf3c6ccce86eda", + "sha256:6a9343089f6377e71e20ca734cd8e7ac25d36478a9df580efabfe9059819bf82", + "sha256:6c9851bc4a23dc1d854d3f5dfd5f20a016f8da86bcdbb42687879bb5f86434b0", + "sha256:b8e85956af3fcf043d6f87c91cbe8705073fc67029ba6e22d3468bfee42c4823", + "sha256:b9a0af8fae490306bc112229000aa0c2ccc837b49d29a5c42e088c132a2334dd", + "sha256:bbf643528e2a55df2c1587008d6e3bda5c0445f1240dfa85129af22ae16d7a9a", + "sha256:c46ab3438bd21511db0f2c612d89d8344154c0c9494afc7fbc932de514cf8d15", + "sha256:f7a83d6bd805855ef83ec605eb01ab4fa42bcef254b13631e451cbb44914a9b0" ], "index": "pypi", - "version": "==0.700" + "version": "==0.701" }, "mypy-extensions": { "hashes": [ @@ -251,34 +251,35 @@ }, "typed-ast": { "hashes": [ - "sha256:035a54ede6ce1380599b2ce57844c6554666522e376bd111eb940fbc7c3dad23", - "sha256:037c35f2741ce3a9ac0d55abfcd119133cbd821fffa4461397718287092d9d15", - "sha256:049feae7e9f180b64efacbdc36b3af64a00393a47be22fa9cb6794e68d4e73d3", - "sha256:19228f7940beafc1ba21a6e8e070e0b0bfd1457902a3a81709762b8b9039b88d", - "sha256:2ea681e91e3550a30c2265d2916f40a5f5d89b59469a20f3bad7d07adee0f7a6", - "sha256:3a6b0a78af298d82323660df5497bcea0f0a4a25a0b003afd0ce5af049bd1f60", - "sha256:5385da8f3b801014504df0852bf83524599df890387a3c2b17b7caa3d78b1773", - "sha256:606d8afa07eef77280c2bf84335e24390055b478392e1975f96286d99d0cb424", - "sha256:69245b5b23bbf7fb242c9f8f08493e9ecd7711f063259aefffaeb90595d62287", - "sha256:6f6d839ab09830d59b7fa8fb6917023d8cb5498ee1f1dbd82d37db78eb76bc99", - "sha256:730888475f5ac0e37c1de4bd05eeb799fdb742697867f524dc8a4cd74bcecc23", - "sha256:9819b5162ffc121b9e334923c685b0d0826154e41dfe70b2ede2ce29034c71d8", - "sha256:9e60ef9426efab601dd9aa120e4ff560f4461cf8442e9c0a2b92548d52800699", - "sha256:af5fbdde0690c7da68e841d7fc2632345d570768ea7406a9434446d7b33b0ee1", - "sha256:b64efdbdf3bbb1377562c179f167f3bf301251411eb5ac77dec6b7d32bcda463", - "sha256:bac5f444c118aeb456fac1b0b5d14c6a71ea2a42069b09c176f75e9bd4c186f6", - "sha256:bda9068aafb73859491e13b99b682bd299c1b5fd50644d697533775828a28ee0", - "sha256:d659517ca116e6750101a1326107d3479028c5191f0ecee3c7203c50f5b915b0", - "sha256:eddd3fb1f3e0f82e5915a899285a39ee34ce18fd25d89582bc89fc9fb16cd2c6" + "sha256:04894d268ba6eab7e093d43107869ad49e7b5ef40d1a94243ea49b352061b200", + "sha256:16616ece19daddc586e499a3d2f560302c11f122b9c692bc216e821ae32aa0d0", + "sha256:252fdae740964b2d3cdfb3f84dcb4d6247a48a6abe2579e8029ab3be3cdc026c", + "sha256:2af80a373af123d0b9f44941a46df67ef0ff7a60f95872412a145f4500a7fc99", + "sha256:2c88d0a913229a06282b285f42a31e063c3bf9071ff65c5ea4c12acb6977c6a7", + "sha256:2ea99c029ebd4b5a308d915cc7fb95b8e1201d60b065450d5d26deb65d3f2bc1", + "sha256:3d2e3ab175fc097d2a51c7a0d3fda442f35ebcc93bb1d7bd9b95ad893e44c04d", + "sha256:4766dd695548a15ee766927bf883fb90c6ac8321be5a60c141f18628fb7f8da8", + "sha256:56b6978798502ef66625a2e0f80cf923da64e328da8bbe16c1ff928c70c873de", + "sha256:5cddb6f8bce14325b2863f9d5ac5c51e07b71b462361fd815d1d7706d3a9d682", + "sha256:644ee788222d81555af543b70a1098f2025db38eaa99226f3a75a6854924d4db", + "sha256:64cf762049fc4775efe6b27161467e76d0ba145862802a65eefc8879086fc6f8", + "sha256:68c362848d9fb71d3c3e5f43c09974a0ae319144634e7a47db62f0f2a54a7fa7", + "sha256:6c1f3c6f6635e611d58e467bf4371883568f0de9ccc4606f17048142dec14a1f", + "sha256:b213d4a02eec4ddf622f4d2fbc539f062af3788d1f332f028a2e19c42da53f15", + "sha256:bb27d4e7805a7de0e35bd0cb1411bc85f807968b2b0539597a49a23b00a622ae", + "sha256:c9d414512eaa417aadae7758bc118868cd2396b0e6138c1dd4fda96679c079d3", + "sha256:f0937165d1e25477b01081c4763d2d9cdc3b18af69cb259dd4f640c9b900fe5e", + "sha256:fb96a6e2c11059ecf84e6741a319f93f683e440e341d4489c9b161eca251cf2a", + "sha256:fc71d2d6ae56a091a8d94f33ec9d0f2001d1cb1db423d8b4355debfe9ce689b7" ], - "version": "==1.3.1" + "version": "==1.3.4" }, "urllib3": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:4c291ca23bbb55c76518905869ef34bdd5f0e46af7afe6861e8375643ffee1a0", + "sha256:9a247273df709c4fedb38c711e44292304f73f39ab01beda9f6b9fc375669ac3" ], - "version": "==1.24.1" + "version": "==1.24.2" }, "webencodings": { "hashes": [ diff --git a/README.rst b/README.rst index 254425f..2c681ee 100644 --- a/README.rst +++ b/README.rst @@ -46,10 +46,10 @@ If you only want to install Stegano as a command line tool: .. code:: bash - $ pipsi install Stegano + $ pipx install Stegano ✨🍰✨ -pipsi installs scripts (system wide available) provided by Python packages into +pipx installs scripts (system wide available) provided by Python packages into separate virtualenvs to shield them from your system and each other. diff --git a/setup.py b/setup.py index 2d20718..86ca7f6 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ with codecs.open(os.path.join(here, 'CHANGELOG.rst'), encoding='utf-8') as f: setup( name='Stegano', - version='0.9.2', + version='0.9.3', author='Cédric Bonhomme', author_email='cedric@cedricbonhomme.org', packages=packages, diff --git a/tests/test_lsb.py b/tests/test_lsb.py index d186aec..9529a20 100644 --- a/tests/test_lsb.py +++ b/tests/test_lsb.py @@ -132,7 +132,6 @@ class TestLSB(unittest.TestCase): messages_to_hide = ["a", "foo", "Hello World!", ":Python:"] for message in messages_to_hide: - message = "Hello World" outputBytes = io.BytesIO() with open("./tests/sample-files/20160505T130442.jpg", 'rb') as f: bytes_image = lsb.hide(f, message) @@ -143,6 +142,19 @@ class TestLSB(unittest.TestCase): self.assertEqual(message, clear_message) + def test_with_location_of_image_as_argument(self): + messages_to_hide = ["Hello World!"] + + for message in messages_to_hide: + outputBytes = io.BytesIO() + bytes_image = lsb.hide("./tests/sample-files/20160505T130442.jpg", message) + bytes_image.save(outputBytes, "PNG") + outputBytes.seek(0) + + clear_message = lsb.reveal(outputBytes) + + self.assertEqual(message, clear_message) + def tearDown(self): try: os.unlink("./image.png") diff --git a/tests/test_lsbset.py b/tests/test_lsbset.py index 20861df..82fe754 100644 --- a/tests/test_lsbset.py +++ b/tests/test_lsbset.py @@ -25,6 +25,7 @@ __date__ = "$Date: 2016/04/13 $" __revision__ = "$Date: 2017/05/04 $" __license__ = "GPLv3" +import io import os import unittest from unittest.mock import patch @@ -103,6 +104,20 @@ class TestLSBSet(unittest.TestCase): secret = lsbset.hide("./tests/sample-files/Lenna-grayscale.png", message_to_hide, generators.eratosthenes()) + def test_with_location_of_image_as_argument(self): + messages_to_hide = ["Hello World!"] + + for message in messages_to_hide: + outputBytes = io.BytesIO() + bytes_image = lsbset.hide("./tests/sample-files/20160505T130442.jpg", message, + generators.identity()) + bytes_image.save(outputBytes, "PNG") + outputBytes.seek(0) + + clear_message = lsbset.reveal(outputBytes, generators.identity()) + + self.assertEqual(message, clear_message) + def test_auto_convert_rgb(self): message_to_hide = "Hello World!" secret = lsbset.hide("./tests/sample-files/Lenna-grayscale.png",