<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!--
   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.    
-->
<html>
<head>
	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
	<script type="text/javascript">var xookiConfig = {level: 0};</script>	
	<script type="text/javascript" src="xooki/xooki.js"></script>
</head>
<body>
	<textarea id="xooki-source">
Very often some concepts discussed in Ivy here, and especially those involving modules and dependencies, require to be discussed by text (e-mail, textual doc, console, ...), and so benefit from convention in this area.

The conventions have been adopted with Ivy 2.0 are the following:
<table>
<thead style="font-weight:700;">
<tr>
<td>
what
</td><td>
pattern
</td><td>
example
</td>
</tr>
</thead>
<tbody>
<tr>
<td>
a module without revision
</td><td>
<i>[organisation]</i>#<i>[module]</i>
</td><td>
org.apache.ant#ant
</td>
</tr>
<tr>
<td>
a module with revision
</td><td>
<i>[organisation]</i>#<i>[module]</i>;<i>[revision]</i>
</td><td>
org.apache.ant#ant;1.7.0
</td>
</tr>
<tr>
<td>
a module with (some) configurations
</td><td>
<i>[organisation]</i>#<i>[module]</i>[ <i>[confs]</i> ]
</td><td>
org.apache.ant#ant[master,compile,build]
</td>
</tr>
<tr>
<td>
a module with revision and (some) configurations
</td><td>
<i>[organisation]</i>#<i>[module]</i>;<i>[revision]</i>[ <i>[confs]</i> ]
</td><td>
org.apache.ant#ant;1.7.0[master,compile,build]
</td>
</tr>
<tr>
<td>
a module's artifact
</td><td>
<i>[organisation]</i>#<i>[module]</i>!<i>[artifact]</i>.<i>[ext]</i>(<i>[type]</i>)
</td><td>
org.apache.ant#ant!ant.jar(source)
</td>
</tr>
<tr>
<td>
a module's artifact with revision
</td><td>
<i>[organisation]</i>#<i>[module]</i>;<i>[revision]</i>!<i>[artifact]</i>.<i>[ext]</i>(<i>[type]</i>)
</td><td>
org.apache.ant#ant;1.7.0!ant.jar(source)
</td>
</tr>
<tbody>
</table>
<br/>
Another usual text representation used is to represent dependencies using a dash followed by greater than sign: ->

To group a set of set of modules, we recommend using curly braces { }

With these conventions, it's easy to give a concise and detailed overview of a set of modules and their dependencies.

For instance:
<pre>
#A;2-> { #B;[1.0,1.5] #C;[2.0,2.5] }
#B;1.4->#D;1.5
#B;1.5->#D;2.0
#C;2.5->#D;[1.0,1.6]
</pre>
In full words here is how it could be written:
<pre>
module A revision 2 depends on module B with the version constraint [1.0,1.5], and on module C with the version constraint [2.0,2.5].
module B revision 1.4 depends on module D revision 1.5.
module B revision 1.5 depends on module D revision 2.0.
module C revision 2.5 depends on module D with the version constraint [1.0,1.6].
</pre>

As you can see, using text conventions is much more concise. 

Another benefit is that these conventions are usually used in Ivy console output, and can also be used in some cases to be parsed into Ivy objects (we use it for test cases for instance). To make sure text parsing works fine, we recommend using only a limited range of characters for each attributes of your module identifiers.

Here is the recommended characters set for each attribute:
<ul>
<li>organisation</li> a-z A-Z 0-9 - / . _ + =
<li>module</li> a-z A-Z 0-9 - / . _ + =
<li>branch</li> a-z A-Z 0-9 - / . _ + =
<li>revision</li> a-z A-Z 0-9 - / . _ + = , [ ] { } ( ) : @
<li>artifact</li> a-z A-Z 0-9 - / . _ + =
<li>extension</li> a-z A-Z 0-9 - / . _ + =
<li>type</li> a-z A-Z 0-9 - / . _ + =
</ul>
</textarea>
<script type="text/javascript">xooki.postProcess();</script>
</body>
</html>
