////
   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

     https://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.
////

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:

[options="header"]
|=======
| what | pattern | example
| a module without revision | `[organisation]`#`[module]` | `org.apache.ant#ant`
| a module with revision | `[organisation]`#`[module]`$$;$$`[revision]` | `org.apache.ant#ant;1.7.0`
| a module with (some) configurations | `[organisation]`#`[module]`[`[confs]`] | `org.apache.ant#ant[master,compile,build]`
| a module with revision and (some) configurations
| `[organisation]`#`[module]`$$;$$`[revision]`[`[confs]`]
| `org.apache.ant#ant;1.7.0[master,compile,build]`
| a module's artifact
| `[organisation]`#`[module]`!`[artifact]`.`[ext]`(`[type]`)
| `org.apache.ant#ant!ant.jar(source)`
| a module's artifact with revision
| `[organisation]`#`[module]`$$;$$`[revision]`!`[artifact]`.`[ext]`(`[type]`)
| `org.apache.ant#ant;1.7.0!ant.jar(source)`
|=======

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:
[source]
----
#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]
----

In full words here is how it could be written:

[source]
----
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].
----

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:

`organisation`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`

`module`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`

`branch`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`

`revision`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=` `,` `[` `]` `{` `}` `(` `)` `:` `@`

`artifact`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`

`extension`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`

`type`::
`a-z` `A-Z` `0-9` `-` `/` `.` `_` `+` `=`
