diff --git a/.gitignore b/.gitignore index 31720d3..e414f6b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,6 @@ .project .pydevproject /.settings/ -venv -.idea +.idea/ +venv/ build diff --git a/.travis.yml b/.travis.yml index 207751e..b8661df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: python python: - - "2.7" + - "3.7" install: - python setup.py develop script: diff --git a/README.rst b/README.rst index 10648c5..2bb59e8 100644 --- a/README.rst +++ b/README.rst @@ -27,6 +27,8 @@ ____________ Release Notes ============= +**Version 0.13 – TBD** + * Main version of Python is updated up to 3.7 **Version 0.12 - 21.06.2019** * Added depth argument in copy method in client.py by https://github.com/JesperHakansson diff --git a/setup.py b/setup.py index 39eefa2..a716a14 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,8 @@ setup( requires=['python (>= 2.7.6)'], install_requires=['requests', 'lxml', 'argcomplete'], scripts=['wdc'], - tests_require=['pytest', 'pyhamcrest', 'junit-xml', 'pytest-allure-adaptor'], + test_suite='tests', + tests_require=['pytest'], cmdclass={'install': Install, 'test': Test}, description='WebDAV client, based on original package https://github.com/designerror/webdav-client-python but ' 'uses requests instead of PyCURL', @@ -73,6 +74,9 @@ setup( 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', 'Topic :: Internet', 'Topic :: Software Development :: Libraries :: Python Modules', ], diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 723db66..0000000 --- a/tests/conftest.py +++ /dev/null @@ -1,32 +0,0 @@ -__author__ = 'designerror' - -from hamcrest.core.base_matcher import BaseMatcher -from hamcrest.core.helpers.hasmethod import hasmethod - -class Valid(BaseMatcher): - def _matches(self, item): - return False if not hasmethod(item, 'valid') else item.valid() - -class NotValid(BaseMatcher): - def _matches(self, item): - return False if not hasmethod(item, 'valid') else not item.valid() - -class Success(BaseMatcher): - def _matches(self, item): - return item - -class NotSuccess(BaseMatcher): - def _matches(self, item): - return not item - -def valid(): - return Valid() - -def not_valid(): - return NotValid() - -def success(): - return Success() - -def not_success(): - return NotSuccess() \ No newline at end of file diff --git a/tests/response_dir.xml b/tests/response_dir.xml new file mode 100644 index 0000000..c0e3a7b --- /dev/null +++ b/tests/response_dir.xml @@ -0,0 +1,136 @@ + + + + / + + HTTP/1.1 200 OK + + 2012-04-04T20:00:00Z + disk + Wed, 04 Apr 2012 20:00:00 GMT + + + + + + + + /test_dir/ + + HTTP/1.1 200 OK + + 2018-05-10T07:31:13Z + test_dir + Thu, 10 May 2018 07:31:13 GMT + + + + + + + + /%D0%93%D0%BE%D1%80%D1%8B.jpg + + HTTP/1.1 200 OK + + 1392851f0668017168ee4b5a59d66e7b + 2018-05-09T14:44:28Z + Горы.jpg + Wed, 09 May 2018 14:44:28 GMT + image/jpeg + 1762478 + + + + + + /%D0%97%D0%B8%D0%BC%D0%B0.jpg + + HTTP/1.1 200 OK + + a64146fee5e15b3b94c204e544426d43 + 2018-05-09T14:44:28Z + Зима.jpg + Wed, 09 May 2018 14:44:28 GMT + image/jpeg + 1394575 + + + + + + /%D0%9C%D0%B8%D1%88%D0%BA%D0%B8.jpg + + HTTP/1.1 200 OK + + 569a1c98696050439b5b2a1ecfa52d19 + 2018-05-09T14:44:27Z + Мишки.jpg + Wed, 09 May 2018 14:44:27 GMT + image/jpeg + 1555830 + + + + + + /%D0%9C%D0%BE%D1%80%D0%B5.jpg + + HTTP/1.1 200 OK + + ab903d9cab031eca2a8f12f37bbc9d37 + 2018-05-09T14:44:27Z + Море.jpg + Wed, 09 May 2018 14:44:27 GMT + image/jpeg + 1080301 + + + + + + /%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.jpg + + HTTP/1.1 200 OK + + d27d72a3059ad5ebed7a5470459d2670 + 2018-05-09T14:44:27Z + Москва.jpg + Wed, 09 May 2018 14:44:27 GMT + image/jpeg + 1454228 + + + + + + /%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3.jpg + + HTTP/1.1 200 OK + + f1abe3b27b410128623fd1ca00a45c29 + 2018-05-09T14:44:27Z + Санкт-Петербург.jpg + Wed, 09 May 2018 14:44:27 GMT + image/jpeg + 2573704 + + + + + + /%D0%A5%D0%BB%D0%B5%D0%B1%D0%BD%D1%8B%D0%B5%20%D0%BA%D1%80%D0%BE%D1%88%D0%BA%D0%B8.mp4 + + HTTP/1.1 200 OK + + ea977f513074d5524bee3638798183b9 + 2018-05-09T14:44:28Z + Хлебные крошки.mp4 + Wed, 09 May 2018 14:44:28 GMT + video/mp4 + 31000079 + + + + + \ No newline at end of file diff --git a/tests/test_client_unit.py b/tests/test_client_unit.py index 7489895..fe38c79 100644 --- a/tests/test_client_unit.py +++ b/tests/test_client_unit.py @@ -24,7 +24,7 @@ class ClientTestCase(TestCase): def test_create_free_space_request_content(self): result = utils.create_free_space_request_content() self.assertEqual(result, b'\n' - b'') + b'') def test_parse_free_space_response(self): content = '/' \ @@ -55,7 +55,7 @@ class ClientTestCase(TestCase): } result = utils.create_get_property_request_content(option=option, ) self.assertEqual(result, b'\n' - b'') + b'') def test_create_get_property_request_content_name_only(self): option = { @@ -63,7 +63,7 @@ class ClientTestCase(TestCase): } result = utils.create_get_property_request_content(option=option) self.assertEqual(result, b'\n' - b'') + b'') def test_parse_get_property_response(self): content = '' \ @@ -81,7 +81,7 @@ class ClientTestCase(TestCase): } result = utils.create_set_property_batch_request_content(options=[option]) self.assertEqual(result, b'\n' - b'aValue') + b'aValue') def test_create_set_one_property_request_content_name_only(self): option = { @@ -89,7 +89,7 @@ class ClientTestCase(TestCase): } result = utils.create_set_property_batch_request_content(options=[option]) self.assertEqual(result, b'\n' - b'') + b'') def test_create_set_property_batch_request_content(self): options = [ @@ -106,8 +106,8 @@ class ClientTestCase(TestCase): ] result = utils.create_set_property_batch_request_content(options=options) self.assertEqual(result, b'\n' - b'aValueaValue2' - b'') + b'aValueaValue2' + b'') def test_create_set_property_batch_request_content_name_only(self): options = [ @@ -120,8 +120,8 @@ class ClientTestCase(TestCase): ] result = utils.create_set_property_batch_request_content(options=options) self.assertEqual(result, b'\n' - b'' - b'') + b'' + b'') def test_etree_to_string(self): tree = ElementTree(Element('test')) @@ -129,56 +129,14 @@ class ClientTestCase(TestCase): self.assertEqual(result, b'\n') def test_parse_is_dir_response_directory(self): - content = '/HTTP/1.1 200 OK2012-04-04T20:00:00ZdiskWed, 04 Apr 2012 20:00:00 GMT' \ - '/test_dir/HTTP/1.1 200 OK2018-05-10T07:31:13Ztest_dirThu, 10 May 2018 07:31:13 GMT/%D0%93%D0%BE%D1%80%D1%8B.jpg' \ - 'HTTP/1.1 200 OK1392851f0668017168ee4b' \ - '5a59d66e7b2018-05-09T14:44:28ZГоры.jpg' \ - 'Wed, 09 May 2018 14:44:28 GMTimage/jpeg1762478' \ - '/%D0%97%D0%B8%D0%BC%D0%B0.jpgHTTP/1.1 200 OKa64146fee5e15b3b94c204e544426d432018-05-09T14:44:28ZЗима.jpgWed, 09 May 2018 14:44:28 GMTimage/jpeg' \ - '1394575/%D0%9C%D0%B8%D1%88%D0%BA%D0%B8.jpg<' \ - 'd:status>HTTP/1.1 200 OK569a1c98696050439b5b2a1ecfa52d19' \ - '2018-05-09T14:44:27ZМишки.jpgWed, 09 May 2018 14:44:27 GMTimage/jpeg1555830/%D0%9C%D0%BE%D1%80%D0%B5.jpgHTTP' \ - '/1.1 200 OKab903d9cab031eca2a8f12f37bbc9d372018-05-09T14:44:27ZМоре.jpg' \ - 'Wed, 09 May 2018 14:44:27 GMTimage/jpeg1080301' \ - '/%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.jpgHTTP/1' \ - '.1 200 OKd27d72a3059ad5ebed7a5470459d26702018-05-09T14:44:27ZМосква.jpg' \ - 'Wed, 09 May 2018 14:44:27 GMTimage/jpeg1454228' \ - '/%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%' \ - '80%D0%B3.jpgHTTP/1.1 200 OKf1abe3b27b' \ - '410128623fd1ca00a45c292018-05-09T14:44:27ZСанкт-Петербург.jpgWed, 09 May 2018 14:44:27 GMTimage/jpeg2573704/%D0%A5%D0%BB%D0%B5%' \ - 'D0%B1%D0%BD%D1%8B%D0%B5%20%D0%BA%D1%80%D0%BE%D1%88%D0%BA%D0%B8.mp4H' \ - 'TTP/1.1 200 OKea977f513074d5524bee3638798183b92018-05-09T14:44:28ZХлебные крошки.mp4Wed, 09 May 2018 14:44:28 GMTvideo/mp431000079' \ - '' + f = open('./tests/response_dir.xml') + content = f.read() path = '/test_dir' hostname = 'https://webdav.yandex.ru' - result = utils.parse_is_dir_response(content.encode('utf-8'), path, hostname) + result = utils.parse_is_dir_response(content, path, hostname) self.assertTrue(result, 'It should be directory') - def test_parse_is_dir_response_directory(self): + def test_parse_is_dir_response_file(self): content = '/test_' \ 'dir/HTTP/1.1 200 OK2018-05-10T07' \ ':40:11Ztest_dirThu, 10 May 2018' \ diff --git a/tests/webdav/test_authenticate.py b/tests/webdav/test_authenticate.py deleted file mode 100644 index c03e2b9..0000000 --- a/tests/webdav/test_authenticate.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'designerror' diff --git a/tests/webdav/test_connection.py b/tests/webdav/test_connection.py deleted file mode 100644 index 445483f..0000000 --- a/tests/webdav/test_connection.py +++ /dev/null @@ -1,11 +0,0 @@ -__author__ = 'designerror' - -import allure -#from hamcrest import * - -class TestRequiredOptions: - - def test_without_webdav_hostname(self): - options = { 'webdav_server': "https://webdav.yandex.ru"} - allure.attach('options', options.__str__()) - assert 1 diff --git a/tests/webdav/test_methods.py b/tests/webdav/test_methods.py deleted file mode 100644 index c03e2b9..0000000 --- a/tests/webdav/test_methods.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'designerror' diff --git a/webdav3/client.py b/webdav3/client.py index b62e860..d923bd1 100644 --- a/webdav3/client.py +++ b/webdav3/client.py @@ -959,6 +959,8 @@ class WebDavXmlUtils: :return: XML object of response for the remote resource defined by path. """ try: + if isinstance(content, str): + content = content.encode('utf-8') tree = etree.fromstring(content) responses = tree.findall("{DAV:}response")