Repository: graphql-python/graphene

Issue:
Bug: Name of a connection is always the name of the class
```
class BranchesOnClient(relay.Connection):
    pass
```

Based on the implementation of `relay.Connection` I expect the default name to be `BranchesOnClientConnection`.

```
class BranchesOnClient(relay.Connection, name="Foo"):
    pass
```

Now I expect the type name to be `Foo`.

In fact, in both cases the name will be `BranchesOnClient`. This is because `BaseType` sets `_meta.name` to the class name if no `name` argument is passed, and no `name` argument is passed because `relay.Connection` already caught it, assigned it to `_meta`, and removed it from the `**kwargs` dict that is passed on through the ``__init_subclass_with_meta__`` chain.

Comments:

Patch:
diff --git a/docs/relay/index.rst b/docs/relay/index.rst
index e3a87d0..7eb418d 100644
--- a/docs/relay/index.rst
+++ b/docs/relay/index.rst
@@ -21,9 +21,9 @@ Useful links
 -  `Relay Cursor Connection Specification`_
 -  `Relay input Object Mutation`_
 
-.. _Relay: https://facebook.github.io/relay/docs/graphql-relay-specification.html
+.. _Relay: https://facebook.github.io/relay/docs/en/graphql-server-specification.html
 .. _Relay specification: https://facebook.github.io/relay/graphql/objectidentification.htm#sec-Node-root-field
-.. _Getting started with Relay: https://facebook.github.io/relay/docs/graphql-relay-specification.html
+.. _Getting started with Relay: https://facebook.github.io/relay/docs/en/quick-start-guide.html
 .. _Relay Global Identification Specification: https://facebook.github.io/relay/graphql/objectidentification.htm
 .. _Relay Cursor Connection Specification: https://facebook.github.io/relay/graphql/connections.htm
 .. _Relay input Object Mutation: https://facebook.github.io/relay/graphql/mutations.htm
diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py
index afe6ffb..3e2e9ad 100644
--- a/graphene/relay/connection.py
+++ b/graphene/relay/connection.py
@@ -73,7 +73,7 @@ class Connection(ObjectType):
         edge = type(edge_name, edge_bases, {})
         cls.Edge = edge
 
-        _meta.name = name
+        options['name'] = name
         _meta.node = node
         _meta.fields = OrderedDict([
             ('page_info', Field(PageInfo, name='pageInfo', required=True)),
diff --git a/graphene/utils/str_converters.py b/graphene/utils/str_converters.py
index ae8ceff..6fcdfb7 100644
--- a/graphene/utils/str_converters.py
+++ b/graphene/utils/str_converters.py
@@ -1,13 +1,13 @@
 import re
 
 
-# From this response in Stackoverflow
+# Adapted from this response in Stackoverflow
 # http://stackoverflow.com/a/19053800/1072990
 def to_camel_case(snake_str):
     components = snake_str.split('_')
     # We capitalize the first letter of each component except the first one
-    # with the 'title' method and join them together.
-    return components[0] + "".join(x.title() if x else '_' for x in components[1:])
+    # with the 'capitalize' method and join them together.
+    return components[0] + ''.join(x.capitalize() if x else '_' for x in components[1:])
 
 
 # From this response in Stackoverflow


Test patch:
diff --git a/graphene/relay/tests/test_connection.py b/graphene/relay/tests/test_connection.py
index b6a26df..3697888 100644
--- a/graphene/relay/tests/test_connection.py
+++ b/graphene/relay/tests/test_connection.py
@@ -52,6 +52,21 @@ def test_connection_inherit_abstracttype():
     assert list(fields.keys()) == ['page_info', 'edges', 'extra']
 
 
+def test_connection_name():
+    custom_name = "MyObjectCustomNameConnection"
+
+    class BaseConnection(object):
+        extra = String()
+
+    class MyObjectConnection(BaseConnection, Connection):
+
+        class Meta:
+            node = MyObject
+            name = custom_name
+
+    assert MyObjectConnection._meta.name == custom_name
+
+
 def test_edge():
     class MyObjectConnection(Connection):
 
@@ -122,9 +137,10 @@ def test_connectionfield_node_deprecated():
     field = ConnectionField(MyObject)
     with pytest.raises(Exception) as exc_info:
         field.type
-    
+
     assert "ConnectionField's now need a explicit ConnectionType for Nodes." in str(exc_info.value)
 
+
 def test_connectionfield_custom_args():
     class MyObjectConnection(Connection):
 
diff --git a/graphene/utils/tests/test_str_converters.py b/graphene/utils/tests/test_str_converters.py
index 2ee7d7a..11f7e15 100644
--- a/graphene/utils/tests/test_str_converters.py
+++ b/graphene/utils/tests/test_str_converters.py
@@ -16,6 +16,7 @@ def test_camel_case():
     assert to_camel_case('snakes_on_a_plane') == 'snakesOnAPlane'
     assert to_camel_case('snakes_on_a__plane') == 'snakesOnA_Plane'
     assert to_camel_case('i_phone_hysteria') == 'iPhoneHysteria'
+    assert to_camel_case('field_i18n') == 'fieldI18n'
 
 
 def test_to_const():