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://infra.apache.org/pypubsub.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 - DOCKER recommended**
   * 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 previous 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 pygitpubsub 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.

 * **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.
