[Python-modules-commits] [python-feather-format] 02/04: Import python-feather-format_0.1.1.orig.tar.gz

ChangZhuo Chen czchen at moszumanska.debian.org
Tue Apr 5 06:23:21 UTC 2016


This is an automated email from the git hooks/post-receive script.

czchen pushed a commit to tag debian/0.1.1-1
in repository python-feather-format.

commit fc565f435b03af10c04dee6eaf1865a509fdbc90
Author: ChangZhuo Chen (陳昌倬) <czchen at debian.org>
Date:   Tue Apr 5 14:13:00 2016 +0800

    Import python-feather-format_0.1.1.orig.tar.gz
---
 PKG-INFO                                 |  30 ++++-
 README.md                                |  28 +++++
 feather/api.py                           |   4 +-
 feather/ext.cpp                          | 209 +++++++++++++++----------------
 feather/ext.pyx                          |   1 -
 feather/interop.h                        |   8 +-
 feather/tests/test_reader.py             |   4 +
 feather/version.py                       |   2 +-
 feather_format.egg-info/PKG-INFO         |  30 ++++-
 feather_format.egg-info/SOURCES.txt      |  11 +-
 setup.py                                 |   2 +-
 src/feather/CMakeLists.txt               |   8 +-
 src/feather/buffer.h                     |  13 +-
 src/feather/io.cc                        |  13 +-
 src/feather/metadata.cc                  |   4 +-
 src/feather/metadata.h                   |   7 +-
 src/feather/mman.h                       | 201 +++++++++++++++++++++++++++++
 src/feather/reader.cc                    |  13 +-
 src/feather/reader.h                     |  14 +--
 src/feather/status.h                     |  11 --
 src/feather/{ => tests}/io-test.cc       |  22 +++-
 src/feather/{ => tests}/metadata-test.cc |   0
 src/feather/{ => tests}/test-common.h    |   0
 src/feather/{ => tests}/test_main.cc     |   0
 src/feather/{ => tests}/writer-test.cc   |   2 +-
 25 files changed, 474 insertions(+), 163 deletions(-)

diff --git a/PKG-INFO b/PKG-INFO
index 0882418..2c5d6f3 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: feather-format
-Version: 0.1.0
+Version: 0.1.1
 Summary: Python interface to the Apache Arrow-based Feather File Format
 Home-page: http://github.com/wesm/feather
 Author: Wes McKinney
@@ -16,6 +16,34 @@ Description: ## Python interface to the Apache Arrow-based Feather File Format
         to include libfeather (the C++ core library) to be built statically as part of
         the Python extension build, but this may change in the future.
         
+        ### Static builds for easier packaging
+        
+        At the moment, the libfeather sources are being built and linked with the
+        Cython extension, rather than building the `libfeather` shared library and
+        linking to that.
+        
+        While we continue to do this, building from source requires you to symlink (or
+        copy) the C++ sources. See:
+        
+        ```shell
+        # Symlink the C++ library for the static build
+        ln -s ../cpp/src src
+        python setup.py build
+        
+        # To install it locally
+        python setup.py install
+        
+        # Source distribution
+        python setup.py sdist
+        ```
+        
+        To change this and instead link to an installed `libfeather.so`, look in
+        `setup.py` and make the following change:
+        
+        ```python
+        FEATHER_STATIC_BUILD = False
+        ```
+        
         ## Limitations
         
         Some features of pandas are not supported in Feather:
diff --git a/README.md b/README.md
index 748c548..dd9a748 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,34 @@ Building Feather requires a C++11 compiler. We've simplified the PyPI packaging
 to include libfeather (the C++ core library) to be built statically as part of
 the Python extension build, but this may change in the future.
 
+### Static builds for easier packaging
+
+At the moment, the libfeather sources are being built and linked with the
+Cython extension, rather than building the `libfeather` shared library and
+linking to that.
+
+While we continue to do this, building from source requires you to symlink (or
+copy) the C++ sources. See:
+
+```shell
+# Symlink the C++ library for the static build
+ln -s ../cpp/src src
+python setup.py build
+
+# To install it locally
+python setup.py install
+
+# Source distribution
+python setup.py sdist
+```
+
+To change this and instead link to an installed `libfeather.so`, look in
+`setup.py` and make the following change:
+
+```python
+FEATHER_STATIC_BUILD = False
+```
+
 ## Limitations
 
 Some features of pandas are not supported in Feather:
diff --git a/feather/api.py b/feather/api.py
index aae595e..95ea54e 100644
--- a/feather/api.py
+++ b/feather/api.py
@@ -13,8 +13,10 @@
 # limitations under the License.
 
 import six
-
+from distutils.version import LooseVersion
 import pandas as pd
+if LooseVersion(pd.__version__) < '0.17.0':
+    raise ImportError("feather requires pandas >= 0.17.0")
 
 import feather.ext as ext
 
diff --git a/feather/ext.cpp b/feather/ext.cpp
index 15b12fb..58e70a5 100644
--- a/feather/ext.cpp
+++ b/feather/ext.cpp
@@ -18,10 +18,7 @@
             "/home/wesm/anaconda3/envs/py27/lib/python2.7/site-packages/numpy/core/include", 
             "/home/wesm/code/feather/python/src"
         ], 
-        "language": "c++", 
-        "libraries": [
-            "feather"
-        ]
+        "language": "c++"
     }
 }
 END: Cython Metadata */
@@ -3226,8 +3223,8 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_array", 0);
 
-  /* "feather/ext.pyx":175
- *             CategoryColumn* cat
+  /* "feather/ext.pyx":174
+ *             Column* cp
  * 
  *         if i < 0 or i >= self.num_columns:             # <<<<<<<<<<<<<<
  *             raise IndexError(i)
@@ -3239,42 +3236,42 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
     __pyx_t_1 = __pyx_t_2;
     goto __pyx_L4_bool_binop_done;
   }
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_num_columns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_num_columns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_1 = __pyx_t_2;
   __pyx_L4_bool_binop_done:;
   if (__pyx_t_1) {
 
-    /* "feather/ext.pyx":176
+    /* "feather/ext.pyx":175
  * 
  *         if i < 0 or i >= self.num_columns:
  *             raise IndexError(i)             # <<<<<<<<<<<<<<
  * 
  *         check_status(self.reader.get().GetColumn(i, &col))
  */
-    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_Raise(__pyx_t_5, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "feather/ext.pyx":175
- *             CategoryColumn* cat
+    /* "feather/ext.pyx":174
+ *             Column* cp
  * 
  *         if i < 0 or i >= self.num_columns:             # <<<<<<<<<<<<<<
  *             raise IndexError(i)
@@ -3282,18 +3279,18 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
  */
   }
 
-  /* "feather/ext.pyx":178
+  /* "feather/ext.pyx":177
  *             raise IndexError(i)
  * 
  *         check_status(self.reader.get().GetColumn(i, &col))             # <<<<<<<<<<<<<<
  * 
  *         cp = col.get()
  */
-  __pyx_t_5 = __pyx_f_7feather_3ext_check_status(__pyx_v_self->reader.get()->GetColumn(__pyx_v_i, (&__pyx_v_col))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_f_7feather_3ext_check_status(__pyx_v_self->reader.get()->GetColumn(__pyx_v_i, (&__pyx_v_col))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "feather/ext.pyx":180
+  /* "feather/ext.pyx":179
  *         check_status(self.reader.get().GetColumn(i, &col))
  * 
  *         cp = col.get()             # <<<<<<<<<<<<<<
@@ -3302,7 +3299,7 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
  */
   __pyx_v_cp = __pyx_v_col.get();
 
-  /* "feather/ext.pyx":182
+  /* "feather/ext.pyx":181
  *         cp = col.get()
  * 
  *         if cp.type() == ColumnType_PRIMITIVE:             # <<<<<<<<<<<<<<
@@ -3312,19 +3309,19 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
   __pyx_t_1 = ((__pyx_v_cp->type() ==  feather::ColumnType::PRIMITIVE) != 0);
   if (__pyx_t_1) {
 
-    /* "feather/ext.pyx":183
+    /* "feather/ext.pyx":182
  * 
  *         if cp.type() == ColumnType_PRIMITIVE:
  *             values = primitive_to_pandas(cp.values())             # <<<<<<<<<<<<<<
  *         elif cp.type() == ColumnType_CATEGORY:
  *             values = category_to_pandas(cp)
  */
-    __pyx_t_5 = feather::py::primitive_to_pandas(__pyx_v_cp->values()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = feather::py::primitive_to_pandas(__pyx_v_cp->values()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_values = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "feather/ext.pyx":182
+    /* "feather/ext.pyx":181
  *         cp = col.get()
  * 
  *         if cp.type() == ColumnType_PRIMITIVE:             # <<<<<<<<<<<<<<
@@ -3334,7 +3331,7 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
     goto __pyx_L6;
   }
 
-  /* "feather/ext.pyx":184
+  /* "feather/ext.pyx":183
  *         if cp.type() == ColumnType_PRIMITIVE:
  *             values = primitive_to_pandas(cp.values())
  *         elif cp.type() == ColumnType_CATEGORY:             # <<<<<<<<<<<<<<
@@ -3344,19 +3341,19 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
   __pyx_t_1 = ((__pyx_v_cp->type() ==  feather::ColumnType::CATEGORY) != 0);
   if (__pyx_t_1) {
 
-    /* "feather/ext.pyx":185
+    /* "feather/ext.pyx":184
  *             values = primitive_to_pandas(cp.values())
  *         elif cp.type() == ColumnType_CATEGORY:
  *             values = category_to_pandas(cp)             # <<<<<<<<<<<<<<
  *         elif cp.type() == ColumnType_TIMESTAMP:
  *             values = timestamp_to_pandas(cp)
  */
-    __pyx_t_5 = __pyx_f_7feather_3ext_category_to_pandas(__pyx_v_cp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_f_7feather_3ext_category_to_pandas(__pyx_v_cp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_values = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "feather/ext.pyx":184
+    /* "feather/ext.pyx":183
  *         if cp.type() == ColumnType_PRIMITIVE:
  *             values = primitive_to_pandas(cp.values())
  *         elif cp.type() == ColumnType_CATEGORY:             # <<<<<<<<<<<<<<
@@ -3366,7 +3363,7 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
     goto __pyx_L6;
   }
 
-  /* "feather/ext.pyx":186
+  /* "feather/ext.pyx":185
  *         elif cp.type() == ColumnType_CATEGORY:
  *             values = category_to_pandas(cp)
  *         elif cp.type() == ColumnType_TIMESTAMP:             # <<<<<<<<<<<<<<
@@ -3376,19 +3373,19 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
   __pyx_t_1 = ((__pyx_v_cp->type() ==  feather::ColumnType::TIMESTAMP) != 0);
   if (__pyx_t_1) {
 
-    /* "feather/ext.pyx":187
+    /* "feather/ext.pyx":186
  *             values = category_to_pandas(cp)
  *         elif cp.type() == ColumnType_TIMESTAMP:
  *             values = timestamp_to_pandas(cp)             # <<<<<<<<<<<<<<
  *         else:
  *             raise NotImplementedError(cp.type())
  */
-    __pyx_t_5 = __pyx_f_7feather_3ext_timestamp_to_pandas(__pyx_v_cp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_f_7feather_3ext_timestamp_to_pandas(__pyx_v_cp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_values = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "feather/ext.pyx":186
+    /* "feather/ext.pyx":185
  *         elif cp.type() == ColumnType_CATEGORY:
  *             values = category_to_pandas(cp)
  *         elif cp.type() == ColumnType_TIMESTAMP:             # <<<<<<<<<<<<<<
@@ -3398,7 +3395,7 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
     goto __pyx_L6;
   }
 
-  /* "feather/ext.pyx":189
+  /* "feather/ext.pyx":188
  *             values = timestamp_to_pandas(cp)
  *         else:
  *             raise NotImplementedError(cp.type())             # <<<<<<<<<<<<<<
@@ -3406,23 +3403,23 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
  *         return frombytes(cp.name()), values
  */
   /*else*/ {
-    __pyx_t_5 = __Pyx_PyInt_From_enum____feather_3a__3a_ColumnType_3a__3a_type(__pyx_v_cp->type()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyInt_From_enum____feather_3a__3a_ColumnType_3a__3a_type(__pyx_v_cp->type()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_NotImplementedError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_NotImplementedError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_Raise(__pyx_t_5, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_L6:;
 
-  /* "feather/ext.pyx":191
+  /* "feather/ext.pyx":190
  *             raise NotImplementedError(cp.type())
  * 
  *         return frombytes(cp.name()), values             # <<<<<<<<<<<<<<
@@ -3430,9 +3427,9 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_frombytes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_frombytes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_v_cp->name()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_v_cp->name()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_6 = NULL;
   if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
@@ -3445,22 +3442,22 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
     }
   }
   if (!__pyx_t_6) {
-    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_GOTREF(__pyx_t_5);
   } else {
-    __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
     __Pyx_GIVEREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_5);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
@@ -3496,7 +3493,7 @@ static PyObject *__pyx_pf_7feather_3ext_13FeatherReader_2read_array(struct __pyx
   return __pyx_r;
 }
 
-/* "feather/ext.pyx":194
+/* "feather/ext.pyx":193
  * 
  * 
  * cdef category_to_pandas(Column* col):             # <<<<<<<<<<<<<<
@@ -3519,7 +3516,7 @@ static PyObject *__pyx_f_7feather_3ext_category_to_pandas(feather::Column *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("category_to_pandas", 0);
 
-  /* "feather/ext.pyx":195
+  /* "feather/ext.pyx":194
  * 
  * cdef category_to_pandas(Column* col):
  *     cdef CategoryColumn* cat = <CategoryColumn*>(col)             # <<<<<<<<<<<<<<
@@ -3528,31 +3525,31 @@ static PyObject *__pyx_f_7feather_3ext_category_to_pandas(feather::Column *__pyx
  */
   __pyx_v_cat = ((feather::CategoryColumn *)__pyx_v_col);
 
-  /* "feather/ext.pyx":197
+  /* "feather/ext.pyx":196
  *     cdef CategoryColumn* cat = <CategoryColumn*>(col)
  * 
  *     values = primitive_to_pandas(cat.values())             # <<<<<<<<<<<<<<
  *     levels = primitive_to_pandas(cat.levels())
  * 
  */
-  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->values()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->values()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_values = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "feather/ext.pyx":198
+  /* "feather/ext.pyx":197
  * 
  *     values = primitive_to_pandas(cat.values())
  *     levels = primitive_to_pandas(cat.levels())             # <<<<<<<<<<<<<<
  * 
  *     return pd.Categorical(values, categories=levels,
  */
-  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->levels()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->levels()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_levels = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "feather/ext.pyx":200
+  /* "feather/ext.pyx":199
  *     levels = primitive_to_pandas(cat.levels())
  * 
  *     return pd.Categorical(values, categories=levels,             # <<<<<<<<<<<<<<
@@ -3560,37 +3557,37 @@ static PyObject *__pyx_f_7feather_3ext_category_to_pandas(feather::Column *__pyx
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Categorical); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Categorical); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_values);
   __Pyx_GIVEREF(__pyx_v_values);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_values);
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_categories, __pyx_v_levels) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_categories, __pyx_v_levels) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "feather/ext.pyx":201
+  /* "feather/ext.pyx":200
  * 
  *     return pd.Categorical(values, categories=levels,
  *                           fastpath=True)             # <<<<<<<<<<<<<<
  * 
  * cdef timestamp_to_pandas(Column* col):
  */
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_fastpath, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_fastpath, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "feather/ext.pyx":200
+  /* "feather/ext.pyx":199
  *     levels = primitive_to_pandas(cat.levels())
  * 
  *     return pd.Categorical(values, categories=levels,             # <<<<<<<<<<<<<<
  *                           fastpath=True)
  * 
  */
-  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3599,7 +3596,7 @@ static PyObject *__pyx_f_7feather_3ext_category_to_pandas(feather::Column *__pyx
   __pyx_t_4 = 0;
   goto __pyx_L0;
 
-  /* "feather/ext.pyx":194
+  /* "feather/ext.pyx":193
  * 
  * 
  * cdef category_to_pandas(Column* col):             # <<<<<<<<<<<<<<
@@ -3623,7 +3620,7 @@ static PyObject *__pyx_f_7feather_3ext_category_to_pandas(feather::Column *__pyx
   return __pyx_r;
 }
 
-/* "feather/ext.pyx":203
+/* "feather/ext.pyx":202
  *                           fastpath=True)
  * 
  * cdef timestamp_to_pandas(Column* col):             # <<<<<<<<<<<<<<
@@ -3649,7 +3646,7 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("timestamp_to_pandas", 0);
 
-  /* "feather/ext.pyx":204
+  /* "feather/ext.pyx":203
  * 
  * cdef timestamp_to_pandas(Column* col):
  *     cdef TimestampColumn* cat = <TimestampColumn*>(col)             # <<<<<<<<<<<<<<
@@ -3658,28 +3655,28 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
  */
   __pyx_v_cat = ((feather::TimestampColumn *)__pyx_v_col);
 
-  /* "feather/ext.pyx":206
+  /* "feather/ext.pyx":205
  *     cdef TimestampColumn* cat = <TimestampColumn*>(col)
  * 
  *     values = primitive_to_pandas(cat.values())             # <<<<<<<<<<<<<<
  * 
  *     tz = frombytes(cat.timezone())
  */
-  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->values()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = feather::py::primitive_to_pandas(__pyx_v_cat->values()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_values = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "feather/ext.pyx":208
+  /* "feather/ext.pyx":207
  *     values = primitive_to_pandas(cat.values())
  * 
  *     tz = frombytes(cat.timezone())             # <<<<<<<<<<<<<<
  *     if tz:
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frombytes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frombytes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_v_cat->timezone()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_v_cat->timezone()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = NULL;
   if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
@@ -3692,17 +3689,17 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
     }
   }
   if (!__pyx_t_4) {
-    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_GOTREF(__pyx_t_1);
   } else {
-    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
     __Pyx_GIVEREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   }
@@ -3710,26 +3707,26 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
   __pyx_v_tz = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "feather/ext.pyx":209
+  /* "feather/ext.pyx":208
  * 
  *     tz = frombytes(cat.timezone())
  *     if tz:             # <<<<<<<<<<<<<<
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')
  *                   .tz_convert(tz))
  */
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_tz); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_tz); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_6) {
 
-    /* "feather/ext.pyx":210
+    /* "feather/ext.pyx":209
  *     tz = frombytes(cat.timezone())
  *     if tz:
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')             # <<<<<<<<<<<<<<
  *                   .tz_convert(tz))
  *         result = pd.Series(values)
  */
-    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_DatetimeIndex); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_DatetimeIndex); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = NULL;
@@ -3743,35 +3740,35 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
       }
     }
     if (!__pyx_t_5) {
-      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_values); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_values); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
     } else {
-      __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); __pyx_t_5 = NULL;
       __Pyx_INCREF(__pyx_v_values);
       __Pyx_GIVEREF(__pyx_v_values);
       PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_values);
-      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_tz_localize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_tz_localize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "feather/ext.pyx":211
+    /* "feather/ext.pyx":210
  *     if tz:
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')
  *                   .tz_convert(tz))             # <<<<<<<<<<<<<<
  *         result = pd.Series(values)
  *     else:
  */
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_tz_convert); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_tz_convert); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = NULL;
@@ -3785,16 +3782,16 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
       }
     }
     if (!__pyx_t_2) {
-      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_tz); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_tz); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
     } else {
-      __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL;
       __Pyx_INCREF(__pyx_v_tz);
       __Pyx_GIVEREF(__pyx_v_tz);
       PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_tz);
-      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
@@ -3802,16 +3799,16 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
     __Pyx_DECREF_SET(__pyx_v_values, __pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "feather/ext.pyx":212
+    /* "feather/ext.pyx":211
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')
  *                   .tz_convert(tz))
  *         result = pd.Series(values)             # <<<<<<<<<<<<<<
  *     else:
  *         result = pd.Series(values, dtype='M8[ns]')
  */
-    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = NULL;
@@ -3825,16 +3822,16 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
       }
     }
     if (!__pyx_t_3) {
-      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_values); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_values); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
     } else {
-      __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __pyx_t_3 = NULL;
       __Pyx_INCREF(__pyx_v_values);
       __Pyx_GIVEREF(__pyx_v_values);
       PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_v_values);
-      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
@@ -3842,7 +3839,7 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
     __pyx_v_result = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "feather/ext.pyx":209
+    /* "feather/ext.pyx":208
  * 
  *     tz = frombytes(cat.timezone())
  *     if tz:             # <<<<<<<<<<<<<<
@@ -3852,7 +3849,7 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
     goto __pyx_L3;
   }
 
-  /* "feather/ext.pyx":214
+  /* "feather/ext.pyx":213
  *         result = pd.Series(values)
  *     else:
  *         result = pd.Series(values, dtype='M8[ns]')             # <<<<<<<<<<<<<<
@@ -3860,20 +3857,20 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
  *     return result
  */
   /*else*/ {
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_pd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Series); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_values);
     __Pyx_GIVEREF(__pyx_v_values);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_values);
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_kp_s_M8_ns) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_kp_s_M8_ns) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3883,7 +3880,7 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
   }
   __pyx_L3:;
 
-  /* "feather/ext.pyx":216
+  /* "feather/ext.pyx":215
  *         result = pd.Series(values, dtype='M8[ns]')
  * 
  *     return result             # <<<<<<<<<<<<<<
@@ -3893,7 +3890,7 @@ static PyObject *__pyx_f_7feather_3ext_timestamp_to_pandas(feather::Column *__py
   __pyx_r = __pyx_v_result;
   goto __pyx_L0;
 
-  /* "feather/ext.pyx":203
+  /* "feather/ext.pyx":202
  *                           fastpath=True)
  * 
  * cdef timestamp_to_pandas(Column* col):             # <<<<<<<<<<<<<<
@@ -6654,8 +6651,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_Exception = __Pyx_GetBuiltinName(__pyx_n_s_Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
@@ -6689,14 +6686,14 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_tuple__2);
   __Pyx_GIVEREF(__pyx_tuple__2);
 
-  /* "feather/ext.pyx":210
+  /* "feather/ext.pyx":209
  *     tz = frombytes(cat.timezone())
  *     if tz:
  *         values = (pd.DatetimeIndex(values).tz_localize('utc')             # <<<<<<<<<<<<<<
  *                   .tz_convert(tz))
  *         result = pd.Series(values)
  */
-  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_n_s_utc); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_n_s_utc); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_tuple__4);
   __Pyx_GIVEREF(__pyx_tuple__4);
 
diff --git a/feather/ext.pyx b/feather/ext.pyx
index 5d211db..d7952ff 100644
--- a/feather/ext.pyx
+++ b/feather/ext.pyx
@@ -170,7 +170,6 @@ cdef class FeatherReader:
         cdef:
             shared_ptr[Column] col
             Column* cp
-            CategoryColumn* cat
 
         if i < 0 or i >= self.num_columns:
             raise IndexError(i)
diff --git a/feather/interop.h b/feather/interop.h
index cb5b64c..74f0ab2 100644
--- a/feather/interop.h
+++ b/feather/interop.h
@@ -527,7 +527,7 @@ class FeatherDeserializer {
   ConvertValues() {
     typedef typename feather_traits<T2>::T T;
 
-    npy_intp dims[1] = {arr_->length};
+    npy_intp dims[1] = {static_cast<npy_intp>(arr_->length)};
     out_ = PyArray_SimpleNew(1, dims, feather_traits<T2>::npy_type);
 
     if (out_ == NULL) {
@@ -553,7 +553,7 @@ class FeatherDeserializer {
   ConvertValues() {
     typedef typename feather_traits<T2>::T T;
 
-    npy_intp dims[1] = {arr_->length};
+    npy_intp dims[1] = {static_cast<npy_intp>(arr_->length)};
     if (arr_->null_count > 0) {
       out_ = PyArray_SimpleNew(1, dims, NPY_FLOAT64);
       if (out_ == NULL)  return;
@@ -575,7 +575,7 @@ class FeatherDeserializer {
   template <int T2>
   inline typename std::enable_if<feather_traits<T2>::is_boolean, void>::type
   ConvertValues() {
-    npy_intp dims[1] = {arr_->length};
+    npy_intp dims[1] = {static_cast<npy_intp>(arr_->length)};
     if (arr_->null_count > 0) {
       out_ = PyArray_SimpleNew(1, dims, NPY_OBJECT);
       if (out_ == NULL)  return;
@@ -609,7 +609,7 @@ class FeatherDeserializer {
   template <int T2>
   inline typename std::enable_if<T2 == PrimitiveType::UTF8, void>::type
   ConvertValues() {
-    npy_intp dims[1] = {arr_->length};
+    npy_intp dims[1] = {static_cast<npy_intp>(arr_->length)};
     out_ = PyArray_SimpleNew(1, dims, NPY_OBJECT);
     if (out_ == NULL)  return;
     PyObject** out_values = reinterpret_cast<PyObject**>(PyArray_DATA(out_));
diff --git a/feather/tests/test_reader.py b/feather/tests/test_reader.py
index 0d0eb11..7ec585d 100644
--- a/feather/tests/test_reader.py
+++ b/feather/tests/test_reader.py
@@ -204,6 +204,10 @@ class TestFeatherReader(unittest.TestCase):
         expected = pd.DataFrame({'strings': values * repeats})
         self._check_pandas_roundtrip(df, expected)
 
+    def test_empty_strings(self):
+        df = pd.DataFrame({'strings': [''] * 10})
+        self._check_pandas_roundtrip(df)
+
     def test_nan_as_null(self):
         # Create a nan that is not numpy.nan
         values = np.array(['foo', np.nan, np.nan * 2, 'bar'] * 10)
diff --git a/feather/version.py b/feather/version.py
index 65c2a72..5e2655d 100644
--- a/feather/version.py
+++ b/feather/version.py
@@ -1,4 +1,4 @@
 
 # THIS FILE IS GENERATED FROM SETUP.PY
-version = '0.1.0'
+version = '0.1.1'
 isrelease = 'True'
\ No newline at end of file
diff --git a/feather_format.egg-info/PKG-INFO b/feather_format.egg-info/PKG-INFO
index 0882418..2c5d6f3 100644
--- a/feather_format.egg-info/PKG-INFO
+++ b/feather_format.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: feather-format
-Version: 0.1.0
+Version: 0.1.1
 Summary: Python interface to the Apache Arrow-based Feather File Format
 Home-page: http://github.com/wesm/feather
 Author: Wes McKinney
@@ -16,6 +16,34 @@ Description: ## Python interface to the Apache Arrow-based Feather File Format
         to include libfeather (the C++ core library) to be built statically as part of
         the Python extension build, but this may change in the future.
         
+        ### Static builds for easier packaging
+        
+        At the moment, the libfeather sources are being built and linked with the
+        Cython extension, rather than building the `libfeather` shared library and
+        linking to that.
+        
+        While we continue to do this, building from source requires you to symlink (or
+        copy) the C++ sources. See:
+        
+        ```shell
+        # Symlink the C++ library for the static build
+        ln -s ../cpp/src src
+        python setup.py build
+        
+        # To install it locally
+        python setup.py install
+        
+        # Source distribution
+        python setup.py sdist
+        ```
+        
+        To change this and instead link to an installed `libfeather.so`, look in
+        `setup.py` and make the following change:
+        
+        ```python
+        FEATHER_STATIC_BUILD = False
+        ```
+        
         ## Limitations
         
         Some features of pandas are not supported in Feather:
diff --git a/feather_format.egg-info/SOURCES.txt b/feather_format.egg-info/SOURCES.txt
index 293392d..249f79e 100644
--- a/feather_format.egg-info/SOURCES.txt
+++ b/feather_format.egg-info/SOURCES.txt
@@ -22,23 +22,24 @@ src/feather/api.h
 src/feather/buffer.cc
 src/feather/buffer.h
 src/feather/common.h
-src/feather/io-test.cc
 src/feather/io.cc
 src/feather/io.h
-src/feather/metadata-test.cc
 src/feather/metadata.cc
 src/feather/metadata.fbs
 src/feather/metadata.h
 src/feather/metadata_generated.h
+src/feather/mman.h
 src/feather/reader.cc
 src/feather/reader.h
 src/feather/status.cc
 src/feather/status.h
-src/feather/test-common.h
-src/feather/test_main.cc
 src/feather/types.cc
 src/feather/types.h
-src/feather/writer-test.cc
 src/feather/writer.cc
 src/feather/writer.h
+src/feather/tests/io-test.cc
+src/feather/tests/metadata-test.cc
+src/feather/tests/test-common.h
+src/feather/tests/test_main.cc
+src/feather/tests/writer-test.cc
 src/flatbuffers/flatbuffers.h
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 9a99ff9..099bf9b 100644
--- a/setup.py
+++ b/setup.py
@@ -34,7 +34,7 @@ if Cython.__version__ < '0.19.1':
 
 MAJOR = 0
 MINOR = 1
-MICRO = 0
+MICRO = 1
 VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
 ISRELEASED = True
 
diff --git a/src/feather/CMakeLists.txt b/src/feather/CMakeLists.txt
index 457d306..42dc584 100644
--- a/src/feather/CMakeLists.txt
+++ b/src/feather/CMakeLists.txt
@@ -43,7 +43,7 @@ if(APPLE)
 endif()
... 531 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-feather-format.git



More information about the Python-modules-commits mailing list