.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

Getting Involved
================

Right now the primary audience for Apache Arrow are the developers of data
systems; most people will use Apache Arrow indirectly through systems that use
it for internal data handling and interoperating with other Arrow-enabled
systems.

Even if you do not plan to contribute to Apache Arrow itself or Arrow
integrations in other projects, we'd be happy to have you involved:

* Join the mailing list: send an email to
  `dev-subscribe@arrow.apache.org <mailto:dev-subscribe@arrow.apache.org>`_.
  Share your ideas and use cases for the project or read through the
  `Archive <http://mail-archives.apache.org/mod_mbox/arrow-dev/>`_.
* Follow our activity on `GitHub <https://github.com/apache/arrow/issues>`_
* Learn the `Format / Specification
  <https://github.com/apache/arrow/tree/main/format>`_


.. _py_arch_overview:

PyArrow Architecture
--------------------

PyArrow is for the major part a wrapper around the functionalities that
Arrow C++ implementation provides. The library tries to take what's available
in C++ and expose it through a user experience that is more pythonic and
less complex to use. So while in some cases it might be easy to map what's
in C++ to what's in Python, in many cases the C++ classes and methods are
used as foundations to build easier to use entities.

.. image:: /python/images/py_arch_overview.svg
   :alt: Four layers of PyArrow architecture: .py, .pyx, .pxd and low level C++ code.

* The ``*.py`` files in the pyarrow package are usually where the entities
  exposed to the user are declared. In some cases, those files might directly
  import the entities from inner implementation if they want to expose it
  as is without modification.
* The ``lib.pyx`` file is where the majority of the core C++ libarrow
  capabilities are exposed to Python. Most of the implementation of this
  module relies on included ``*.pxi`` files where the specific pieces
  are built. While being exposed to Python as ``pyarrow.lib`` its content
  should be considered internal. The public classes are then directly exposed
  in other modules (like ``pyarrow`` itself) by virtue of importing them from
  ``pyarrow.lib``
* The ``_*.pyx`` files are where the glue code is usually created, it puts
  together the C++ capabilities turning it into Python classes and methods.
  They can be considered the internal implementation of the capabilities
  exposed by the ``*.py`` files.
* The ``includes/*.pxd`` files are where the raw C++ library APIs are declared
  for usage in Cython. Here the C++ classes and methods are declared as they are
  so that in the other ``.pyx`` files they can be used to implement Python classes,
  functions and helpers.
* Apart from Arrow C++ library, which dependence is mentioned in the previous line,
  PyArrow is also based on PyArrow C++, dedicated pieces of code that live in
  ``python/pyarrow/src/arrow/python`` directory and provide the low level
  code for capabilities like converting to and from numpy or pandas and the classes
  that allow to use Python objects and callbacks in C++.
