diff --git a/ddt.py b/ddt.py
index b34ab79..2b7c670 100644
--- a/ddt.py
+++ b/ddt.py
@@ -90,20 +90,30 @@ def data(*values):
     Should be added to methods of instances of ``unittest.TestCase``.
 
     """
-    return idata(values, len(str(len(values))))
+    return idata(values)
 
 
-def idata(iterable, index_len):
+def idata(iterable, index_len=None):
     """
     Method decorator to add to your test methods.
 
     Should be added to methods of instances of ``unittest.TestCase``.
 
+    :param iterable: iterable of the values to provide to the test function.
+    :param index_len: an optional integer specifying the width to zero-pad the
+        test identifier indices to.  If not provided, this will add the fewest
+        zeros necessary to make all identifiers the same length.
     """
+    if index_len is None:
+        # Avoid consuming a one-time-use generator.
+        iterable = tuple(iterable)
+        index_len = len(str(len(iterable)))
+
     def wrapper(func):
         setattr(func, DATA_ATTR, iterable)
         setattr(func, INDEX_LEN, index_len)
         return func
+
     return wrapper
 
 
@@ -371,4 +381,4 @@ def ddt(arg=None, **kwargs):
 
     # ``arg`` is the unittest's test class when decorating with ``@ddt`` while
     # it is ``None`` when decorating a test class with ``@ddt(k=v)``.
-    return wrapper(arg) if inspect.isclass(arg) else wrapper
\ No newline at end of file
+    return wrapper(arg) if inspect.isclass(arg) else wrapper

diff --git a/test/test_example.py b/test/test_example.py
index 1d27043..dfc0454 100644
--- a/test/test_example.py
+++ b/test/test_example.py
@@ -1,6 +1,7 @@
+import itertools
 import unittest
 
-from ddt import ddt, data, file_data, unpack
+from ddt import ddt, data, file_data, idata, unpack
 from test.mycode import larger_than_two, has_three_elements, is_a_greeting
 
 try:
@@ -64,6 +65,12 @@ class FooTestCase(unittest.TestCase):
         a, b = value
         self.assertGreater(a, b)
 
+    @idata(itertools.product([0, 1, 2], [3, 4, 5]))
+    def test_iterable_argument(self, value):
+        first_value, second_value = value
+        self.assertLessEqual(first_value, 2)
+        self.assertGreaterEqual(second_value, 3)
+
     @data(annotated2([2, 1], 'Test_case_1', """Test docstring 1"""),
           annotated2([10, 5], 'Test_case_2', """Test docstring 2"""))
     def test_greater_with_name_docstring(self, value):
diff --git a/test/test_functional.py b/test/test_functional.py
index e860e34..a930dc3 100644
--- a/test/test_functional.py
+++ b/test/test_functional.py
@@ -9,7 +9,7 @@ try:
 except ImportError:
     import mock
 
-from ddt import ddt, data, file_data, TestNameFormat
+from ddt import ddt, data, file_data, idata, TestNameFormat
 
 from test.mycode import has_three_elements
 
@@ -185,6 +185,97 @@ def test_ddt_format_test_name_default():
         assert ("test_something_{}_{}".format(i, d) in tests)
 
 
+def test_idata_single_argument():
+    """Test that the single-argument form of ``idata`` works."""
+    payload = [5, 12, 13]
+
+    @ddt
+    class Dummy(object):
+        """Dummy class to test that the ``idata(iterable)`` decorator works."""
+        @idata(payload)
+        def test_something(self, value):
+            return value
+
+    tests = list(filter(_is_test, Dummy.__dict__))
+    assert len(tests) == len(payload)
+
+    expected_tests = [
+        "test_something_{:1d}_{}".format(i + 1, v) for i, v in enumerate(payload)
+    ]
+    assert sorted(tests) == sorted(expected_tests)
+
+
+def test_idata_automatic_zero_padding():
+    """
+    Test that the single-argument form of ``idata`` zero-pads its keys so the
+    lengths all match
+    """
+    payload = range(15)
+
+    @ddt
+    class Dummy(object):
+        """Dummy class to test that the ``idata(iterable)`` decorator works."""
+        @idata(payload)
+        def test_something(self, value):
+            return value
+
+    tests = list(filter(_is_test, Dummy.__dict__))
+    assert len(tests) == len(payload)
+
+    expected_tests = [
+        "test_something_{:02d}_{}".format(i + 1, v) for i, v in enumerate(payload)
+    ]
+    assert sorted(tests) == sorted(expected_tests)
+
+
+def test_idata_override_index_len():
+    """
+    Test that overriding ``index_len`` in ``idata`` can allow additional
+    zero-padding to be added.
+    """
+    payload = [4, 2, 1]
+
+    @ddt
+    class Dummy(object):
+        @idata(payload, index_len=2)
+        def test_something(self, value):
+            return value
+
+    tests = list(filter(_is_test, Dummy.__dict__))
+    assert len(tests) == len(payload)
+
+    expected_tests = [
+        "test_something_{:02d}_{}".format(i + 1, v) for i, v in enumerate(payload)
+    ]
+    assert sorted(tests) == sorted(expected_tests)
+
+
+def test_idata_consumable_iterator():
+    """
+    Test that using ``idata`` with a consumable iterator still generates the
+    expected tests.
+    """
+    payload = [51, 78, 2]
+
+    def consumable_iterator():
+        # Not using `yield from` for Python 2.7.
+        for i in payload:
+            yield i
+
+    @ddt
+    class Dummy(object):
+        @idata(consumable_iterator())
+        def test_something(self, value):
+            return value
+
+    tests = list(filter(_is_test, Dummy.__dict__))
+
+    expected_tests = [
+        "test_something_{:1d}_{}".format(i + 1, v) for i, v in enumerate(payload)
+    ]
+    assert sorted(tests) == sorted(expected_tests)
+
+
 def test_file_data_test_creation():
     """
     Test that the ``file_data`` decorator creates two tests

Signature change of `ddt.idata` in 1.4.3 breaks downstream uses
In #92, the signature of `idata` was changed from `idata(values)` to `idata(values, index_len)`, with no default handling for the latter argument.  This means that all current uses of `idata(values)` are now broken on upgrade to 1.4.3, and there's no compatible calling method for versions 1.4.2 and 1.4.3.

I'm not too familiar with your internals, but glancing through PR #92, it looks like it could be handled safely without affecting that PR by changing the signature to something like:
```python
def idata(values, index_len=None):
    if index_len is None:
        # Avoid accidentally consuming a one-time-use iterable.
        values = tuple(values)
        index_len = len(str(len(values)))
    # ... continue as normal ...
```
If so, I'd be happy to make the PR.
test/test_example.py::FooTestCase::test_dicts_extracted_into_kwargs_1 test/test_example.py::FooTestCase::test_dicts_extracted_into_kwargs_2 test/test_example.py::FooTestCase::test_doc_missing_args_1_3 test/test_example.py::FooTestCase::test_doc_missing_args_2_4 test/test_example.py::FooTestCase::test_doc_missing_args_3_12 test/test_example.py::FooTestCase::test_doc_missing_args_4_23 test/test_example.py::FooTestCase::test_doc_missing_kargs_1_3 test/test_example.py::FooTestCase::test_doc_missing_kargs_2_4 test/test_example.py::FooTestCase::test_doc_missing_kargs_3_12 test/test_example.py::FooTestCase::test_doc_missing_kargs_4_23 test/test_example.py::FooTestCase::test_file_data_json_dict_1_unsorted_list test/test_example.py::FooTestCase::test_file_data_json_dict_2_sorted_list test/test_example.py::FooTestCase::test_file_data_json_dict_dict_1_positive_integer_range test/test_example.py::FooTestCase::test_file_data_json_dict_dict_2_negative_integer_range test/test_example.py::FooTestCase::test_file_data_json_dict_dict_3_positive_real_range test/test_example.py::FooTestCase::test_file_data_json_dict_dict_4_negative_real_range test/test_example.py::FooTestCase::test_file_data_json_list_1_Hello test/test_example.py::FooTestCase::test_file_data_json_list_2_Goodbye test/test_example.py::FooTestCase::test_greater_1_test_2_greater_than_1 test/test_example.py::FooTestCase::test_greater_2_test_10_greater_than_5 test/test_example.py::FooTestCase::test_greater_with_name_docstring_1_Test_case_1 test/test_example.py::FooTestCase::test_greater_with_name_docstring_2_Test_case_2 test/test_example.py::FooTestCase::test_iterable_argument_1__0__3_ test/test_example.py::FooTestCase::test_iterable_argument_2__0__4_ test/test_example.py::FooTestCase::test_iterable_argument_3__0__5_ test/test_example.py::FooTestCase::test_iterable_argument_4__1__3_ test/test_example.py::FooTestCase::test_iterable_argument_5__1__4_ test/test_example.py::FooTestCase::test_iterable_argument_6__1__5_ test/test_example.py::FooTestCase::test_iterable_argument_7__2__3_ test/test_example.py::FooTestCase::test_iterable_argument_8__2__4_ test/test_example.py::FooTestCase::test_iterable_argument_9__2__5_ test/test_example.py::FooTestCase::test_larger_than_two_1_3 test/test_example.py::FooTestCase::test_larger_than_two_2_4 test/test_example.py::FooTestCase::test_larger_than_two_3_12 test/test_example.py::FooTestCase::test_larger_than_two_4_23 test/test_example.py::FooTestCase::test_larger_than_two_with_doc_1_3 test/test_example.py::FooTestCase::test_larger_than_two_with_doc_2_4 test/test_example.py::FooTestCase::test_larger_than_two_with_doc_3_12 test/test_example.py::FooTestCase::test_larger_than_two_with_doc_4_23 test/test_example.py::FooTestCase::test_list_extracted_into_arguments_1__3__2_ test/test_example.py::FooTestCase::test_list_extracted_into_arguments_2__4__3_ test/test_example.py::FooTestCase::test_list_extracted_into_arguments_3__5__3_ test/test_example.py::FooTestCase::test_list_extracted_with_doc_1__3__2_ test/test_example.py::FooTestCase::test_list_extracted_with_doc_2__4__3_ test/test_example.py::FooTestCase::test_list_extracted_with_doc_3__5__3_ test/test_example.py::FooTestCase::test_not_larger_than_two_1_1 test/test_example.py::FooTestCase::test_not_larger_than_two_2__3 test/test_example.py::FooTestCase::test_not_larger_than_two_3_2 test/test_example.py::FooTestCase::test_not_larger_than_two_4_0 test/test_example.py::FooTestCase::test_tuples_extracted_into_arguments_1__3__2_ test/test_example.py::FooTestCase::test_tuples_extracted_into_arguments_2__4__3_ test/test_example.py::FooTestCase::test_tuples_extracted_into_arguments_3__5__3_ test/test_example.py::FooTestCase::test_undecorated test/test_example.py::FooTestCase::test_unicode_1_ascii test/test_example.py::FooTestCase::test_unicode_2_non_ascii__ test/test_functional.py::test_data_decorator test/test_functional.py::test_file_data_decorator_with_dict test/test_functional.py::test_ddt test/test_functional.py::test_ddt_format_test_name_index_only test/test_functional.py::test_ddt_format_test_name_default test/test_functional.py::test_idata_single_argument test/test_functional.py::test_idata_automatic_zero_padding test/test_functional.py::test_idata_override_index_len test/test_functional.py::test_idata_consumable_iterator test/test_functional.py::test_file_data_test_creation test/test_functional.py::test_file_data_test_names_dict test/test_functional.py::test_feed_data_data test/test_functional.py::test_feed_data_file_data test/test_functional.py::test_feed_data_file_data_missing_json test/test_functional.py::test_feed_data_file_data_missing_yaml test/test_functional.py::test_ddt_data_name_attribute test/test_functional.py::test_ddt_data_doc_attribute test/test_functional.py::test_ddt_data_unicode test/test_functional.py::test_ddt_data_object test/test_functional.py::test_feed_data_with_invalid_identifier test/test_functional.py::test_load_yaml_without_yaml_support