Package for aiding the development of JavaScript code to be provided as part of Python packages through integration with Node.js development tools into a Python environment via the Calmjs framework.
Python packages can contain arbitrary resource files, which can include JavaScript sources. This situation is commonly found in packages that provide frontend functionalities that enhance user experience that require interactions with a related backend Python code running on the server provided by the given package. In order to facilitate the testing of those JavaScript code from those Python packages, commonly Node.js packages and frameworks are often used to achieve this.
Typically, for the management of this dependency, this often require two or more separate package management systems that are not properly aware of each other, resulting in often cumbersome linkage or needless duplication of packages installed on a given system. Moreover, the configurations files for the Node.js/JavaScript package dependencies, along with the building of artifacts and testing of the JavaScript provided by those Python packages are very specific to the given project and generally not portable. If multiple such packages are required for a downstream Python project, the scripts and definition files for building of artifacts and testing generally have to be manually modified, which is often a very aggravating and error-prone process.
The Calmjs framework, however, provides the means for Python packages to
declare the JavaScript modules they are to export, and this package,
calmjs.dev
, provides the means to consume those information such that
the JavaScript tests declared within those Python packages can be
executed without having to manually construct and verify the paths to
the source and tests files, no matter where they are within the
environment, provided they are properly declared through the Calmjs
framework. The tests can then run either against the JavaScript sources
provided by the Python package through the artifact generation
framework, or against prebuilt artifacts that contain those
functionalities. Naturally, the support for the artifact generation
framework requires integration with the Calmjs framework. Currently,
generation of AMD artifacts is supported using the calmjs.rjs
, and
the generation of webpack
artifacts supported through the
calmjs.webpack
package.
Provides a set of commonly used development tools that are commonly used for testing JavaScript code. In brief, these include:
karma
Test runner for running tests included with packages against the JavaScript code contained there.
mocha
A JavaScript test framework for writing unit tests for node.js or the browser.
phantomjs
A headless webkit with JavaScript API capable of interfacing with karma; this enables the running of integration JavaScript tests.
sinon
A set of spies, stubs and mocks for JavaScript, for working with unit testing frameworks.
Plus other integration packages that get them to work with each other, namely the various
karma-*
packages for integration withkarma
. For full details on the environment that will be installed through thecalmjs
framework, the commandcalmjs npm calmjs.dev
can be invoked to view thepackage.json
once this package is installed into a Python environment. For installation, please refer to the following section.Through the use of the
calmjs
module registry system, Python packages can declare JavaScript sources that can be passed through specific toolchains that build them into deployable artifacts. Thecalmjs.dev
package provide a common framework for the generation of configuration files for the execution of tests through the karma test runner.The usage of this is typically through the
calmjs
runtime system.
As the goal of calmjs.dev
is to integrate Node.js development tools
into a Python environment, both Node.js and npm
are required to be
available within the target installation environment; if they are not
installed please follow the installation steps for Node.js
appropriate for the target operating system/environment/platform.
Naturally, since this is achieved through calmjs
, it will need to be
available in the target installation environment; however, this is
achieved simply by installing calmjs.dev
through pip
from PyPI.
$ pip install calmjs.dev
Development is still ongoing with calmjs.dev
, for the latest features
and bug fixes, the development version may be desirable. However, in
order for the source installation to function correctly, the calmjs
package must be available in the current environment for all the
package metadata be correctly generated. With recent versions of
pip
and setuptools
that correctly support the setup_requires
keyword, the following command should ensure that calmjs
be available
before pip
attempts to set up this package. The latest development
version of this package may be installed using:
$ pip install git+https://github.com/calmjs/calmjs.dev.git#egg=calmjs.dev
Or alternatively, clone the git repository manually and run the command manually, e.g.:
$ git clone https://github.com/calmjs/calmjs.dev.git
$ cd calmjs.dev
$ pip install -e .
Failing to have calmjs
be available before the source installation of
calmjs.dev
will result in the critical Node.js dependencies not being
defined correctly for this package. This may be corrected by
regenerating them using the following at the root of this source based
installation:
$ python setup.py egg_info
If no error message that indicate the failure to usage of certain keywords, run the tests (documented in the next section) to be sure that the package is functioning correctly.
As this package integrates a number of Node.js packages to achieve the
intended functionality of integration with that environment, Node.js
packages required by this package can be installed into the current
working directory through the calmjs
executable with the included
npm
command:
$ calmjs npm --install calmjs.dev
Finally, to verify for the successful installation of calmjs.dev
, the
included tests may be executed through this command:
$ python -m unittest calmjs.dev.tests.make_suite
However, if the steps to install external Node.js dependencies to the
current directory was followed, the current directory may be specified
as the CALMJS_TEST_ENV
environment variable. Under POSIX compatible
shells this may be executed instead from within that directory:
$ CALMJS_TEST_ENV=. python -m unittest calmjs.dev.tests.make_suite
Do note a number of failures during execution of Karma may appear; this is normal as these are tests that involve the simulation of failures to ensure proper error handling on real test failures.
This package provides features that may be used as part of the calmjs
runtime, be used in conjunction with toolchains that already provide
integration with the underlying toolchain for this package (which also
implies that toolchain developers are provided the ability build these
integration), and finally, a way for package developers to make use of
these features to quickly set up their package for testing of their
JavaScript sources in conjunction with these toolchains.
The default tool is meant to provide a calmjs
runtime that is injected
before a calmjs
toolchain runtime that is responsible for the
generation of deployable artifacts, such as AMD bundles (through
RequireJS) or webpack bundles (through webpack). Typically, this
package is used in conjunction with the respective integration packages
(e.g. calmjs.rjs
and calmjs.webpack
). Those specific packages will
have additional instructions on how they make use of this package, such
as the instructions on how to create the entry points to support the
testing of artifacts using the calmjs artifact karma
command that
is provided by this package.
For instance, a developer might execute the r.js
tool through
calmjs.rjs
for creation of an AMD bundle from their Python project
using a command such as:
$ calmjs rjs example.package
The above command would package all the JavaScript code provided by the
Python package example.package
into an AMD bundle artifact through
r.js
. As the example.package
may also provide tests for its
JavaScript code (naturally written in JavaScript), it may be executed
through the karma test runner provided by the selected package. The
command is as simple as adding karma
before the toolchain runtime,
like:
$ calmjs karma rjs example.package
This would apply a test advice to the rjs
toolchain runtime and
invoke it. Normally, before the bundling is done, the tests will be
executed against the transpiled sources in the build directory. Note
that the test advice is also implemented by calmjs.rjs
to ensure that
this testing workflow is properly integrated.
Likewise for calmjs.webpack
, where its support for webpack
is also
provided through a similar mechanism such that the following command
will execute the tests for the package through the typical webpack
method of karma
invocation:
$ calmjs karma webpack example.package
If the generation of the artifact or bundle file after testing concludes
(whether success or failure) is not desired, the -T
or the
--only-test
flag may be applied to the karma
command like so:
$ calmjs karma -T webpack example.package
$ calmjs karma --only-test rjs example.package
To run tests against pre-generated artifact files, calmjs.dev
provides
a surrogate toolchain runtime specific for the karma
command that
may be used to achieve this purpose. For example, given an artifact
file (e.g. bundle.js
), it is possible to test whether it correctly
included JavaScript code generated/provided by example.package
using
tests provided by the same package with the following command:
$ calmjs karma run \
--artifact=bundle.js \
--test-with-package=example.package
However, for more complicated toolchains and packages this will probably
not work, as the generation of these artifacts typically involve extra
optional advices that have been added. To address that, one may apply
the --toolchain-package
flag which serves a similar purpose as the
--optional-advice
flag for certain toolchains. For calmjs.rjs
,
this is necessary. The full command may be like so:
$ calmjs karma run \
--artifact=bundle.js \
--test-with-package=example.package \
--toolchain-package=calmjs.rjs
Likewise for webpack
; if the selected artifact file is generated
through calmjs webpack
, it may be tested using the following:
$ calmjs karma run \
--artifact=bundle.js \
--test-with-package=example.package \
--toolchain-package=calmjs.webpack
As with all calmjs
tools, more help can be acquired by appending
-h
or --help
to each of the runtime commands, i.e. calmjs
karma -h
or calmjs karma run -h
. Replacing the -h
flag with
-V
will report the version information for the underlying packages
associated with the respective runtime used.
The --artifact
flag can also be specified directly on the karma
runner; this has the consequence of enabling the testing of limited or
explicitly mapped JavaScript sources exported by specific Python
modules. What this means is that instead of building and testing all
the dependency modules along with a given module, all those dependencies
can be applied to the test environment as a separate, complete artifact.
This has the effect of removing the dependency sources from the build
directory such that coverage report no longer shows up, with the bonus
of also testing the artifact whether or not the it is compatible with
the sources being tested. An example with the nunja.stock
package
which requires nunja
:
$ calmjs rjs nunja
$ calmjs karma --coverage --artifact=nunja.js --cover-test \
rjs nunja.stock --sourcepath-method=explicit
The first command produces the artifact file nunja.js
, which is then
immediately used by the subsequent command which explicitly filters out
all other sources not specified. Otherwise, the standard way is that
the dependencies will also be included into the test and the resulting
artifact file. The --cover-test
flag denotes that the test coverage
reporting should be extended to the tests provided. Similarly, enabling
the --cover-artifact
flag will extend coverage reporting to the
artifacts included for the test run.
Package level artifacts defined and generated through the tools that
make use of the calmjs.artifacts
registry system may be tested using
the calmjs artifact karma
tool if the artifact entry in the
calmjs.artifacts
registry also has a corresponding entry in the
calmjs.artifacts.tests
registry. Typically, the module that the
entry point references for the artifact entry will be documented by the
toolchain package that supplied the builder entry. If the artifacts
in the package to be tested are created and the package has well-defined
entries suitable for testing purpose, the following command may be
executed to test the defined and generated artifacts:
$ calmjs artifact karma example.package
There are cases where the test execution may require sourcing tests from
other packages; this use case is especially valid for dependent packages
where their developer want to ensure that the changes they may have made
to their dependencies through the extensions they developed and provided
by their packages have no negative impact to existing functionality.
This functionality is implemented by the --test-with-package
flag,
which may be used to specify which package the artifact should source
the tests from.
$ calmjs artifact karma example.package \
--test-with-package example.dependent
The above command will use karma to execute tests provided by the
example.dependent
package against the artifacts defined for
example.package
. If the artifacts were correctly built, with no
new code breaking existing functionality that was provided by the
example.dependent
package, all tests should pass.
Note that --test-with-package
flag overrides the list of source
packages that will provide the tests to be tested against the artifact.
If additional artifacts are required before the inclusion of the package
artifact into the test runner (e.g. testing for possible conflicts that
artifacts may introduce to the package artifact), they may be specified
using the --artifact
flag; specified artifacts will be prepended to
the list of artifacts provided by the builder for the test execution.
The following may be some issues that may be encountered with standard
or typical usage of calmjs.dev
.
The most likely cause of this error is that the npm
dependencies
specified for this package is not available for the current Node.js
environment. Please ensure that is installed before trying again. One
method is to prepend calmjs.dev
to the calmjs npm
install command,
e.g:
$ calmjs npm --install calmjs.dev ...
Alternatively, package developers can have extras that requires this
package, and instruct downstream users interested in the development of
that package to install and use the package with that extras flag
enabled. For instance, nunja
has the support for that:
$ calmjs npm --install nunja[dev]
A message specific to some plugin may result in the test runner not
being able to execute any test. This is typically caused by certain
versions of karma test runner not being able to cleanly deal with
misbehaving plugins that is available in the node_modules
directory.
If the plugin shown inside the quote (starting with karma-
) is
unnecessary for the execution of tests, it should be removed and the
test command should be executed again.
Installation using the development method will show the above message if
calmjs
was not already installed into the current environment. Please
either reinstall, or regenerate the metadata by running:
$ python setup.py egg_info
In the root of the calmjs.dev
source directory to ensure correct
behavior of this package.
- Issue Tracker: https://github.com/calmjs/calmjs.dev/issues
- Source Code: https://github.com/calmjs/calmjs.dev
The Calmjs project is copyright (c) 2016 Auckland Bioengineering
Institute, University of Auckland. calmjs.dev
is licensed under the
terms of the GPLv2 or later.