Apache Whimsy Project Overview
==================

Apache Whimsy is a collection of useful organizational tools used by
the ASF and Apache committers to access and manipulate data about
Apache people, projects, and processes.  Whimsy is both an [Apache PMC](https://whimsical.apache.org/),
this codebase, and the live deployed instance of https://whimsy.apache.org/.

The ASF's Whimsy instance hosts static content, repository checkouts/clones, CGI scripts, Rack
applications, Node.js applications, tools, and cron jobs.  Note: features accessing private
ASF data are restricted to committers, Members, or Officers of the ASF.

Every commit pushed to master is deployed within minutes to https://whimsy.apache.org/ using
[GitPubSub](https://www.apache.org/dev/gitpubsub.html).

How Tos and Get The Code
===============

Whimsy source code is hosted at:
    https://github.com/apache/whimsy.git
and mirrored for Apache committers at:
    https://gitbox.apache.org/repos/asf/whimsy.git

 * [How To Develop Whimsy Code](./DEVELOPMENT.md)
 * [Submit Bugs/Enhancement Requests](https://issues.apache.org/jira/browse/WHIMSY)
 * [Questions? See the Mailing List](https://lists.apache.org/list.html?dev@whimsical.apache.org)
 * **Setting Up For Local Development**
   * macOS - [Run setupmymac](./SETUPMYMAC.md) or [Follow manual steps](./MACOS.md)
   * [Linux-y setup steps](./DEVELOPMENT.md)
   * [Use DOCKER to run Whimsy locally](./DOCKER.md)
   * [General FAQs for developing the Whimsy Way](./DEVELOPMENT.md#how-to--faq-question)
   * [Whimsy API Docs](https://whimsy.apache.org/docs/)
 * [Configuration Pointers](./CONFIGURE.md) - various config settings for server or local use
 * [Production Server Deployment Instructions](./DEPLOYMENT.md)
 * [Monitoring How To](./www/status/README.md) - [Live Whimsy Status](https://whimsy.apache.org/status/)
 * [Dependency Listing](./CONFIGURE.md#Dependencies)

How To Get Involved!
===============

Since Whimsy hosts many independent tools that make finding or updating information
at the ASF simpler, there are plenty of places for Apache committers to
get involved.  Bugs or improvement suggestions for the many
[tools available on Whimsy](https://whimsy.apache.org/committers/tools)
or [list of public datafiles](https://whimsy.apache.org/test/dataflow.cgi) are always appreciated,
and please join us on the [public #whimsy channel on Slack](https://the-asf.slack.com/).

If you have an idea for a new Whimsy tool, [email us](mailto:dev@whimsical.apache.org?subject=Tool-Idea)!
The PMC supports a rich server environment, so deploying a new tool is as
simple as proposing a .cgi with a bit of Ruby code.  We also have deployments
of Rack and Sinatra apps, and use JavaScript and Wunderbar for most of the
UI building in many tools. The Whimsy server also supports direct access
to Apache SVN or git repositories, making consuming data simple.

The Whimsy committers are always looking for new ideas to improve processes
at Apache, and we can either help you get started or suggest how to
approach just about any sort of "find this ASF data and streamline that
process" ideas.

Most documentation is in the code or in the repo, and our dev@whimsical
mailing list is active.  Note that many Whimsy tools access committer- or
member-private data, so some tools are access restricted.

**Historical note:** The live production whimsy.apache.org server was used for
the board agenda tool and more before we became the Apache Whimsy top level
project.  That's why [whimsy.apache.org](https://whimsy.apache.org/) is
the production server, and mailing lists and a homepage are hosted
on the [whimsical.apache.org](https://whimsical.apache.org/) domain.

Whimsy Architecture - Live Instance
===================

Whimsy is run in an Apache hosted VM with httpd, Rack, Ruby, and variety of other tools
that directly interface with various parts of Apache organizational records.

Details for each type of deployed tool or script:

 * **Static content**  Changes pushed to GitHub master will be
   automatically deployed - every commit triggers the puppet agent to
   do an update, which may take a few minutes.  Note that this includes the
   contents of scripts and applications too.

 * **Repository checkouts/clones**  An copy of a number of repositories
   are updated every 10 minutes via a cron job.  This is controlled
   by [repository.yml](repository.yml).  The whimsy VM is also subscribed
   to board@ and scans those emails for commit messages and will update
   the copy of `foundation/board` when commits happen.

 * **CGI scripts** any dependencies listed in a `Gemfile` will
   automatically be installed.  A simple CGI:

    https://github.com/apache/whimsy/blob/master/www/test.cgi
    https://whimsy.apache.org/test.cgi

 * **Authentication for CGI Scripts** See the [DEVELOPMENT.md FAQ](./DEVELOPMENT.md#how-to-authenticateauthorize-your-scripts).

 * **Rack applications** run under
   [Phusion Passenger](https://www.phusionpassenger.com/) under Apache httpd.
   Again, `Gemfile`s are used to specify dependencies.  In addition to simply
   checking the application, one line per passenger application needs to be
   added to the puppet file under `passenger:` as seen in [DEPLOYMENT.md](./DEPLOYMENT.md#puppetnode).

   A sample rack application (two empty directories, and a one line file):

    https://github.com/apache/whimsy/tree/master/www/racktest

    https://whimsy.apache.org/racktest

   Authentication requirements will also need to be two phase, like with CGI
   above; but more common conditions can be handled at the "Rack" level
   instead of at the application level making use of Rack middleware such as:

    https://github.com/apache/whimsy/blob/master/lib/whimsy/asf/rack.rb#L56

 * **Cron jobs** are managed by puppet.  See [deployment](./DEPLOYMENT.md) for more
   information.

 * **NEW!** Node.js is being prototyped to improve the Board Agenda tool, stay tuned.

 * **Generated JSON data** files are automatically generated into
   the [`/public`](https://whimsy.apache.org/public/) directory, to
   cache frequently used data for whimsy and other applications.  These
   are usually run from a cron calling a www/roster/public_*.rb file.
   See also an [overview of data dependencies and flow](https://whimsy.apache.org/test/dataflow.cgi).

 * **Data models** for many Whimsy tools are in `lib/whimsy/asf`, and
   most **views** for tools are stored in `www`.  Note that Whimsy has
   a wide variety of sometimes unrelated tools, so not everything
   here uses the same models.
