Jep 3.3 Release Notes
*********************
This release emphasized numpy support and better exception handling.  It is
compatible with Python 2.6 and 2.7.  *Nate Jensen became the new project
lead.*


Numpy support
~~~~~~~~~~~~~
Jep now supports interactions with numpy through the usage of the jep.NDArray
class.  jep.NDArrays only support Java primitive arrays for their underlying
types.  When jep.NDArray objects are detected, Jep will automatically convert
them to their equivalent in Python and vice versa.  This currently uses memcpy
so changes to the array in one language will not be automatically reflected in
the other language.  The following scenarios are examples of automatic
conversion:

* jep.NDArray can be passed to Jep.setValue(String, Object)
* jep.NDArray can be returned from Jep.getValue(String)
* Python calling a Java method that has a return type of NDArray
* Python passing an ndarray argument to a Java method signature that takes
  arguments of Object, NDArray, or equivalent primitive arrays (e.g. float[])

You can also disable numpy support at build time if not desired. By default
the Jep build will attempt to detect if numpy is installed or not.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html


Improved distutils build
~~~~~~~~~~~~~~~~~~~~~~~~
* The distutils build (setup.py) now supports building with the Oracle JDK
  on Mac OS X.
* The distutils build (setup.py) now supports building on Windows.
  *Contributed by Dave Lovely.*


Improved exception handling
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Exception handling has been improved in a variety of ways:

* JepException now extends Exception instead of Throwable.
* When Java exceptions are encountered by the interpreter, the exceptions are
  passed along to JepException to provide CausedBys.
* Python tracebacks are transformed to resemble Java StackTraceElements to
  provide a more complete picture of the stack.
* Common Java exceptions are correlated to equivalent Python exceptions to
  enable more precise catching of certain Java exception types in Python. 


Faster PyJObject instantiation and wrapping
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jep has been optimized to more quickly instantiate Java objects from the Python
interpreter and more quickly wrap Java objects that the Python interpreter
receives.


Added PyJList type
~~~~~~~~~~~~~~~~~~
A new type PyJList has been created to enable developers to more closely match
Python syntax when working with Java Lists.  PyJList extends PyJObject to retain
all previous functionality while also implementing Python's sequence protocol.
This enables commands such as *for x in obj:* where obj is a java.util.List.

* https://docs.oracle.com/javase/7/docs/api/java/util/List.html


Implemented __hash__ on PyJObject
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PyJObject now implements Python's __hash__() by delegating to the Java object's
hashCode() method.


More precise imports
~~~~~~~~~~~~~~~~~~~~
An interface of ClassEnquirer has been introduced to enable more advanced
control of imports.  A ClassEnquirer indicates to the import hook if an import
is expected to be a Java package or a Python module.  By default Jep
will continue to use jep.ClassList for determining imports.  The ClassEnquirer
interface can also be used to force lazy or eager loading of Java classes.

https://www.python.org/dev/peps/pep-0302/  

