summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonrad Delong <konryd@gmail.com>2010-05-13 23:20:53 +0200
committerKonrad Delong <konryd@gmail.com>2010-05-13 23:20:53 +0200
commitb2e9e5f4ba2268f1b01dbbb8e1f16d07d6ee9ae6 (patch)
treecb73e75d8309b7dc17eb2b69fa9c15adce872bf2 /src
parente00e9fa0faac915b1b12675d1788bcb37b8fc769 (diff)
downloaddisutils2-b2e9e5f4ba2268f1b01dbbb8e1f16d07d6ee9ae6.tar.gz
added encode_multipart
Diffstat (limited to 'src')
-rw-r--r--src/distutils2/command/upload_docs.py32
-rw-r--r--src/distutils2/tests/test_upload_docs.py33
2 files changed, 62 insertions, 3 deletions
diff --git a/src/distutils2/command/upload_docs.py b/src/distutils2/command/upload_docs.py
index 8400b3d..0904a6b 100644
--- a/src/distutils2/command/upload_docs.py
+++ b/src/distutils2/command/upload_docs.py
@@ -14,6 +14,38 @@ def zip_dir_into(directory, destination):
zip_file.write(full, dest)
zip_file.close()
+# grabbed from
+# http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/
+def encode_multipart(fields, files, boundary=None):
+ """
+ fields is a sequence of (name, value) elements for regular form fields.
+ files is a sequence of (name, filename, content_type, value)
+ elements for data to be uploaded as files
+ Return (content_type, body) ready for httplib.HTTP instance
+ """
+ if boundary is None:
+ boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+ CRLF = '\r\n'
+ l = []
+ for (key, value) in fields:
+ l.extend([
+ '--' + boundary,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ value])
+ for (key, filename, content_type, value) in files:
+ l.extend([
+ '--' + boundary,
+ 'Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename),
+ 'Content-Type: %s' % content_type,
+ '',
+ value])
+ l.append('--' + boundary + '--')
+ l.append('')
+ body = CRLF.join(l)
+ content_type = 'multipart/form-data; boundary=%s' % boundary
+ return content_type, body
+
class upload_docs(Command):
user_options = [
diff --git a/src/distutils2/tests/test_upload_docs.py b/src/distutils2/tests/test_upload_docs.py
index a50e618..4d3b23c 100644
--- a/src/distutils2/tests/test_upload_docs.py
+++ b/src/distutils2/tests/test_upload_docs.py
@@ -2,7 +2,8 @@
# -*- encoding: utf8 -*-
import os, os.path, tempfile, unittest2, zipfile
-from distutils2.command.upload_docs import upload_docs, zip_dir_into
+from distutils2.command.upload_docs import (upload_docs, zip_dir_into,
+ encode_multipart)
from distutils2.core import Distribution
from distutils2.tests import support
@@ -11,6 +12,29 @@ from distutils2.tests.test_upload import PyPIServerTestCase
from distutils2.tests.test_config import PYPIRC, PyPIRCCommandTestCase
+EXPECTED_MULTIPART_OUTPUT = "\r\n".join([
+'---x',
+'Content-Disposition: form-data; name="a"',
+'',
+'b',
+'---x',
+'Content-Disposition: form-data; name="c"',
+'',
+'d',
+'---x',
+'Content-Disposition: form-data; name="e"; filename="f"',
+'Content-Type: g',
+'',
+'h',
+'---x',
+'Content-Disposition: form-data; name="i"; filename="j"',
+'Content-Type: k',
+'',
+'l',
+'---x--',
+'',
+])
+
class UploadDocsTestCase(PyPIServerTestCase,
support.TempdirManager,
unittest2.TestCase):
@@ -38,8 +62,11 @@ class UploadDocsTestCase(PyPIServerTestCase,
zip_f = zipfile.ZipFile(destination)
self.assertEqual(zip_f.namelist(), ['some_dir/some_file'])
- def test_zip_dir(self):
- pass
+ def test_encode_multipart(self):
+ fields = [("a", "b"), ("c", "d")]
+ files = [("e", "f", "g", "h"), ("i", "j", "k", "l")]
+ self.assertEqual(encode_multipart(fields, files, "-x")[0], "multipart/form-data; boundary=-x")
+ self.assertEqual(encode_multipart(fields, files, "-x")[1], EXPECTED_MULTIPART_OUTPUT)
def test_upload(self):
pass