diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e3ebdb859319a..de4c6687fbc0f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,11 +65,7 @@ repos: rev: 1.6.1 hooks: - id: cpplint - # We don't lint all C files because we don't want to lint any that are built - # from Cython files nor do we want to lint C files that we didn't modify for - # this particular codebase (e.g. src/headers, src/klib). However, - # we can lint all header files since they aren't "generated" like C files are. - exclude: ^pandas/_libs/src/(klib|headers)/ + exclude: ^pandas/_libs/include/pandas/vendored/klib args: [ --quiet, '--extensions=c,h', diff --git a/MANIFEST.in b/MANIFEST.in index 361cd8ff9ec22..781a72fdb5481 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -57,6 +57,4 @@ prune pandas/tests/io/parser/data # Selectively re-add *.cxx files that were excluded above graft pandas/_libs/src -graft pandas/_libs/tslibs/src -include pandas/_libs/pd_parser.h -include pandas/_libs/pd_parser.c +graft pandas/_libs/include diff --git a/pandas/_libs/tslibs/src/datetime/date_conversions.h b/pandas/_libs/include/pandas/datetime/date_conversions.h similarity index 100% rename from pandas/_libs/tslibs/src/datetime/date_conversions.h rename to pandas/_libs/include/pandas/datetime/date_conversions.h diff --git a/pandas/_libs/tslibs/src/datetime/pd_datetime.h b/pandas/_libs/include/pandas/datetime/pd_datetime.h similarity index 97% rename from pandas/_libs/tslibs/src/datetime/pd_datetime.h rename to pandas/_libs/include/pandas/datetime/pd_datetime.h index 4e3baf4b47ed0..55aa046cf076b 100644 --- a/pandas/_libs/tslibs/src/datetime/pd_datetime.h +++ b/pandas/_libs/include/pandas/datetime/pd_datetime.h @@ -22,9 +22,9 @@ See NUMPY_LICENSE.txt for the license. #endif // NPY_NO_DEPRECATED_API #include -#include "np_datetime.h" -#include "np_datetime_strings.h" -#include "date_conversions.h" +#include "pandas/vendored/numpy/datetime/np_datetime.h" +#include "pandas/vendored/numpy/datetime/np_datetime_strings.h" +#include "pandas/datetime/date_conversions.h" #ifdef __cplusplus extern "C" { diff --git a/pandas/_libs/src/inline_helper.h b/pandas/_libs/include/pandas/inline_helper.h similarity index 100% rename from pandas/_libs/src/inline_helper.h rename to pandas/_libs/include/pandas/inline_helper.h diff --git a/pandas/_libs/src/parser/io.h b/pandas/_libs/include/pandas/parser/io.h similarity index 100% rename from pandas/_libs/src/parser/io.h rename to pandas/_libs/include/pandas/parser/io.h diff --git a/pandas/_libs/pd_parser.h b/pandas/_libs/include/pandas/parser/pd_parser.h similarity index 99% rename from pandas/_libs/pd_parser.h rename to pandas/_libs/include/pandas/parser/pd_parser.h index 72254090c0056..1ea94fde593ef 100644 --- a/pandas/_libs/pd_parser.h +++ b/pandas/_libs/include/pandas/parser/pd_parser.h @@ -14,7 +14,7 @@ extern "C" { #define PY_SSIZE_T_CLEAN #include -#include "src/parser/tokenizer.h" +#include "pandas/parser/tokenizer.h" typedef struct { int (*to_double)(char *, double *, char, char, int *); diff --git a/pandas/_libs/src/parser/tokenizer.h b/pandas/_libs/include/pandas/parser/tokenizer.h similarity index 98% rename from pandas/_libs/src/parser/tokenizer.h rename to pandas/_libs/include/pandas/parser/tokenizer.h index 7e8c3d102ac63..a53d09012116d 100644 --- a/pandas/_libs/src/parser/tokenizer.h +++ b/pandas/_libs/include/pandas/parser/tokenizer.h @@ -19,10 +19,10 @@ See LICENSE for the license #define ERROR_INVALID_CHARS 3 #include -#include "../inline_helper.h" -#include "../headers/portable.h" +#include "pandas/inline_helper.h" +#include "pandas/portable.h" -#include "khash.h" +#include "pandas/vendored/klib/khash.h" #define STREAM_INIT_SIZE 32 diff --git a/pandas/_libs/src/headers/portable.h b/pandas/_libs/include/pandas/portable.h similarity index 67% rename from pandas/_libs/src/headers/portable.h rename to pandas/_libs/include/pandas/portable.h index a34f833b7fd6b..954b5c3cce082 100644 --- a/pandas/_libs/src/headers/portable.h +++ b/pandas/_libs/include/pandas/portable.h @@ -1,9 +1,18 @@ +/* +Copyright (c) 2016, PyData Development Team +All rights reserved. + +Distributed under the terms of the BSD Simplified License. + +The full license is in the LICENSE file, distributed with this software. +*/ + #pragma once #include #if defined(_MSC_VER) -#define strcasecmp( s1, s2 ) _stricmp( s1, s2 ) +#define strcasecmp(s1, s2) _stricmp(s1, s2) #endif // GH-23516 - works around locale perf issues diff --git a/pandas/_libs/src/skiplist.h b/pandas/_libs/include/pandas/skiplist.h similarity index 99% rename from pandas/_libs/src/skiplist.h rename to pandas/_libs/include/pandas/skiplist.h index d94099da5890e..3be9e51f42e09 100644 --- a/pandas/_libs/src/skiplist.h +++ b/pandas/_libs/include/pandas/skiplist.h @@ -19,7 +19,7 @@ Python recipe (https://rhettinger.wordpress.com/2010/02/06/lost-knowledge/) #include #include #include -#include "inline_helper.h" +#include "pandas/inline_helper.h" PANDAS_INLINE float __skiplist_nanf(void) { const union { diff --git a/pandas/_libs/src/klib/khash.h b/pandas/_libs/include/pandas/vendored/klib/khash.h similarity index 99% rename from pandas/_libs/src/klib/khash.h rename to pandas/_libs/include/pandas/vendored/klib/khash.h index e17d82d51f0fb..95b25d053a9df 100644 --- a/pandas/_libs/src/klib/khash.h +++ b/pandas/_libs/include/pandas/vendored/klib/khash.h @@ -112,7 +112,7 @@ int main() { #include #include #include -#include "../inline_helper.h" +#include "pandas/inline_helper.h" // hooks for memory allocator, C-runtime allocator used per default diff --git a/pandas/_libs/src/klib/khash_python.h b/pandas/_libs/include/pandas/vendored/klib/khash_python.h similarity index 100% rename from pandas/_libs/src/klib/khash_python.h rename to pandas/_libs/include/pandas/vendored/klib/khash_python.h diff --git a/pandas/_libs/tslibs/src/datetime/np_datetime.h b/pandas/_libs/include/pandas/vendored/numpy/datetime/np_datetime.h similarity index 100% rename from pandas/_libs/tslibs/src/datetime/np_datetime.h rename to pandas/_libs/include/pandas/vendored/numpy/datetime/np_datetime.h diff --git a/pandas/_libs/tslibs/src/datetime/np_datetime_strings.h b/pandas/_libs/include/pandas/vendored/numpy/datetime/np_datetime_strings.h similarity index 100% rename from pandas/_libs/tslibs/src/datetime/np_datetime_strings.h rename to pandas/_libs/include/pandas/vendored/numpy/datetime/np_datetime_strings.h diff --git a/pandas/_libs/src/ujson/lib/ultrajson.h b/pandas/_libs/include/pandas/vendored/ujson/lib/ultrajson.h similarity index 99% rename from pandas/_libs/src/ujson/lib/ultrajson.h rename to pandas/_libs/include/pandas/vendored/ujson/lib/ultrajson.h index d359cf27ff7e2..54bcca9e4136c 100644 --- a/pandas/_libs/src/ujson/lib/ultrajson.h +++ b/pandas/_libs/include/pandas/vendored/ujson/lib/ultrajson.h @@ -53,7 +53,7 @@ tree doesn't have cyclic references. #include #include -#include "../../headers/portable.h" +#include "pandas/portable.h" // Don't output any extra whitespaces when encoding #define JSON_NO_EXTRA_WHITESPACE diff --git a/pandas/_libs/src/ujson/python/version.h b/pandas/_libs/include/pandas/vendored/ujson/python/version.h similarity index 100% rename from pandas/_libs/src/ujson/python/version.h rename to pandas/_libs/include/pandas/vendored/ujson/python/version.h diff --git a/pandas/_libs/khash.pxd b/pandas/_libs/khash.pxd index a9f819e5e16db..c439e1cca772b 100644 --- a/pandas/_libs/khash.pxd +++ b/pandas/_libs/khash.pxd @@ -15,7 +15,7 @@ from numpy cimport ( ) -cdef extern from "khash_python.h": +cdef extern from "pandas/vendored/klib/khash_python.h": const int KHASH_TRACE_DOMAIN ctypedef uint32_t khuint_t diff --git a/pandas/_libs/khash_for_primitive_helper.pxi.in b/pandas/_libs/khash_for_primitive_helper.pxi.in index d0934b3e0ee6e..d3391d4028938 100644 --- a/pandas/_libs/khash_for_primitive_helper.pxi.in +++ b/pandas/_libs/khash_for_primitive_helper.pxi.in @@ -24,7 +24,7 @@ primitive_types = [('int64', 'int64_t'), {{for name, c_type in primitive_types}} -cdef extern from "khash_python.h": +cdef extern from "pandas/vendored/klib/khash_python.h": ctypedef struct kh_{{name}}_t: khuint_t n_buckets, size, n_occupied, upper_bound uint32_t *flags diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index 80592d4f67c98..59a9d0752805b 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -93,7 +93,7 @@ cdef extern from "numpy/arrayobject.h": cdef extern from "numpy/ndarrayobject.h": bint PyArray_CheckScalar(obj) nogil -cdef extern from "pd_parser.h": +cdef extern from "pandas/parser/pd_parser.h": int floatify(object, float64_t *result, int *maybe_int) except -1 void PandasParser_IMPORT() diff --git a/pandas/_libs/meson.build b/pandas/_libs/meson.build index 382247c63c1ad..5e59f15d0d089 100644 --- a/pandas/_libs/meson.build +++ b/pandas/_libs/meson.build @@ -61,44 +61,33 @@ subdir('tslibs') libs_sources = { # Dict of extension name -> dict of {sources, include_dirs, and deps} # numpy include dir is implicitly included - 'algos': {'sources': ['algos.pyx', _algos_common_helper, _algos_take_helper, _khash_primitive_helper], - 'include_dirs': klib_include}, + 'algos': {'sources': ['algos.pyx', _algos_common_helper, _algos_take_helper, _khash_primitive_helper]}, 'arrays': {'sources': ['arrays.pyx']}, 'groupby': {'sources': ['groupby.pyx']}, 'hashing': {'sources': ['hashing.pyx']}, - 'hashtable': {'sources': ['hashtable.pyx', _khash_primitive_helper, _hashtable_class_helper, _hashtable_func_helper], - 'include_dirs': klib_include}, - 'index': {'sources': ['index.pyx', _index_class_helper], - 'include_dirs': [klib_include, 'tslibs']}, + 'hashtable': {'sources': ['hashtable.pyx', _khash_primitive_helper, _hashtable_class_helper, _hashtable_func_helper]}, + 'index': {'sources': ['index.pyx', _index_class_helper]}, 'indexing': {'sources': ['indexing.pyx']}, 'internals': {'sources': ['internals.pyx']}, - 'interval': {'sources': ['interval.pyx', _intervaltree_helper], - 'include_dirs': [klib_include, 'tslibs']}, + 'interval': {'sources': ['interval.pyx', _intervaltree_helper]}, 'join': {'sources': ['join.pyx', _khash_primitive_helper], - 'include_dirs': klib_include, 'deps': _khash_primitive_helper_dep}, - 'lib': {'sources': ['lib.pyx', 'src/parser/tokenizer.c'], - 'include_dirs': [klib_include, inc_datetime]}, - 'missing': {'sources': ['missing.pyx'], - 'include_dirs': [inc_datetime]}, - 'pandas_datetime': {'sources': ['tslibs/src/datetime/np_datetime.c', - 'tslibs/src/datetime/np_datetime_strings.c', - 'tslibs/src/datetime/date_conversions.c', - 'tslibs/src/datetime/pd_datetime.c']}, - #'include_dirs': + 'lib': {'sources': ['lib.pyx', 'src/parser/tokenizer.c']}, + 'missing': {'sources': ['missing.pyx']}, + 'pandas_datetime': {'sources': ['src/vendored/numpy/datetime/np_datetime.c', + 'src/vendored/numpy/datetime/np_datetime_strings.c', + 'src/datetime/date_conversions.c', + 'src/datetime/pd_datetime.c']}, 'pandas_parser': {'sources': ['src/parser/tokenizer.c', 'src/parser/io.c', - 'pd_parser.c'], - 'include_dirs': [klib_include]}, + 'src/parser/pd_parser.c']}, 'parsers': {'sources': ['parsers.pyx', 'src/parser/tokenizer.c', 'src/parser/io.c'], - 'include_dirs': [klib_include, 'src'], 'deps': _khash_primitive_helper_dep}, - 'json': {'sources': ['src/ujson/python/ujson.c', - 'src/ujson/python/objToJSON.c', - 'src/ujson/python/JSONtoObj.c', - 'src/ujson/lib/ultrajsonenc.c', - 'src/ujson/lib/ultrajsondec.c'], - 'include_dirs': ['tslibs/src/datetime', 'src/ujson/lib', 'src/ujson/python']}, + 'json': {'sources': ['src/vendored/ujson/python/ujson.c', + 'src/vendored/ujson/python/objToJSON.c', + 'src/vendored/ujson/python/JSONtoObj.c', + 'src/vendored/ujson/lib/ultrajsonenc.c', + 'src/vendored/ujson/lib/ultrajsondec.c']}, 'ops': {'sources': ['ops.pyx']}, 'ops_dispatch': {'sources': ['ops_dispatch.pyx']}, 'properties': {'sources': ['properties.pyx']}, @@ -106,8 +95,7 @@ libs_sources = { 'sas': {'sources': ['sas.pyx']}, 'byteswap': {'sources': ['byteswap.pyx']}, 'sparse': {'sources': ['sparse.pyx', _sparse_op_helper]}, - 'tslib': {'sources': ['tslib.pyx'], - 'include_dirs': inc_datetime}, + 'tslib': {'sources': ['tslib.pyx']}, 'testing': {'sources': ['testing.pyx']}, 'writers': {'sources': ['writers.pyx']} } @@ -118,7 +106,7 @@ foreach ext_name, ext_dict : libs_sources ext_name, ext_dict.get('sources'), cython_args: ['--include-dir', meson.current_build_dir()], - include_directories: [inc_np] + ext_dict.get('include_dirs', ''), + include_directories: [inc_np, inc_pd], dependencies: ext_dict.get('deps', ''), subdir: 'pandas/_libs', install: true diff --git a/pandas/_libs/parsers.pyx b/pandas/_libs/parsers.pyx index a45299c8ba896..10b2427835ed1 100644 --- a/pandas/_libs/parsers.pyx +++ b/pandas/_libs/parsers.pyx @@ -117,7 +117,7 @@ cdef: int64_t DEFAULT_CHUNKSIZE = 256 * 1024 -cdef extern from "headers/portable.h": +cdef extern from "pandas/portable.h": # I *think* this is here so that strcasecmp is defined on Windows # so we don't get # `parsers.obj : error LNK2001: unresolved external symbol strcasecmp` @@ -127,7 +127,7 @@ cdef extern from "headers/portable.h": pass -cdef extern from "parser/tokenizer.h": +cdef extern from "pandas/parser/tokenizer.h": ctypedef enum ParserState: START_RECORD @@ -245,7 +245,7 @@ cdef extern from "parser/tokenizer.h": void COLITER_NEXT(coliter_t, const char *) nogil -cdef extern from "pd_parser.h": +cdef extern from "pandas/parser/pd_parser.h": void *new_rd_source(object obj) except NULL int del_rd_source(void *src) diff --git a/pandas/_libs/tslibs/src/datetime/date_conversions.c b/pandas/_libs/src/datetime/date_conversions.c similarity index 94% rename from pandas/_libs/tslibs/src/datetime/date_conversions.c rename to pandas/_libs/src/datetime/date_conversions.c index 190713d62d306..84fc5507010ed 100644 --- a/pandas/_libs/tslibs/src/datetime/date_conversions.c +++ b/pandas/_libs/src/datetime/date_conversions.c @@ -8,9 +8,9 @@ The full license is in the LICENSE file, distributed with this software. // Conversion routines that are useful for serialization, // but which don't interact with JSON objects directly -#include "date_conversions.h" -#include "np_datetime.h" -#include "np_datetime_strings.h" +#include "pandas/datetime/date_conversions.h" +#include "pandas/vendored/numpy/datetime/np_datetime.h" +#include "pandas/vendored/numpy/datetime/np_datetime_strings.h" /* * Function: scaleNanosecToUnit diff --git a/pandas/_libs/tslibs/src/datetime/pd_datetime.c b/pandas/_libs/src/datetime/pd_datetime.c similarity index 99% rename from pandas/_libs/tslibs/src/datetime/pd_datetime.c rename to pandas/_libs/src/datetime/pd_datetime.c index 98b6073d7a488..fc2cbcab90174 100644 --- a/pandas/_libs/tslibs/src/datetime/pd_datetime.c +++ b/pandas/_libs/src/datetime/pd_datetime.c @@ -20,7 +20,7 @@ This file is derived from NumPy 1.7. See NUMPY_LICENSE.txt #include #include "datetime.h" -#include "pd_datetime.h" +#include "pandas/datetime/pd_datetime.h" static void pandas_datetime_destructor(PyObject *op) { diff --git a/pandas/_libs/src/parser/io.c b/pandas/_libs/src/parser/io.c index 38304cca94a12..e00c5c1e807a7 100644 --- a/pandas/_libs/src/parser/io.c +++ b/pandas/_libs/src/parser/io.c @@ -7,7 +7,7 @@ Distributed under the terms of the BSD Simplified License. The full license is in the LICENSE file, distributed with this software. */ -#include "io.h" +#include "pandas/parser/io.h" /* On-disk FILE, uncompressed diff --git a/pandas/_libs/pd_parser.c b/pandas/_libs/src/parser/pd_parser.c similarity index 98% rename from pandas/_libs/pd_parser.c rename to pandas/_libs/src/parser/pd_parser.c index 15d82b59df3e8..c429f17c1cb8b 100644 --- a/pandas/_libs/pd_parser.c +++ b/pandas/_libs/src/parser/pd_parser.c @@ -8,8 +8,8 @@ Distributed under the terms of the BSD Simplified License. */ #define _PANDAS_PARSER_IMPL -#include "pd_parser.h" -#include "src/parser/io.h" +#include "pandas/parser/pd_parser.h" +#include "pandas/parser/io.h" static int to_double(char *item, double *p_value, char sci, char decimal, int *maybe_int) { diff --git a/pandas/_libs/src/parser/tokenizer.c b/pandas/_libs/src/parser/tokenizer.c index e60fc6bf75f91..abd3fb9e1fef3 100644 --- a/pandas/_libs/src/parser/tokenizer.c +++ b/pandas/_libs/src/parser/tokenizer.c @@ -17,13 +17,13 @@ GitHub. See Python Software Foundation License and BSD licenses for these. */ -#include "tokenizer.h" +#include "pandas/parser/tokenizer.h" #include #include #include -#include "../headers/portable.h" +#include "pandas/portable.h" void coliter_setup(coliter_t *self, parser_t *parser, int64_t i, int64_t start) { diff --git a/pandas/_libs/tslibs/src/datetime/np_datetime.c b/pandas/_libs/src/vendored/numpy/datetime/np_datetime.c similarity index 99% rename from pandas/_libs/tslibs/src/datetime/np_datetime.c rename to pandas/_libs/src/vendored/numpy/datetime/np_datetime.c index e4d9c5dcd63ea..7e5cb53cf8f62 100644 --- a/pandas/_libs/tslibs/src/datetime/np_datetime.c +++ b/pandas/_libs/src/vendored/numpy/datetime/np_datetime.c @@ -25,7 +25,7 @@ This file is derived from NumPy 1.7. See NUMPY_LICENSE.txt #include #include #include -#include "np_datetime.h" +#include "pandas/vendored/numpy/datetime/np_datetime.h" const int days_per_month_table[2][12] = { diff --git a/pandas/_libs/tslibs/src/datetime/np_datetime_strings.c b/pandas/_libs/src/vendored/numpy/datetime/np_datetime_strings.c similarity index 99% rename from pandas/_libs/tslibs/src/datetime/np_datetime_strings.c rename to pandas/_libs/src/vendored/numpy/datetime/np_datetime_strings.c index f1f03e6467eac..629d88ca6f589 100644 --- a/pandas/_libs/tslibs/src/datetime/np_datetime_strings.c +++ b/pandas/_libs/src/vendored/numpy/datetime/np_datetime_strings.c @@ -34,8 +34,8 @@ This file implements string parsing and creation for NumPy datetime. #include #include -#include "np_datetime.h" -#include "np_datetime_strings.h" +#include "pandas/vendored/numpy/datetime/np_datetime.h" +#include "pandas/vendored/numpy/datetime/np_datetime_strings.h" /* diff --git a/pandas/_libs/src/ujson/lib/ultrajsondec.c b/pandas/_libs/src/vendored/ujson/lib/ultrajsondec.c similarity index 99% rename from pandas/_libs/src/ujson/lib/ultrajsondec.c rename to pandas/_libs/src/vendored/ujson/lib/ultrajsondec.c index 5347db1655669..9ec12cb242728 100644 --- a/pandas/_libs/src/ujson/lib/ultrajsondec.c +++ b/pandas/_libs/src/vendored/ujson/lib/ultrajsondec.c @@ -46,7 +46,7 @@ Numeric decoder derived from TCL library #include #include #include -#include "ultrajson.h" +#include "pandas/vendored/ujson/lib/ultrajson.h" #ifndef TRUE #define TRUE 1 diff --git a/pandas/_libs/src/ujson/lib/ultrajsonenc.c b/pandas/_libs/src/vendored/ujson/lib/ultrajsonenc.c similarity index 99% rename from pandas/_libs/src/ujson/lib/ultrajsonenc.c rename to pandas/_libs/src/vendored/ujson/lib/ultrajsonenc.c index 169c5b6889077..726676799af65 100644 --- a/pandas/_libs/src/ujson/lib/ultrajsonenc.c +++ b/pandas/_libs/src/vendored/ujson/lib/ultrajsonenc.c @@ -45,7 +45,7 @@ Numeric decoder derived from TCL library #include #include #include -#include "ultrajson.h" +#include "pandas/vendored/ujson/lib/ultrajson.h" #ifndef TRUE #define TRUE 1 diff --git a/pandas/_libs/src/ujson/python/JSONtoObj.c b/pandas/_libs/src/vendored/ujson/python/JSONtoObj.c similarity index 99% rename from pandas/_libs/src/ujson/python/JSONtoObj.c rename to pandas/_libs/src/vendored/ujson/python/JSONtoObj.c index d7086ffba623a..f4055fcedcfa6 100644 --- a/pandas/_libs/src/ujson/python/JSONtoObj.c +++ b/pandas/_libs/src/vendored/ujson/python/JSONtoObj.c @@ -40,7 +40,7 @@ Numeric decoder derived from TCL library #define PY_SSIZE_T_CLEAN #include #include -#include +#include "pandas/vendored/ujson/lib/ultrajson.h" #define PRINTMARK() diff --git a/pandas/_libs/src/ujson/python/objToJSON.c b/pandas/_libs/src/vendored/ujson/python/objToJSON.c similarity index 99% rename from pandas/_libs/src/ujson/python/objToJSON.c rename to pandas/_libs/src/vendored/ujson/python/objToJSON.c index 1b8ba8f3f7e6c..65b468f268d75 100644 --- a/pandas/_libs/src/ujson/python/objToJSON.c +++ b/pandas/_libs/src/vendored/ujson/python/objToJSON.c @@ -46,9 +46,9 @@ Numeric decoder derived from TCL library #include #include #include -#include +#include "pandas/vendored/ujson/lib/ultrajson.h" #include "datetime.h" -#include "pd_datetime.h" +#include "pandas/datetime/pd_datetime.h" npy_int64 get_nat(void) { return NPY_MIN_INT64; } diff --git a/pandas/_libs/src/ujson/python/ujson.c b/pandas/_libs/src/vendored/ujson/python/ujson.c similarity index 99% rename from pandas/_libs/src/ujson/python/ujson.c rename to pandas/_libs/src/vendored/ujson/python/ujson.c index 5c87ee6dd7ddc..15ea4b056b02d 100644 --- a/pandas/_libs/src/ujson/python/ujson.c +++ b/pandas/_libs/src/vendored/ujson/python/ujson.c @@ -35,7 +35,7 @@ Numeric decoder derived from TCL library * Copyright (c) 1994 Sun Microsystems, Inc. */ -#include "version.h" +#include "pandas/vendored/ujson/python/version.h" #define PY_SSIZE_T_CLEAN #include #define PY_ARRAY_UNIQUE_SYMBOL UJSON_NUMPY diff --git a/pandas/_libs/tslibs/meson.build b/pandas/_libs/tslibs/meson.build index fc8c9e609c416..4a51f8dc1e461 100644 --- a/pandas/_libs/tslibs/meson.build +++ b/pandas/_libs/tslibs/meson.build @@ -4,30 +4,19 @@ tslibs_sources = { 'base': {'sources': ['base.pyx']}, 'ccalendar': {'sources': ['ccalendar.pyx']}, 'dtypes': {'sources': ['dtypes.pyx']}, - 'conversion': {'sources': ['conversion.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'fields': {'sources': ['fields.pyx', 'src/datetime/np_datetime.c']}, + 'conversion': {'sources': ['conversion.pyx']}, + 'fields': {'sources': ['fields.pyx']}, 'nattype': {'sources': ['nattype.pyx']}, - 'np_datetime': {'sources': ['np_datetime.pyx', 'src/datetime/np_datetime.c', 'src/datetime/np_datetime_strings.c'], - 'include_dirs': inc_datetime}, - 'offsets': {'sources': ['offsets.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'parsing': {'sources': ['parsing.pyx', '../src/parser/tokenizer.c'], - 'include_dirs': klib_include}, - 'period': {'sources': ['period.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'strptime': {'sources': ['strptime.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'timedeltas': {'sources': ['timedeltas.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'timestamps': {'sources': ['timestamps.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'timezones': {'sources': ['timezones.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'tzconversion': {'sources': ['tzconversion.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime}, - 'vectorized': {'sources': ['vectorized.pyx', 'src/datetime/np_datetime.c'], - 'include_dirs': inc_datetime} + 'np_datetime': {'sources': ['np_datetime.pyx']}, + 'offsets': {'sources': ['offsets.pyx']}, + 'parsing': {'sources': ['parsing.pyx', '../src/parser/tokenizer.c']}, + 'period': {'sources': ['period.pyx']}, + 'strptime': {'sources': ['strptime.pyx']}, + 'timedeltas': {'sources': ['timedeltas.pyx']}, + 'timestamps': {'sources': ['timestamps.pyx']}, + 'timezones': {'sources': ['timezones.pyx']}, + 'tzconversion': {'sources': ['tzconversion.pyx']}, + 'vectorized': {'sources': ['vectorized.pyx']}, } foreach ext_name, ext_dict : tslibs_sources @@ -35,7 +24,7 @@ foreach ext_name, ext_dict : tslibs_sources ext_name, ext_dict.get('sources'), cython_args: ['--include-dir', meson.current_build_dir()], - include_directories: [inc_np] + ext_dict.get('include_dirs', ''), + include_directories: [inc_np, inc_pd], dependencies: ext_dict.get('deps', ''), subdir: 'pandas/_libs/tslibs', install: true diff --git a/pandas/_libs/tslibs/np_datetime.pxd b/pandas/_libs/tslibs/np_datetime.pxd index 15230c47ae252..60532174e8bdc 100644 --- a/pandas/_libs/tslibs/np_datetime.pxd +++ b/pandas/_libs/tslibs/np_datetime.pxd @@ -55,7 +55,7 @@ cdef extern from "numpy/ndarraytypes.h": int64_t NPY_DATETIME_NAT # elswhere we call this NPY_NAT -cdef extern from "src/datetime/pd_datetime.h": +cdef extern from "pandas/datetime/pd_datetime.h": ctypedef struct pandas_timedeltastruct: int64_t days int32_t hrs, min, sec, ms, us, ns, seconds, microseconds, nanoseconds diff --git a/pandas/_libs/tslibs/np_datetime.pyx b/pandas/_libs/tslibs/np_datetime.pyx index 2eebde982789c..990f862c3d105 100644 --- a/pandas/_libs/tslibs/np_datetime.pyx +++ b/pandas/_libs/tslibs/np_datetime.pyx @@ -36,7 +36,7 @@ from numpy cimport ( from pandas._libs.tslibs.util cimport get_c_string_buf_and_size -cdef extern from "src/datetime/pd_datetime.h": +cdef extern from "pandas/datetime/pd_datetime.h": int cmp_npy_datetimestruct(npy_datetimestruct *a, npy_datetimestruct *b) diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 71550824525eb..536ae7ee4673b 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -83,10 +83,10 @@ from pandas._libs.tslibs.util cimport ( ) -cdef extern from "../src/headers/portable.h": +cdef extern from "pandas/portable.h": int getdigit_ascii(char c, int default) nogil -cdef extern from "../src/parser/tokenizer.h": +cdef extern from "pandas/parser/tokenizer.h": double xstrtod(const char *p, char **q, char decimal, char sci, char tsep, int skip_trailing, int *error, int *maybe_int) diff --git a/pandas/_libs/window/aggregations.pyx b/pandas/_libs/window/aggregations.pyx index c444e3b2bb71e..b0dac23c3b8e2 100644 --- a/pandas/_libs/window/aggregations.pyx +++ b/pandas/_libs/window/aggregations.pyx @@ -26,7 +26,7 @@ import cython from pandas._libs.algos import is_monotonic -cdef extern from "../src/skiplist.h": +cdef extern from "pandas/skiplist.h": ctypedef struct node_t: node_t **next int *width diff --git a/pandas/_libs/window/meson.build b/pandas/_libs/window/meson.build index 7d7c34a57c6a6..61719a35b2346 100644 --- a/pandas/_libs/window/meson.build +++ b/pandas/_libs/window/meson.build @@ -1,7 +1,7 @@ py.extension_module( 'aggregations', ['aggregations.pyx'], - include_directories: [inc_np, '../src'], + include_directories: [inc_np, inc_pd], dependencies: [py_dep], subdir: 'pandas/_libs/window', override_options : ['cython_language=cpp'], @@ -11,7 +11,7 @@ py.extension_module( py.extension_module( 'indexers', ['indexers.pyx'], - include_directories: [inc_np], + include_directories: [inc_np, inc_pd], dependencies: [py_dep], subdir: 'pandas/_libs/window', install: true diff --git a/pandas/meson.build b/pandas/meson.build index 491a08e6c0261..ab84fd688b762 100644 --- a/pandas/meson.build +++ b/pandas/meson.build @@ -7,8 +7,7 @@ incdir_numpy = run_command(py, ).stdout().strip() inc_np = include_directories(incdir_numpy) -klib_include = include_directories('_libs/src/klib') -inc_datetime = include_directories('_libs/tslibs') +inc_pd = include_directories('_libs/include') fs.copyfile('__init__.py') diff --git a/setup.py b/setup.py index ee444f1aaeb85..e285299cfc05e 100755 --- a/setup.py +++ b/setup.py @@ -115,15 +115,14 @@ def initialize_options(self): self._clean_trees = [] base = pjoin("pandas", "_libs", "src") - tsbase = pjoin("pandas", "_libs", "tslibs", "src") - dt = pjoin(tsbase, "datetime") - util = pjoin("pandas", "util") parser = pjoin(base, "parser") - ujson_python = pjoin(base, "ujson", "python") - ujson_lib = pjoin(base, "ujson", "lib") + vendored = pjoin(base, "vendored") + dt = pjoin(base, "datetime") + ujson_python = pjoin(vendored, "ujson", "python") + ujson_lib = pjoin(vendored, "ujson", "lib") self._clean_exclude = [ - pjoin(dt, "np_datetime.c"), - pjoin(dt, "np_datetime_strings.c"), + pjoin(vendored, "numpy", "datetime", "np_datetime.c"), + pjoin(vendored, "numpy", "datetime", "np_datetime_strings.c"), pjoin(dt, "date_conversions.c"), pjoin(parser, "tokenizer.c"), pjoin(parser, "io.c"), @@ -132,9 +131,8 @@ def initialize_options(self): pjoin(ujson_python, "JSONtoObj.c"), pjoin(ujson_lib, "ultrajsonenc.c"), pjoin(ujson_lib, "ultrajsondec.c"), - pjoin(util, "move.c"), - pjoin(tsbase, "datetime", "pd_datetime.c"), - pjoin("pandas", "_libs", "pd_parser.c"), + pjoin(dt, "pd_datetime.c"), + pjoin(parser, "pd_parser.c"), ] for root, dirs, files in os.walk("pandas"): @@ -431,19 +429,15 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): return pjoin("pandas", subdir, name + suffix) -lib_depends = ["pandas/_libs/src/parse_helper.h"] +lib_depends = ["pandas/_libs/include/pandas/parse_helper.h"] -klib_include = ["pandas/_libs/src/klib"] - -tseries_includes = ["pandas/_libs/tslibs/src/datetime"] tseries_depends = [ - "pandas/_libs/tslibs/src/datetime/pd_datetime.h", + "pandas/_libs/include/pandas/datetime/pd_datetime.h", ] ext_data = { "_libs.algos": { "pyxfile": "_libs/algos", - "include": klib_include, "depends": _pxi_dep["algos"], }, "_libs.arrays": {"pyxfile": "_libs/arrays"}, @@ -451,34 +445,32 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): "_libs.hashing": {"pyxfile": "_libs/hashing", "depends": []}, "_libs.hashtable": { "pyxfile": "_libs/hashtable", - "include": klib_include, "depends": ( - ["pandas/_libs/src/klib/khash_python.h", "pandas/_libs/src/klib/khash.h"] + [ + "pandas/_libs/include/pandas/vendored/klib/khash_python.h", + "pandas/_libs/include/pandas/vendored/klib/khash.h", + ] + _pxi_dep["hashtable"] ), }, "_libs.index": { "pyxfile": "_libs/index", - "include": klib_include, "depends": _pxi_dep["index"], }, "_libs.indexing": {"pyxfile": "_libs/indexing"}, "_libs.internals": {"pyxfile": "_libs/internals"}, "_libs.interval": { "pyxfile": "_libs/interval", - "include": klib_include, "depends": _pxi_dep["interval"], }, - "_libs.join": {"pyxfile": "_libs/join", "include": klib_include}, + "_libs.join": {"pyxfile": "_libs/join"}, "_libs.lib": { "pyxfile": "_libs/lib", "depends": lib_depends + tseries_depends, - "include": klib_include, # due to tokenizer import }, "_libs.missing": {"pyxfile": "_libs/missing", "depends": tseries_depends}, "_libs.parsers": { "pyxfile": "_libs/parsers", - "include": klib_include + ["pandas/_libs/src", "pandas/_libs"], "depends": [ "pandas/_libs/src/parser/tokenizer.h", "pandas/_libs/src/parser/io.h", @@ -500,7 +492,6 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): "_libs.tslibs.conversion": { "pyxfile": "_libs/tslibs/conversion", "depends": tseries_depends, - "include": klib_include, }, "_libs.tslibs.fields": { "pyxfile": "_libs/tslibs/fields", @@ -510,17 +501,13 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): "_libs.tslibs.np_datetime": { "pyxfile": "_libs/tslibs/np_datetime", "depends": tseries_depends, - "includes": tseries_includes, }, "_libs.tslibs.offsets": { "pyxfile": "_libs/tslibs/offsets", "depends": tseries_depends, - "includes": tseries_includes, }, "_libs.tslibs.parsing": { "pyxfile": "_libs/tslibs/parsing", - "include": tseries_includes + klib_include, - "depends": ["pandas/_libs/src/parser/tokenizer.h"], "sources": ["pandas/_libs/src/parser/tokenizer.c"], }, "_libs.tslibs.period": { @@ -537,7 +524,6 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): }, "_libs.tslibs.timestamps": { "pyxfile": "_libs/tslibs/timestamps", - "include": tseries_includes, "depends": tseries_depends, }, "_libs.tslibs.timezones": {"pyxfile": "_libs/tslibs/timezones"}, @@ -554,7 +540,7 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): "pyxfile": "_libs/window/aggregations", "language": "c++", "suffix": ".cpp", - "depends": ["pandas/_libs/src/skiplist.h"], + "depends": ["pandas/_libs/include/pandas/skiplist.h"], }, "_libs.window.indexers": {"pyxfile": "_libs/window/indexers"}, "_libs.writers": {"pyxfile": "_libs/writers"}, @@ -571,8 +557,7 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): sources.extend(data.get("sources", [])) - include = data.get("include", []) - include.append(numpy.get_include()) + include = ["pandas/_libs/include", numpy.get_include()] undef_macros = [] @@ -612,24 +597,22 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): ujson_ext = Extension( "pandas._libs.json", depends=[ - "pandas/_libs/src/ujson/lib/ultrajson.h", - "pandas/_libs/tslibs/src/datetime/pd_datetime.h", + "pandas/_libs/include/pandas/vendored/ujson/lib/ultrajson.h", + "pandas/_libs/include/pandas/datetime/pd_datetime.h", ], sources=( [ - "pandas/_libs/src/ujson/python/ujson.c", - "pandas/_libs/src/ujson/python/objToJSON.c", - "pandas/_libs/src/ujson/python/JSONtoObj.c", - "pandas/_libs/src/ujson/lib/ultrajsonenc.c", - "pandas/_libs/src/ujson/lib/ultrajsondec.c", + "pandas/_libs/src/vendored/ujson/python/ujson.c", + "pandas/_libs/src/vendored/ujson/python/objToJSON.c", + "pandas/_libs/src/vendored/ujson/python/JSONtoObj.c", + "pandas/_libs/src/vendored/ujson/lib/ultrajsonenc.c", + "pandas/_libs/src/vendored/ujson/lib/ultrajsondec.c", ] ), include_dirs=[ - "pandas/_libs/src/ujson/python", - "pandas/_libs/src/ujson/lib", + "pandas/_libs/include", numpy.get_include(), - ] - + tseries_includes, + ], extra_compile_args=(extra_compile_args), extra_link_args=extra_link_args, define_macros=macros, @@ -647,14 +630,14 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): depends=["pandas/_libs/tslibs/datetime/pd_datetime.h"], sources=( [ - "pandas/_libs/tslibs/src/datetime/np_datetime.c", - "pandas/_libs/tslibs/src/datetime/np_datetime_strings.c", - "pandas/_libs/tslibs/src/datetime/date_conversions.c", - "pandas/_libs/tslibs/src/datetime/pd_datetime.c", + "pandas/_libs/src/vendored/numpy/datetime/np_datetime.c", + "pandas/_libs/src/vendored/numpy/datetime/np_datetime_strings.c", + "pandas/_libs/src/datetime/date_conversions.c", + "pandas/_libs/src/datetime/pd_datetime.c", ] ), - include_dirs=tseries_includes - + [ + include_dirs=[ + "pandas/_libs/include", numpy.get_include(), ], extra_compile_args=(extra_compile_args), @@ -671,16 +654,16 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): # pd_datetime pd_parser_ext = Extension( "pandas._libs.pandas_parser", - depends=["pandas/_libs/pd_parser.h"], + depends=["pandas/_libs/include/pandas/parser/pd_parser.h"], sources=( [ "pandas/_libs/src/parser/tokenizer.c", "pandas/_libs/src/parser/io.c", - "pandas/_libs/pd_parser.c", + "pandas/_libs/src/parser/pd_parser.c", ] ), include_dirs=[ - "pandas/_libs/src/klib", + "pandas/_libs/include", ], extra_compile_args=(extra_compile_args), extra_link_args=extra_link_args,