everything in src for packaging purposes
This commit is contained in:
82
doc/eole-report/eolreport/D01AccesVariables.txt
Normal file
82
doc/eole-report/eolreport/D01AccesVariables.txt
Normal file
@ -0,0 +1,82 @@
|
||||
.. default-role:: literal
|
||||
|
||||
.. include:: inc/preambule.txt
|
||||
|
||||
Accès aux variables
|
||||
====================
|
||||
|
||||
Protocole d'accès aux valeurs
|
||||
-------------------------------
|
||||
|
||||
**Créole**
|
||||
|
||||
- Si la variable n'a pas été déclarée, une erreur est levée
|
||||
- Si la variable a été déclarée, mais qu'aucune valeur n'a été définie, (ni valeur affectée, ni valeur par défaut) la valeur retournée est `[]` ou `""` ou `[""]` ou `["",""]`,
|
||||
- Si la variable a été déclarée et qu'une valeur par défaut a été définie, la valeur retournée et la valeur par défaut,
|
||||
- Si la variable a été déclarée et qu'une valeur a été définie, la valeur retournée est la valeur de la variable.
|
||||
|
||||
**tiramisu**
|
||||
|
||||
- Si la variable n'a pas été déclarée, une erreur est levée
|
||||
- Si la variable a été déclarée, mais qu'aucune valeur n'a été définie, (ni valeur affectée, ni valeur par défaut) la valeur retournée est `None`,
|
||||
- Si la variable a été déclarée et qu'une valeur par défaut a été définie, la valeur retournée et la valeur par défaut,
|
||||
- Si la variable a été déclarée et qu'une valeur a été définie, la valeur retournée est la valeur de la variable.
|
||||
|
||||
la différence tient au fait de la valeur nulle (`None`) qui a été mal définie
|
||||
dès le début dans `Créole`.
|
||||
|
||||
Accès Créole par "dictionnaire"
|
||||
--------------------------------
|
||||
|
||||
La définition est dans le `XML`
|
||||
|
||||
::
|
||||
|
||||
<family name="general">
|
||||
|
||||
<variable name="adresse_ip_eth0">
|
||||
|
||||
Le dictionnaire est chargé dans un `EoleDict()`
|
||||
|
||||
::
|
||||
|
||||
from creole.cfgparser import EoleDict
|
||||
eoldict = EoleDict(...)
|
||||
|
||||
Un export dans un dictionnaire est necessaire pour manipuler les données
|
||||
|
||||
::
|
||||
|
||||
from creole.parsedico import parse_dico
|
||||
|
||||
flatdict = parse_dico(eoldict)
|
||||
|
||||
assert dico['ip'] == '10.10.1.11'
|
||||
|
||||
|
||||
le resultat de l'accès aux données vient de `typeole.EoleVar('ip').get_value()`
|
||||
|
||||
|
||||
Accès `tiramisu` par espace de nommage
|
||||
----------------------------------------
|
||||
|
||||
|
||||
- espaces de nommages ;
|
||||
- c'est la configuration qui est responsable de l'accès aux valeurs ;
|
||||
- une configuration par accès direct (pas d'export) ;
|
||||
- un point d'entrée unique aisément manipulable grâce aux espaces de nommage.
|
||||
|
||||
::
|
||||
|
||||
from tiramisu.config import Config
|
||||
from tiramisu.option import OptionDescription
|
||||
subdescr = OptionDescription("creole", [IPOption('ip')])
|
||||
descr = OptionDescription("creole", [subdescr])
|
||||
config = Config(descr)
|
||||
assert config.creole.general.ip == '10.10.1.11'
|
||||
|
||||
Les valeurs sont dépendantes **de la configuration** et donc la responsabilité
|
||||
des valeurs dépend de la configuration et pas de la variable elle-même.
|
||||
|
||||
|
||||
|
109
doc/eole-report/eolreport/D02CoherenceVariables.txt
Normal file
109
doc/eole-report/eolreport/D02CoherenceVariables.txt
Normal file
@ -0,0 +1,109 @@
|
||||
.. default-role:: literal
|
||||
|
||||
.. include:: inc/preambule.txt
|
||||
|
||||
Cohérence des valeurs des variables
|
||||
====================================
|
||||
|
||||
type des variables
|
||||
-------------------
|
||||
|
||||
**Créole**
|
||||
|
||||
pas d'unicité du type abstrait : `Multivar`, `CreoleVar` et `TypedVar`
|
||||
|
||||
- `String`
|
||||
- `Ip`
|
||||
- `Netmask`
|
||||
- `Number`
|
||||
- `Boolean`
|
||||
- `OuiNon`
|
||||
|
||||
**tiramisu**
|
||||
|
||||
unicité du type abstrait : `Option()`
|
||||
|
||||
pas de nouveau type multivalué, mais un attribut des types existants::
|
||||
|
||||
>>> from option import BoolOption
|
||||
>>> boolopt = BoolOption('bool', 'description de bool', multi=True)
|
||||
|
||||
tous les types Créole, plus
|
||||
|
||||
- `SymlinkOption`
|
||||
- `CheckOption` qui permet de définir les "oui/non", "On/Off"
|
||||
|
||||
Validations suivant l'organisation en familles
|
||||
-----------------------------------------------
|
||||
|
||||
**Créole**
|
||||
|
||||
**Organisation par accumulation de références sur des dictionnaires (`EoleDict`)**
|
||||
|
||||
On peut charger un EoleDict avec des variables qui pointent vers des families
|
||||
qui n'existent pas, aucune validation n'est faite (confiance absolument faite au
|
||||
moment du chargemzent du XML)
|
||||
|
||||
exemple, dans l'espace de nommage racine::
|
||||
|
||||
<variables>
|
||||
<variable name="adresse_ip_eth0">
|
||||
|
||||
|
||||
::
|
||||
|
||||
from creole.parsedico import parse_dico
|
||||
flatdict = parse_dico(eoldict)
|
||||
dico['adresse_ip_eth0']
|
||||
KeyError: 'adresse_ip_eth0'
|
||||
|
||||
**Tiramisu**
|
||||
|
||||
**Organisation par arborescence.**
|
||||
|
||||
Un espace de nommage doit systématiquement être défini, la variable n'est
|
||||
accessible **que** par un path.
|
||||
|
||||
|
||||
Variables présentes deux fois
|
||||
-------------------------------
|
||||
|
||||
- Créole : pas de validation possible
|
||||
- tiramisu : comportement règlable (on autorise l'unicité ou pas)
|
||||
|
||||
- dans Créole les valeurs sont **fausses** (c'est la dernière variable qui qui gagne)
|
||||
|
||||
Il faut faire confiance au XML
|
||||
|
||||
::
|
||||
|
||||
<family name="general">
|
||||
<variable name="adresse_ip_eth0">
|
||||
<valeur>toto
|
||||
|
||||
|
||||
<family name="services">
|
||||
<variable name="adresse_ip_eth0">
|
||||
<valeur>tutu
|
||||
|
||||
|
||||
dans `gen_config` la valeur retenue est::
|
||||
|
||||
general/adresse_ip_eth0 -> tutu
|
||||
services/adresse_ip_eth0 -> tutu
|
||||
|
||||
dans `parsedico`, la variable est écrasée::
|
||||
|
||||
>>> from creole.parsedico import parse_dico
|
||||
>>> d = parse_dico()
|
||||
>>> d['adresse_ip_eth0']
|
||||
tutu
|
||||
|
||||
dans tiramisu::
|
||||
|
||||
>>> config.general.adresse_ip_eth0
|
||||
toto
|
||||
>>> config.services.adresse_ip_eth0
|
||||
tutu
|
||||
|
||||
|
113
doc/eole-report/eolreport/D03ReglesEtats.txt
Normal file
113
doc/eole-report/eolreport/D03ReglesEtats.txt
Normal file
@ -0,0 +1,113 @@
|
||||
.. default-role:: literal
|
||||
|
||||
.. include:: inc/preambule.txt
|
||||
|
||||
Etats et statuts des options de configuration
|
||||
================================================
|
||||
|
||||
état des variables et lisibilité de l'API
|
||||
-------------------------------------------
|
||||
|
||||
**Creole**
|
||||
|
||||
`EoleVar()`
|
||||
|
||||
- `get_value()`
|
||||
- `get_final_value()`
|
||||
- `get_final_value_at_index()`
|
||||
- `check_value()`
|
||||
- `get_prec_value()`
|
||||
- `get_calculated_value()` -> automatique
|
||||
|
||||
**tiramisu**
|
||||
|
||||
`Option()`
|
||||
|
||||
- **aucune API** d'accès à la valeur d'une option au niveau de l'option de configuration
|
||||
- `option.getdefault()`
|
||||
- `option.setoption(config, value, owner)`
|
||||
|
||||
variables "automatiques"
|
||||
------------------------------
|
||||
|
||||
si `owner` == 'auto', la variable est automatique et la configuration le sait,
|
||||
elle lance alors les fonctions de calcul à chaque évaluation
|
||||
|
||||
dans Créole, c'est validé aux niveau de la variable par un appel à `eval_func()`
|
||||
|
||||
Accès suivant les états de la configuration
|
||||
--------------------------------------------
|
||||
|
||||
- disabled
|
||||
- hidden
|
||||
- mode (normal/expert)
|
||||
- obligatoire (mandatory)
|
||||
- ...
|
||||
|
||||
- `EoleVar.hidden`
|
||||
- `EoleVar.disabled`
|
||||
|
||||
pas d'objet `Family` dans Créole donc l'organisation des hiérarchie de
|
||||
hidden est opaque
|
||||
|
||||
- `EoleDict.families['hidden']` pour avoir accès à l'état d'une famille
|
||||
|
||||
dans Tiramisu
|
||||
|
||||
- `hidden` au niveau `Option`, `OptionDescription` et **aussi** au niveau de
|
||||
la configuration ce qui permet d'avoir des états (inexistant dans `Créole`)
|
||||
|
||||
.. maitres/esclaves avec Créole : `mavar.get_slaves()`
|
||||
|
||||
|
||||
`hidden_if_in`, `hidden_if_not_in`
|
||||
-------------------------------------
|
||||
|
||||
La notion est généralisée dans tiramisu avec les `requires`.
|
||||
|
||||
Dans Créole : très difficile de conserver une cohérence des `hidden_if_in`
|
||||
quand il y en a plusieurs.
|
||||
|
||||
Dans Tiramisu : validation et levée d'exception si les **requirements** sont
|
||||
incohérents, action inverse si aucun requires n'est matché.
|
||||
|
||||
exemple de requires
|
||||
|
||||
::
|
||||
|
||||
<family name="clamav">
|
||||
<variable name="activer_clam">
|
||||
|
||||
<variable name="activer_clam_exim">
|
||||
<valeur>non
|
||||
|
||||
<variable name="activer_clam_samba">
|
||||
<valeur>oui
|
||||
|
||||
<condition name='hidden_if_in' source='activer_clam_exim'>
|
||||
<param>non
|
||||
<target type='variable'>activer_clam
|
||||
<!-- ça hide (momentanément)-->
|
||||
|
||||
<condition name='hidden_if_in' source='activer_clam_samba'>
|
||||
<param>non
|
||||
<target type='variable'>activer_clam
|
||||
<!-- ça show (et c'est le dernier qui a raison) -->
|
||||
|
||||
:résultat: `activer_clam` est visible, c'est la dernière condition qui a raison
|
||||
|
||||
avec tiramisu, `activer_clam` **dans les même conditions**, est cachée.
|
||||
|
||||
::
|
||||
|
||||
>>> activer_clam = StrOption('activer_clam', 'activer clamav',
|
||||
requires=[('activer_clam_exim', 'non', 'hide'),
|
||||
('activer_clam_samba', 'non', 'hide'),])
|
||||
>>> config.clamav.activer_clam_exim = 'non'
|
||||
>>> config.clamav.activer_clam_samba = 'oui'
|
||||
>>> config.clamav.activer_clam
|
||||
>>> Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
HiddenOptionError("trying to access to a hidden option:activer_clam")
|
||||
>>>
|
||||
|
7
doc/eole-report/eolreport/Makefile
Normal file
7
doc/eole-report/eolreport/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
|
||||
%.odt: %.txt
|
||||
rst2odt --create-links --custom-odt-footer="Page %p% de %P%" --endnotes-end-doc --no-generator --stylesheet=styles.odt $< $@
|
||||
|
||||
%.html: %.txt
|
||||
rst2html --stylesheet ./build/style.css $< > ./build/$@
|
||||
|
6
doc/eole-report/eolreport/build/Makefile
Normal file
6
doc/eole-report/eolreport/build/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
.PHONY: clean
|
||||
.SUFFIXES:
|
||||
|
||||
clean:
|
||||
rm -f *.html
|
||||
rm -f api/*.html
|
1080
doc/eole-report/eolreport/build/default.css
Normal file
1080
doc/eole-report/eolreport/build/default.css
Normal file
@ -0,0 +1,1080 @@
|
||||
body,body.editor,body.body {
|
||||
font: 110% "Times New Roman", Arial, Verdana, Helvetica, serif;
|
||||
background: White;
|
||||
color: Black;
|
||||
}
|
||||
|
||||
a, a.reference {
|
||||
text-decoration: none;
|
||||
}
|
||||
a[href]:hover { text-decoration: underline; }
|
||||
|
||||
img {
|
||||
border: none;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
p, div.text {
|
||||
text-align: left;
|
||||
line-height: 1.5em;
|
||||
margin: 0.5em 0em 0em 0em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
p a:active {
|
||||
color: Red;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
p img {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
img.inlinephoto {
|
||||
padding: 0;
|
||||
padding-right: 1em;
|
||||
padding-top: 0.7em;
|
||||
float: left;
|
||||
}
|
||||
|
||||
hr {
|
||||
clear: both;
|
||||
height: 1px;
|
||||
color: #8CACBB;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
ul {
|
||||
line-height: 1.5em;
|
||||
/*list-style-image: url("bullet.gif"); */
|
||||
margin-left: 1.5em;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
ol {
|
||||
line-height: 1.5em;
|
||||
margin-left: 1.5em;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
ul a, ol a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
dl {
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dd {
|
||||
line-height: 1.5em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
font-family: Times, "Times New Roman", serif;
|
||||
font-style: italic;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
code {
|
||||
color: Black;
|
||||
/*background-color: #dee7ec;*/
|
||||
background-color: #cccccc;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 1em;
|
||||
border: 1px solid #8cacbb;
|
||||
color: Black;
|
||||
background-color: #dee7ec;
|
||||
background-color: #cccccc;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.netscape4 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* main page styles */
|
||||
|
||||
/*a[href]:hover { color: black; text-decoration: underline; }
|
||||
a[href]:link { color: black; text-decoration: underline; }
|
||||
a[href] { color: black; text-decoration: underline; }
|
||||
*/
|
||||
|
||||
span.menu_selected {
|
||||
color: black;
|
||||
font: 140% Verdana, Helvetica, Arial, sans-serif;
|
||||
text-decoration: none;
|
||||
padding-right: 0.3em;
|
||||
background-color: #cccccc;
|
||||
}
|
||||
|
||||
|
||||
a.menu {
|
||||
/*color: #3ba6ec; */
|
||||
font: 140% Verdana, Helvetica, Arial, sans-serif;
|
||||
text-decoration: none;
|
||||
padding-right: 0.3em;
|
||||
}
|
||||
|
||||
a.menu[href]:visited, a.menu[href]:link{
|
||||
/*color: #3ba6ec; */
|
||||
font: 140% Verdana, Helvetica, Arial, sans-serif;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.menu[href]:hover {
|
||||
/*color: black;*/
|
||||
}
|
||||
|
||||
div.project_title{
|
||||
/*border-spacing: 20px;*/
|
||||
font: 160% Verdana, Helvetica, Arial, sans-serif;
|
||||
color: #3ba6ec;
|
||||
vertical-align: middle;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
a.wikicurrent {
|
||||
font: 100% Verdana, Helvetica, Arial, sans-serif;
|
||||
color: #3ba6ec;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
table.body {
|
||||
border: 0;
|
||||
/*padding: 0;
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
*/
|
||||
}
|
||||
|
||||
td.page-header-left {
|
||||
padding: 5px;
|
||||
/*border-bottom: 1px solid #444444;*/
|
||||
}
|
||||
|
||||
td.page-header-top {
|
||||
padding: 0;
|
||||
|
||||
/*border-bottom: 1px solid #444444;*/
|
||||
}
|
||||
|
||||
td.sidebar {
|
||||
padding: 1 0 0 1;
|
||||
}
|
||||
|
||||
td.sidebar p.classblock {
|
||||
padding: 0 5 0 5;
|
||||
margin: 1 1 1 1;
|
||||
border: 1px solid #444444;
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
td.sidebar p.userblock {
|
||||
padding: 0 5 0 5;
|
||||
margin: 1 1 1 1;
|
||||
border: 1px solid #444444;
|
||||
background-color: #eeeeff;
|
||||
}
|
||||
|
||||
td.content {
|
||||
padding: 1 5 1 5;
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
p.ok-message {
|
||||
background-color: #22bb22;
|
||||
padding: 5 5 5 5;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
p.error-message {
|
||||
background-color: #bb2222;
|
||||
padding: 5 5 5 5;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p:first-child {
|
||||
margin: 0 ;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* style for forms */
|
||||
table.form {
|
||||
padding: 2;
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
}
|
||||
|
||||
table.form th {
|
||||
color: #333388;
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
font-weight: normal;
|
||||
}
|
||||
table.form th.header {
|
||||
font-weight: bold;
|
||||
background-color: #eeeeff;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.form th.required {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
table.form td {
|
||||
color: #333333;
|
||||
empty-cells: show;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.form td.optional {
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.form td.html {
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
/* style for lists */
|
||||
table.list {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
vertical-align: top;
|
||||
padding-top: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.list th {
|
||||
padding: 0 4 0 4;
|
||||
color: #404070;
|
||||
background-color: #eeeeff;
|
||||
border-right: 1px solid #404070;
|
||||
border-top: 1px solid #404070;
|
||||
border-bottom: 1px solid #404070;
|
||||
vertical-align: top;
|
||||
empty-cells: show;
|
||||
}
|
||||
table.list th a[href]:hover { color: #404070 }
|
||||
table.list th a[href]:link { color: #404070 }
|
||||
table.list th a[href] { color: #404070 }
|
||||
table.list th.group {
|
||||
background-color: #f4f4ff;
|
||||
text-align: center;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
table.list td {
|
||||
padding: 0 4 0 4;
|
||||
border: 0 2 0 2;
|
||||
border-right: 1px solid #404070;
|
||||
color: #404070;
|
||||
background-color: white;
|
||||
vertical-align: top;
|
||||
empty-cells: show;
|
||||
}
|
||||
|
||||
table.list tr.normal td {
|
||||
background-color: white;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
table.list tr.alt td {
|
||||
background-color: #efefef;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
table.list td:first-child {
|
||||
border-left: 1px solid #404070;
|
||||
border-right: 1px solid #404070;
|
||||
}
|
||||
|
||||
table.list th:first-child {
|
||||
border-left: 1px solid #404070;
|
||||
border-right: 1px solid #404070;
|
||||
}
|
||||
|
||||
table.list tr.navigation th {
|
||||
text-align: right;
|
||||
}
|
||||
table.list tr.navigation th:first-child {
|
||||
border-right: none;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
/* style for message displays */
|
||||
table.messages {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.messages th.header{
|
||||
padding-top: 10px;
|
||||
border-bottom: 1px solid gray;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #707040;
|
||||
}
|
||||
|
||||
table.messages th {
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #afafaf;
|
||||
}
|
||||
|
||||
table.messages td {
|
||||
font-family: monospace;
|
||||
background-color: #efefef;
|
||||
border-bottom: 1px solid #afafaf;
|
||||
color: black;
|
||||
empty-cells: show;
|
||||
border-right: 1px solid #afafaf;
|
||||
vertical-align: top;
|
||||
padding: 2 5 2 5;
|
||||
}
|
||||
|
||||
table.messages td:first-child {
|
||||
border-left: 1px solid #afafaf;
|
||||
border-right: 1px solid #afafaf;
|
||||
}
|
||||
|
||||
/* style for file displays */
|
||||
table.files {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.files th.header{
|
||||
padding-top: 10px;
|
||||
border-bottom: 1px solid gray;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #707040;
|
||||
}
|
||||
|
||||
table.files th {
|
||||
border-bottom: 1px solid #afafaf;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.files td {
|
||||
font-family: monospace;
|
||||
empty-cells: show;
|
||||
}
|
||||
|
||||
/* style for history displays */
|
||||
table.history {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.history th.header{
|
||||
padding-top: 10px;
|
||||
border-bottom: 1px solid gray;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #707040;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
table.history th {
|
||||
border-bottom: 1px solid #afafaf;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
table.history td {
|
||||
font-size: 90%;
|
||||
vertical-align: top;
|
||||
empty-cells: show;
|
||||
}
|
||||
|
||||
|
||||
/* style for class list */
|
||||
table.classlist {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.classlist th.header{
|
||||
padding-top: 10px;
|
||||
border-bottom: 1px solid gray;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #707040;
|
||||
}
|
||||
|
||||
table.classlist th {
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
/* style for class help display */
|
||||
table.classhelp {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.classhelp th {
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
color: #707040;
|
||||
}
|
||||
|
||||
table.classhelp td {
|
||||
padding: 2 2 2 2;
|
||||
border: 1px solid black;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
empty-cells: show;
|
||||
}
|
||||
|
||||
|
||||
/* style for "other" displays */
|
||||
table.otherinfo {
|
||||
border-spacing: 0px;
|
||||
border-collapse: separate;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.otherinfo th.header{
|
||||
padding-top: 10px;
|
||||
border-bottom: 1px solid gray;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #707040;
|
||||
}
|
||||
|
||||
table.otherinfo th {
|
||||
border-bottom: 1px solid #afafaf;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
input {
|
||||
border: 1px solid #8cacbb;
|
||||
color: Black;
|
||||
background-color: white;
|
||||
vertical-align: middle;
|
||||
margin-bottom: 1px; /* IE bug fix */
|
||||
padding: 0.1em;
|
||||
}
|
||||
|
||||
select {
|
||||
border: 1px solid #8cacbb;
|
||||
color: Black;
|
||||
background-color: white;
|
||||
vertical-align: middle;
|
||||
margin-bottom: 1px; /* IE bug fix */
|
||||
padding: 0.1em;
|
||||
}
|
||||
|
||||
|
||||
a.nonexistent {
|
||||
color: #FF2222;
|
||||
}
|
||||
a.nonexistent:visited {
|
||||
color: #FF2222;
|
||||
}
|
||||
a.external {
|
||||
color: #AA6600;
|
||||
}
|
||||
|
||||
/*
|
||||
dl,ul,ol {
|
||||
margin-top: 1pt;
|
||||
}
|
||||
tt,pre {
|
||||
font-family: Lucida Console,Courier New,Courier,monotype;
|
||||
font-size: 12pt;
|
||||
}
|
||||
pre.code {
|
||||
margin-top: 8pt;
|
||||
margin-bottom: 8pt;
|
||||
background-color: #FFFFEE;
|
||||
white-space:pre;
|
||||
border-style:solid;
|
||||
border-width:1pt;
|
||||
border-color:#999999;
|
||||
color:#111111;
|
||||
padding:5px;
|
||||
width:100%;
|
||||
}
|
||||
*/
|
||||
div.diffold {
|
||||
background-color: #FFFF80;
|
||||
border-style:none;
|
||||
border-width:thin;
|
||||
width:100%;
|
||||
}
|
||||
div.diffnew {
|
||||
background-color: #80FF80;
|
||||
border-style:none;
|
||||
border-width:thin;
|
||||
width:100%;
|
||||
}
|
||||
div.message {
|
||||
margin-top: 6pt;
|
||||
background-color: #E8FFE8;
|
||||
border-style:solid;
|
||||
border-width:1pt;
|
||||
border-color:#999999;
|
||||
color:#440000;
|
||||
padding:5px;
|
||||
width:100%;
|
||||
}
|
||||
strong.highlight {
|
||||
background-color: #FFBBBB;
|
||||
/* as usual, NetScape fucks up with innocent CSS
|
||||
border-color: #FFAAAA;
|
||||
border-style: solid;
|
||||
border-width: 1pt;
|
||||
*/
|
||||
}
|
||||
|
||||
table.navibar {
|
||||
background-color: #C8C8C8;
|
||||
border-spacing: 3px;
|
||||
}
|
||||
td.navibar {
|
||||
background-color: #E8E8E8;
|
||||
vertical-align: top;
|
||||
text-align: right;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.pagename {
|
||||
font-size: 140%;
|
||||
color: blue;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
padding: 0 ;
|
||||
}
|
||||
|
||||
a.wikiaction, input.wikiaction {
|
||||
color: black;
|
||||
text-decoration: None;
|
||||
text-align: center;
|
||||
color: black;
|
||||
/*border: 1px solid #3ba6ec; */
|
||||
margin: 4px;
|
||||
padding: 5;
|
||||
padding-bottom: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
a.wikiaction[href]:hover {
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
/*background-color: #dddddd; */
|
||||
}
|
||||
|
||||
span.wikiuserpref {
|
||||
padding-top: 1em;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
div.wikitrail {
|
||||
vertical-align: bottom;
|
||||
/*font-size: -1;*/
|
||||
padding-top: 1em;
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.wikiaction {
|
||||
vertical-align: middle;
|
||||
/*border-bottom: 1px solid #8cacbb;*/
|
||||
padding-bottom:1em;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.wikieditmenu {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
form.wikiedit {
|
||||
border: 1px solid #8cacbb;
|
||||
background-color: #f0f0f0;
|
||||
background-color: #fabf00;
|
||||
padding: 1em;
|
||||
padding-right: 0em;
|
||||
}
|
||||
|
||||
div.legenditem {
|
||||
padding-top: 0.5em;
|
||||
padding-left: 0.3em;
|
||||
}
|
||||
|
||||
span.wikitoken {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
|
||||
div#contentspace h1:first-child, div.heading:first-child {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
div#contentspace h2:first-child {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* heading and paragraph text */
|
||||
|
||||
div.heading, h1 {
|
||||
font-family: Verdana, Helvetica, Arial, sans-serif;
|
||||
background-color: #58b3ef;
|
||||
background-color: #FFFFFF;
|
||||
/*color: #4893cf;*/
|
||||
color: black;
|
||||
padding-top: 1.0em;
|
||||
padding-bottom:0.2em;
|
||||
text-align: left;
|
||||
margin-top: 0em;
|
||||
/*margin-bottom:8pt;*/
|
||||
font-weight: bold;
|
||||
font-size: 115%;
|
||||
border-bottom: 1px solid #8CACBB;
|
||||
}
|
||||
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: orange;
|
||||
clear: left;
|
||||
font: 100% Verdana, Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding-left: 0em;
|
||||
padding-top: 1em;
|
||||
padding-bottom: 0.2em;
|
||||
/*border-bottom: 1px solid #8CACBB;*/
|
||||
}
|
||||
/* h1,h2 { padding-top: 0; }*/
|
||||
|
||||
|
||||
h1 { font-size: 145%; }
|
||||
h2 { font-size: 135%; }
|
||||
h3 { font-size: 125%; }
|
||||
h4 { font-size: 120%; }
|
||||
h5 { font-size: 110%; }
|
||||
h6 { font-size: 80%; }
|
||||
|
||||
h1 a { text-decoration: None;}
|
||||
|
||||
div.exception {
|
||||
background-color: #bb2222;
|
||||
padding: 5 5 5 5;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
pre.exception {
|
||||
font-size: 110%;
|
||||
padding: 1em;
|
||||
border: 1px solid #8cacbb;
|
||||
color: Black;
|
||||
background-color: #dee7ec;
|
||||
background-color: #cccccc;
|
||||
}
|
||||
|
||||
/* defines for navgiation bar (documentation) */
|
||||
|
||||
|
||||
div.direntry {
|
||||
padding-top: 0.3em;
|
||||
padding-bottom: 0.3em;
|
||||
margin-right: 1em;
|
||||
font-weight: bold;
|
||||
background-color: #dee7ec;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
div.fileentry {
|
||||
font-family: Verdana, Helvetica, Arial, sans-serif;
|
||||
padding-bottom: 0.3em;
|
||||
white-space: nowrap;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
a.fileentry {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
|
||||
span.left {
|
||||
text-align: left;
|
||||
}
|
||||
span.right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.navbar {
|
||||
/*margin: 0;*/
|
||||
font-size: 80% /*smaller*/;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
/* position: fixed; */
|
||||
top: 100pt;
|
||||
left: 0pt; /* auto; */
|
||||
width: 120pt;
|
||||
/* right: auto;
|
||||
right: 0pt; 2em; */
|
||||
}
|
||||
|
||||
|
||||
div.history a {
|
||||
/* font-size: 70%; */
|
||||
}
|
||||
|
||||
div.wikiactiontitle {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* REST defines */
|
||||
|
||||
div.document {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1.title {
|
||||
margin: 0;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
td.toplist {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
img#pyimg {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
left: 4px;
|
||||
}
|
||||
|
||||
div#navspace {
|
||||
position: absolute;
|
||||
top: 130px;
|
||||
left: 11px;
|
||||
font-size: 100%;
|
||||
width: 150px;
|
||||
overflow: hidden; /* scroll; */
|
||||
}
|
||||
|
||||
div#metaspace {
|
||||
position: absolute;
|
||||
top: 40px;
|
||||
left: 170px;
|
||||
}
|
||||
|
||||
div#errorline {
|
||||
position: relative;
|
||||
top: 5px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
div#contentspace {
|
||||
position: absolute;
|
||||
/* font: 120% "Times New Roman", serif;*/
|
||||
font: 110% Verdana, Helvetica, Arial, sans-serif;
|
||||
top: 130px;
|
||||
left: 170px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
div#menubar {
|
||||
/* width: 400px; */
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* for the documentation page */
|
||||
div#docinfoline {
|
||||
position: relative;
|
||||
top: 5px;
|
||||
left: 0px;
|
||||
|
||||
/*background-color: #dee7ec; */
|
||||
padding: 5pt;
|
||||
padding-bottom: 1em;
|
||||
color: black;
|
||||
/*border-width: 1pt;
|
||||
border-style: solid;*/
|
||||
|
||||
}
|
||||
|
||||
div#docnavlist {
|
||||
/*background-color: #dee7ec; */
|
||||
padding: 5pt;
|
||||
padding-bottom: 2em;
|
||||
color: black;
|
||||
border-width: 1pt;
|
||||
/*border-style: solid;*/
|
||||
}
|
||||
|
||||
|
||||
/* text markup */
|
||||
|
||||
div.listtitle {
|
||||
color: Black;
|
||||
clear: left;
|
||||
font: 120% Verdana, Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding-left: 0em;
|
||||
padding-top: 0em;
|
||||
padding-bottom: 0.2em;
|
||||
margin-right: 0.5em;
|
||||
border-bottom: 1px solid #8CACBB;
|
||||
}
|
||||
|
||||
div.actionbox h3 {
|
||||
padding-top: 0;
|
||||
padding-right: 0.5em;
|
||||
padding-left: 0.5em;
|
||||
background-color: #fabf00;
|
||||
text-align: center;
|
||||
border: 1px solid black; /* 8cacbb; */
|
||||
}
|
||||
|
||||
div.actionbox a {
|
||||
display: block;
|
||||
padding-bottom: 0.5em;
|
||||
padding-top: 0.5em;
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
div.actionbox a.history {
|
||||
display: block;
|
||||
padding-bottom: 0.5em;
|
||||
padding-top: 0.5em;
|
||||
margin-left: 0.5em;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.actionbox {
|
||||
margin-bottom: 2em;
|
||||
padding-bottom: 1em;
|
||||
overflow: hidden; /* scroll; */
|
||||
}
|
||||
|
||||
/* taken from docutils (oh dear, a bit senseless) */
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
|
||||
/*
|
||||
:Author: David Goodger
|
||||
:Contact: goodger@users.sourceforge.net
|
||||
:date: $Date: 2003/01/22 22:26:48 $
|
||||
:version: $Revision: 1.29 $
|
||||
:copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
*/
|
||||
/*
|
||||
.first {
|
||||
margin-top: 0 }
|
||||
|
||||
.last {
|
||||
margin-bottom: 0 }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.attention, div.caution, div.danger, div.error, div.hint,
|
||||
div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.hint p.admonition-title, div.important p.admonition-title,
|
||||
div.note p.admonition-title, div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
font-size: smaller }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.title {
|
||||
text-align: center ;
|
||||
color: orange}
|
||||
|
||||
h2.subtitle {
|
||||
color: orange;
|
||||
text-align: center }
|
||||
|
||||
hr {
|
||||
width: 75% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.line-block {
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.literal-block, pre.doctest-block {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em ;
|
||||
background-color: #eeeeee }
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.option-argument {
|
||||
font-style: italic }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
table {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.citation {
|
||||
border-left: solid thin gray ;
|
||||
padding-left: 0.5ex }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid thin black ;
|
||||
padding-left: 0.5ex }
|
||||
|
||||
td, th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
th.docinfo-name, th.field-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap }
|
||||
|
||||
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
|
||||
font-size: 100% }
|
||||
|
||||
tt {
|
||||
background-color: #eeeeee }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
*/
|
||||
|
||||
div.section {
|
||||
margin-top: 1.0em ;
|
||||
}
|
255
doc/eole-report/eolreport/build/docutils.css
Normal file
255
doc/eole-report/eolreport/build/docutils.css
Normal file
@ -0,0 +1,255 @@
|
||||
.first {
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: inherit }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
|
||||
dl dt { line-height: 150% }
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.document {
|
||||
width: 600px ;
|
||||
margin-left: 5em ;
|
||||
margin-right: 5em }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin-left: 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1, h2, h3, h4, h5 {
|
||||
font-family: sans-serif ;
|
||||
line-height: 150% ;
|
||||
color: orange} /* #666 } */
|
||||
|
||||
h1.title {
|
||||
text-align: center
|
||||
}
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.line-block {
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.literal-block, pre.doctest-block {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em ;
|
||||
font-size: small ;
|
||||
background-color: #eeeeee }
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.option-argument {
|
||||
font-style: italic }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
table.citation {
|
||||
border-left: solid thin gray }
|
||||
|
||||
table.docinfo {
|
||||
/* float: right ; */
|
||||
margin: 2em 4em ;
|
||||
color: #666 }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid thin black }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
th.docinfo-name, th.field-name {
|
||||
font-weight: bold ;
|
||||
text-align: right ;
|
||||
white-space: nowrap }
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
tt.docutils {
|
||||
background-color: #eeeeee }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
BIN
doc/eole-report/eolreport/build/imgs/eol.png
Normal file
BIN
doc/eole-report/eolreport/build/imgs/eol.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
BIN
doc/eole-report/eolreport/build/imgs/logo.png
Normal file
BIN
doc/eole-report/eolreport/build/imgs/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
76
doc/eole-report/eolreport/build/index-report.html
Normal file
76
doc/eole-report/eolreport/build/index-report.html
Normal file
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
|
||||
<title>rapports eole</title>
|
||||
<style type="text/css">
|
||||
|
||||
@import url(docutils.css);
|
||||
@import url(default.css);
|
||||
a:link {
|
||||
color: orange;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
a:active {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.header {
|
||||
color: orange;
|
||||
background-color: white;
|
||||
padding: 1em;
|
||||
}
|
||||
.footer {
|
||||
color: #666;
|
||||
background-color: inherit;
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document">
|
||||
|
||||
|
||||
<img alt="imgs/eol.png" class="align-right" src="imgs/eol.png" />
|
||||
<table class="docutils field-list" frame="void" rules="none">
|
||||
<col class="field-name" />
|
||||
<col class="field-body" />
|
||||
<tbody valign="top">
|
||||
<tr class="field"><th class="field-name">date:</th><td class="field-body">mai 2012</td>
|
||||
</tr>
|
||||
<tr class="field"><th class="field-name">description:</th><td class="field-body">rapports <tt class="docutils literal">Créole</tt>, compatibilités <tt class="docutils literal">Creole</tt> et <tt class="docutils literal">tiramisu</tt></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="section" id="vue-d-ensemble-des-rapports">
|
||||
<h1>Vue d'ensemble des rapports</h1>
|
||||
<p>Les rapports ci-dessous résument et permettent de donner des points d'appui à
|
||||
des discussions de recherche et développement concernant l'évolution du
|
||||
projet <tt class="docutils literal">Creole</tt> (comprenant <tt class="docutils literal">Creole_Serv</tt>). Il y a aussi le support de
|
||||
documentation développeur <tt class="docutils literal">tiramisu</tt> (en anglais) qui constitue une bonne
|
||||
base pour connaître et comprendre plus en détails les motivations de
|
||||
la nouvelle implementation.</p>
|
||||
<ul class="simple">
|
||||
<li><a class="reference external" href="pdfreport/D01AccesVariables.pdf">D01AccesVariables.pdf</a></li>
|
||||
<li><a class="reference external" href="pdfreport/D02CoherenceVariables.pdf">D02CoherenceVariables.pdf</a></li>
|
||||
<li><a class="reference external" href="pdfreport/D03ReglesEtats.pdf">D03ReglesEtats.pdf</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
doc/eole-report/eolreport/build/pdfreport/D01AccesVariables.pdf
Normal file
BIN
doc/eole-report/eolreport/build/pdfreport/D01AccesVariables.pdf
Normal file
Binary file not shown.
Binary file not shown.
BIN
doc/eole-report/eolreport/build/pdfreport/D03ReglesEtats.pdf
Normal file
BIN
doc/eole-report/eolreport/build/pdfreport/D03ReglesEtats.pdf
Normal file
Binary file not shown.
22
doc/eole-report/eolreport/build/pdfreport/make_index
Executable file
22
doc/eole-report/eolreport/build/pdfreport/make_index
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
import sys
|
||||
from glob import glob
|
||||
from os.path import isfile, dirname, abspath, join, basename, splitext
|
||||
from rst import Rest, Paragraph, Strong, ListItem, Link
|
||||
|
||||
|
||||
here = abspath(dirname(__file__))
|
||||
html = glob(join(here, '*.pdf'))
|
||||
|
||||
basehtml = [basename(htm) for htm in html]
|
||||
basehtml.sort()
|
||||
|
||||
content = Rest()
|
||||
|
||||
for htm in basehtml:
|
||||
link = Link( htm , "pdfreport/" +htm)
|
||||
content.add(ListItem(link))
|
||||
|
||||
sys.stdout.write(content.text())
|
||||
|
||||
|
410
doc/eole-report/eolreport/build/pdfreport/rst.py
Normal file
410
doc/eole-report/eolreport/build/pdfreport/rst.py
Normal file
@ -0,0 +1,410 @@
|
||||
# unproudly borrowed from pypy :
|
||||
# http://codespeak.net/svn/pypy/trunk/pypy/tool/rest/rst.py
|
||||
""" reStructuredText generation tools
|
||||
|
||||
provides an api to build a tree from nodes, which can be converted to
|
||||
ReStructuredText on demand
|
||||
|
||||
note that not all of ReST is supported, a usable subset is offered, but
|
||||
certain features aren't supported, and also certain details (like how links
|
||||
are generated, or how escaping is done) can not be controlled
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def escape(txt):
|
||||
"""escape ReST markup"""
|
||||
if not isinstance(txt, str) and not isinstance(txt, unicode):
|
||||
txt = str(txt)
|
||||
# XXX this takes a very naive approach to escaping, but it seems to be
|
||||
# sufficient...
|
||||
for c in '\\*`|:_':
|
||||
txt = txt.replace(c, '\\%s' % (c,))
|
||||
return txt
|
||||
|
||||
class RestError(Exception):
|
||||
""" raised on containment errors (wrong parent) """
|
||||
|
||||
class AbstractMetaclass(type):
|
||||
def __new__(cls, *args):
|
||||
obj = super(AbstractMetaclass, cls).__new__(cls, *args)
|
||||
parent_cls = obj.parentclass
|
||||
if parent_cls is None:
|
||||
return obj
|
||||
if not isinstance(parent_cls, list):
|
||||
class_list = [parent_cls]
|
||||
else:
|
||||
class_list = parent_cls
|
||||
if obj.allow_nesting:
|
||||
class_list.append(obj)
|
||||
|
||||
for _class in class_list:
|
||||
if not _class.allowed_child:
|
||||
_class.allowed_child = {obj:True}
|
||||
else:
|
||||
_class.allowed_child[obj] = True
|
||||
return obj
|
||||
|
||||
class AbstractNode(object):
|
||||
""" Base class implementing rest generation
|
||||
"""
|
||||
sep = ''
|
||||
__metaclass__ = AbstractMetaclass
|
||||
parentclass = None # this exists to allow parent to know what
|
||||
# children can exist
|
||||
allow_nesting = False
|
||||
allowed_child = {}
|
||||
defaults = {}
|
||||
|
||||
_reg_whitespace = re.compile('\s+')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.parent = None
|
||||
self.children = []
|
||||
for child in args:
|
||||
self._add(child)
|
||||
for arg in kwargs:
|
||||
setattr(self, arg, kwargs[arg])
|
||||
|
||||
def join(self, *children):
|
||||
""" add child nodes
|
||||
|
||||
returns a reference to self
|
||||
"""
|
||||
for child in children:
|
||||
self._add(child)
|
||||
return self
|
||||
|
||||
def add(self, child):
|
||||
""" adds a child node
|
||||
|
||||
returns a reference to the child
|
||||
"""
|
||||
self._add(child)
|
||||
return child
|
||||
|
||||
def _add(self, child):
|
||||
if child.__class__ not in self.allowed_child:
|
||||
raise RestError("%r cannot be child of %r" % \
|
||||
(child.__class__, self.__class__))
|
||||
self.children.append(child)
|
||||
child.parent = self
|
||||
|
||||
def __getitem__(self, item):
|
||||
return self.children[item]
|
||||
|
||||
def __setitem__(self, item, value):
|
||||
self.children[item] = value
|
||||
|
||||
def text(self):
|
||||
""" return a ReST string representation of the node """
|
||||
return self.sep.join([child.text() for child in self.children])
|
||||
|
||||
def wordlist(self):
|
||||
""" return a list of ReST strings for this node and its children """
|
||||
return [self.text()]
|
||||
|
||||
class Rest(AbstractNode):
|
||||
""" Root node of a document """
|
||||
|
||||
sep = "\n\n"
|
||||
def __init__(self, *args, **kwargs):
|
||||
AbstractNode.__init__(self, *args, **kwargs)
|
||||
self.links = {}
|
||||
|
||||
def render_links(self, check=False):
|
||||
"""render the link attachments of the document"""
|
||||
assert not check, "Link checking not implemented"
|
||||
if not self.links:
|
||||
return ""
|
||||
link_texts = []
|
||||
# XXX this could check for duplicates and remove them...
|
||||
for link, target in self.links.iteritems():
|
||||
link_texts.append(".. _`%s`: %s" % (escape(link), target))
|
||||
return "\n" + "\n".join(link_texts) + "\n\n"
|
||||
|
||||
def text(self):
|
||||
outcome = []
|
||||
if (isinstance(self.children[0], Transition) or
|
||||
isinstance(self.children[-1], Transition)):
|
||||
raise ValueError, ('document must not begin or end with a '
|
||||
'transition')
|
||||
for child in self.children:
|
||||
outcome.append(child.text())
|
||||
|
||||
# always a trailing newline
|
||||
text = self.sep.join([i for i in outcome if i]) + "\n"
|
||||
return text + self.render_links()
|
||||
|
||||
class Transition(AbstractNode):
|
||||
""" a horizontal line """
|
||||
parentclass = Rest
|
||||
|
||||
def __init__(self, char='-', width=80, *args, **kwargs):
|
||||
self.char = char
|
||||
self.width = width
|
||||
super(Transition, self).__init__(*args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
return (self.width - 1) * self.char
|
||||
|
||||
class Paragraph(AbstractNode):
|
||||
""" simple paragraph """
|
||||
|
||||
parentclass = Rest
|
||||
sep = " "
|
||||
indent = ""
|
||||
# FIXME
|
||||
width = 880
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
# make shortcut
|
||||
args = list(args)
|
||||
for num, arg in enumerate(args):
|
||||
if isinstance(arg, str):
|
||||
args[num] = Text(arg)
|
||||
super(Paragraph, self).__init__(*args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
texts = []
|
||||
for child in self.children:
|
||||
texts += child.wordlist()
|
||||
|
||||
buf = []
|
||||
outcome = []
|
||||
lgt = len(self.indent)
|
||||
|
||||
def grab(buf):
|
||||
outcome.append(self.indent + self.sep.join(buf))
|
||||
|
||||
texts.reverse()
|
||||
while texts:
|
||||
next = texts[-1]
|
||||
if not next:
|
||||
texts.pop()
|
||||
continue
|
||||
if lgt + len(self.sep) + len(next) <= self.width or not buf:
|
||||
buf.append(next)
|
||||
lgt += len(next) + len(self.sep)
|
||||
texts.pop()
|
||||
else:
|
||||
grab(buf)
|
||||
lgt = len(self.indent)
|
||||
buf = []
|
||||
grab(buf)
|
||||
return "\n".join(outcome)
|
||||
|
||||
class SubParagraph(Paragraph):
|
||||
""" indented sub paragraph """
|
||||
|
||||
indent = " "
|
||||
|
||||
class Title(Paragraph):
|
||||
""" title element """
|
||||
|
||||
parentclass = Rest
|
||||
belowchar = "="
|
||||
abovechar = ""
|
||||
|
||||
def text(self):
|
||||
txt = self._get_text()
|
||||
lines = []
|
||||
if self.abovechar:
|
||||
lines.append(self.abovechar * len(txt))
|
||||
lines.append(txt)
|
||||
if self.belowchar:
|
||||
lines.append(self.belowchar * len(txt))
|
||||
return "\n".join(lines)
|
||||
|
||||
def _get_text(self):
|
||||
txt = []
|
||||
for node in self.children:
|
||||
txt += node.wordlist()
|
||||
return ' '.join(txt)
|
||||
|
||||
class AbstractText(AbstractNode):
|
||||
parentclass = [Paragraph, Title]
|
||||
start = ""
|
||||
end = ""
|
||||
def __init__(self, _text):
|
||||
self._text = _text
|
||||
|
||||
def text(self):
|
||||
text = self.escape(self._text)
|
||||
return self.start + text + self.end
|
||||
|
||||
def escape(self, text):
|
||||
if not isinstance(text, str) and not isinstance(text, unicode):
|
||||
text = str(text)
|
||||
if self.start:
|
||||
text = text.replace(self.start, '\\%s' % (self.start,))
|
||||
if self.end and self.end != self.start:
|
||||
text = text.replace(self.end, '\\%s' % (self.end,))
|
||||
return text
|
||||
|
||||
class Text(AbstractText):
|
||||
def wordlist(self):
|
||||
text = escape(self._text)
|
||||
return self._reg_whitespace.split(text)
|
||||
|
||||
class LiteralBlock(AbstractText):
|
||||
parentclass = Rest
|
||||
start = '::\n\n'
|
||||
|
||||
def text(self):
|
||||
if not self._text.strip():
|
||||
return ''
|
||||
text = self.escape(self._text).split('\n')
|
||||
for i, line in enumerate(text):
|
||||
if line.strip():
|
||||
text[i] = ' %s' % (line,)
|
||||
return self.start + '\n'.join(text)
|
||||
|
||||
class Em(AbstractText):
|
||||
start = "*"
|
||||
end = "*"
|
||||
|
||||
class Strong(AbstractText):
|
||||
start = "**"
|
||||
end = "**"
|
||||
|
||||
class Quote(AbstractText):
|
||||
start = '``'
|
||||
end = '``'
|
||||
|
||||
class Anchor(AbstractText):
|
||||
start = '_`'
|
||||
end = '`'
|
||||
|
||||
class Footnote(AbstractText):
|
||||
def __init__(self, note, symbol=False):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class Citation(AbstractText):
|
||||
def __init__(self, text, cite):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class ListItem(Paragraph):
|
||||
allow_nesting = True
|
||||
item_chars = '*+-'
|
||||
|
||||
def text(self):
|
||||
idepth = self.get_indent_depth()
|
||||
indent = self.indent + (idepth + 1) * ' '
|
||||
txt = '\n\n'.join(self.render_children(indent))
|
||||
ret = []
|
||||
item_char = self.item_chars[idepth]
|
||||
ret += [indent[len(item_char)+1:], item_char, ' ', txt[len(indent):]]
|
||||
return ''.join(ret)
|
||||
|
||||
def render_children(self, indent):
|
||||
txt = []
|
||||
buffer = []
|
||||
def render_buffer(fro, to):
|
||||
if not fro:
|
||||
return
|
||||
p = Paragraph(indent=indent, *fro)
|
||||
p.parent = self.parent
|
||||
to.append(p.text())
|
||||
for child in self.children:
|
||||
if isinstance(child, AbstractText):
|
||||
buffer.append(child)
|
||||
else:
|
||||
if buffer:
|
||||
render_buffer(buffer, txt)
|
||||
buffer = []
|
||||
txt.append(child.text())
|
||||
|
||||
render_buffer(buffer, txt)
|
||||
return txt
|
||||
|
||||
def get_indent_depth(self):
|
||||
depth = 0
|
||||
current = self
|
||||
while (current.parent is not None and
|
||||
isinstance(current.parent, ListItem)):
|
||||
depth += 1
|
||||
current = current.parent
|
||||
return depth
|
||||
|
||||
class OrderedListItem(ListItem):
|
||||
item_chars = ["#."] * 5
|
||||
|
||||
class DListItem(ListItem):
|
||||
item_chars = None
|
||||
def __init__(self, term, definition, *args, **kwargs):
|
||||
self.term = term
|
||||
super(DListItem, self).__init__(definition, *args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
idepth = self.get_indent_depth()
|
||||
indent = self.indent + (idepth + 1) * ' '
|
||||
txt = '\n\n'.join(self.render_children(indent))
|
||||
ret = []
|
||||
ret += [indent[2:], self.term, '\n', txt]
|
||||
return ''.join(ret)
|
||||
|
||||
class Link(AbstractText):
|
||||
start = '`'
|
||||
end = '`_'
|
||||
|
||||
def __init__(self, _text, target):
|
||||
self._text = _text
|
||||
self.target = target
|
||||
self.rest = None
|
||||
|
||||
def text(self):
|
||||
if self.rest is None:
|
||||
self.rest = self.find_rest()
|
||||
if self.rest.links.get(self._text, self.target) != self.target:
|
||||
raise ValueError('link name %r already in use for a different '
|
||||
'target' % (self.target,))
|
||||
self.rest.links[self._text] = self.target
|
||||
return AbstractText.text(self)
|
||||
|
||||
def find_rest(self):
|
||||
# XXX little overkill, but who cares...
|
||||
next = self
|
||||
while next.parent is not None:
|
||||
next = next.parent
|
||||
return next
|
||||
|
||||
class InternalLink(AbstractText):
|
||||
start = '`'
|
||||
end = '`_'
|
||||
|
||||
class LinkTarget(Paragraph):
|
||||
def __init__(self, name, target):
|
||||
self.name = name
|
||||
self.target = target
|
||||
|
||||
def text(self):
|
||||
return ".. _`%s`:%s\n" % (self.name, self.target)
|
||||
|
||||
class Substitution(AbstractText):
|
||||
def __init__(self, text, **kwargs):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class Directive(Paragraph):
|
||||
indent = ' '
|
||||
def __init__(self, name, *args, **options):
|
||||
self.name = name
|
||||
self.content = args
|
||||
super(Directive, self).__init__()
|
||||
self.options = options
|
||||
|
||||
def text(self):
|
||||
# XXX not very pretty...
|
||||
txt = '.. %s::' % (self.name,)
|
||||
options = '\n'.join([' :%s: %s' % (k, v) for (k, v) in
|
||||
self.options.iteritems()])
|
||||
if options:
|
||||
txt += '\n%s' % (options,)
|
||||
|
||||
if self.content:
|
||||
txt += '\n'
|
||||
for item in self.content:
|
||||
txt += '\n ' + item
|
||||
|
||||
return txt
|
||||
|
32
doc/eole-report/eolreport/build/style.css
Normal file
32
doc/eole-report/eolreport/build/style.css
Normal file
@ -0,0 +1,32 @@
|
||||
@import url(docutils.css);
|
||||
@import url(default.css);
|
||||
a:link {
|
||||
color: orange;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
a:active {
|
||||
text-decoration: none;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.header {
|
||||
color: orange;
|
||||
background-color: white;
|
||||
padding: 1em;
|
||||
}
|
||||
.footer {
|
||||
color: #666;
|
||||
background-color: inherit;
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
|
12
doc/eole-report/eolreport/inc/00-Redacteur.txt
Normal file
12
doc/eole-report/eolreport/inc/00-Redacteur.txt
Normal file
@ -0,0 +1,12 @@
|
||||
.. container:: rubric
|
||||
|
||||
**Rédacteurs**
|
||||
|
||||
| Gwenaël Rémond (gremond@cadoles.com)
|
||||
| Emmanuel Garette (egarette@cadoles.com)
|
||||
|
||||
**Référence**
|
||||
|
||||
| ``tiramisu/doc/eole-reports``
|
||||
| ``git clone ssh://gitosis@git.cadol.es:2222/tiramisu.git``
|
||||
|
BIN
doc/eole-report/eolreport/inc/eol.png
Normal file
BIN
doc/eole-report/eolreport/inc/eol.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
BIN
doc/eole-report/eolreport/inc/logo.png
Normal file
BIN
doc/eole-report/eolreport/inc/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
BIN
doc/eole-report/eolreport/inc/menjva.gif
Normal file
BIN
doc/eole-report/eolreport/inc/menjva.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
18
doc/eole-report/eolreport/inc/preambule.txt
Normal file
18
doc/eole-report/eolreport/inc/preambule.txt
Normal file
@ -0,0 +1,18 @@
|
||||
.. csv-table::
|
||||
|
||||
.. image:: inc/logo.png, .. image:: inc/eol.png
|
||||
|
||||
.. container:: title
|
||||
|
||||
Rapports de discussions de recherche et développements
|
||||
|
||||
------------
|
||||
|
||||
.. container:: subtitle
|
||||
|
||||
Comparaison ``tiramisu`` et ``Créole``
|
||||
|
||||
.. include:: 00-Redacteur.txt
|
||||
|
||||
|
||||
|
33
doc/eole-report/eolreport/index-report.txt
Normal file
33
doc/eole-report/eolreport/index-report.txt
Normal file
@ -0,0 +1,33 @@
|
||||
.. default-role:: literal
|
||||
|
||||
.. title:: rapports eole
|
||||
|
||||
|
||||
.. image:: imgs/eol.png
|
||||
:align: right
|
||||
|
||||
:date: mai 2012
|
||||
:description: rapports `Créole`, compatibilités `Creole` et `tiramisu`
|
||||
|
||||
|
||||
Vue d'ensemble des rapports
|
||||
===================================
|
||||
|
||||
Les rapports ci-dessous résument et permettent de donner des points d'appui à
|
||||
des discussions de recherche et développement concernant l'évolution du
|
||||
projet `Creole` (comprenant `Creole_Serv`). Il y a aussi le support de
|
||||
documentation développeur `tiramisu` (en anglais) qui constitue une bonne
|
||||
base pour connaître et comprendre plus en détails les motivations de
|
||||
la nouvelle implementation.
|
||||
|
||||
|
||||
* `D01AccesVariables.pdf`_
|
||||
|
||||
* `D02CoherenceVariables.pdf`_
|
||||
|
||||
* `D03ReglesEtats.pdf`_
|
||||
|
||||
.. _`D03ReglesEtats.pdf`: pdfreport/D03ReglesEtats.pdf
|
||||
.. _`D02CoherenceVariables.pdf`: pdfreport/D02CoherenceVariables.pdf
|
||||
.. _`D01AccesVariables.pdf`: pdfreport/D01AccesVariables.pdf
|
||||
|
BIN
doc/eole-report/eolreport/styles.odt
Normal file
BIN
doc/eole-report/eolreport/styles.odt
Normal file
Binary file not shown.
12
doc/eole-report/presentation/Makefile
Normal file
12
doc/eole-report/presentation/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
SRC=$(wildcard *.tex)
|
||||
OBJ=$(subst .tex,.pdf,$(SRC))
|
||||
|
||||
pdf: $(OBJ)
|
||||
|
||||
%.pdf: %.tex
|
||||
pdflatex $<
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ)
|
||||
rm -f *.aux *.log *.toc *.snm *.out *.nav
|
||||
|
69
doc/eole-report/presentation/definition.tex
Normal file
69
doc/eole-report/presentation/definition.tex
Normal file
@ -0,0 +1,69 @@
|
||||
\begin{frame}
|
||||
\frametitle{Comparaison entre le noyau de Créole et Tiramisu}
|
||||
\begin{itemize}
|
||||
\item \emph{Tiramisu} a pour objectif de
|
||||
\begin{itemize}
|
||||
\item remplacer le noyau \emph{Creole} (\texttt{EoleDict}) de manière transparente ;
|
||||
\item résoudre les problèmes inhérents à \texttt{CreoleServ} ;
|
||||
\end{itemize}
|
||||
\item au niveau du code, il y a enfin une vraie séparation du c\oe ur et du fonctionnel ;
|
||||
\item valide le type \emph{et la structure}, l'ajout de types est aisé.
|
||||
\item \emph{Creole} : \texttt{EoleDict, EoleVars} $ \Leftrightarrow $ \texttt{Config, Option}\\
|
||||
cf \texttt{tiramisu/doc/build/pydoc/index.html}
|
||||
\item intégré à \texttt{gen\_config}, \texttt{cheetah}, \texttt{DTD Creole}, syntaxe \texttt{Creole} \dots
|
||||
\item \texttt{eole-report/D02CoherenceVariables.pdf}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gestionnaire de configuration existants}
|
||||
\begin{itemize}
|
||||
\item Le gestionnaire de conf de Victor Stinner $\Rightarrow$ \emph{NuFw};
|
||||
\item puppet, cfgengine... $\Rightarrow$ intéressant, de nombreux comportements peuvent être repris, mais tel quel difficilement compatible avec \emph{Creole};
|
||||
\item \emph{Creole} $\Leftrightarrow$ \texttt{tiramisu/doc/build/glossary.html}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Un "vrai" serveur de config}
|
||||
\begin{itemize}
|
||||
\item un serveur de données de configuration ;
|
||||
\item $1^{ere}$ méthode : exportation (snapshot) d'un état de la config $ \Rightarrow $ Créole ;
|
||||
\item $2^{eme}$ méthode : JIT (just in time) calculation, une modification
|
||||
de l'état de la configuration est possible \emph{pendant} la manipulation et l'utilisation de la conf $ \Rightarrow $ Tiramisu.
|
||||
\item \texttt{doc/getting-started.html}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Qu'est-ce qu'un gestionnaire de conf moderne ?}
|
||||
\begin{itemize}
|
||||
\item c'est une organisation arborescente des données (les données sont imbriquées) ;
|
||||
\item c'est un accès facile aux données (typiquement une interface de type \emph{dictionnaire}) ;
|
||||
\item clefs-valeurs, mais quelles valeurs exactement ? $ \Rightarrow $ calcul JIT (just in time) ;
|
||||
\item \texttt{eole-report/D01AccesVariables.pdf}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Définition d'un gestionnaire de configuration}
|
||||
\begin{itemize}
|
||||
\item les families, groups, master \dots~ ce sont des \emph{schémas} de données (\texttt{OptionDescription}) ;
|
||||
\item c'est la configuration (\texttt{Config}) qui est responsable de l'accès aux valeurs ;
|
||||
\item la configuration est aisément manipulable, et a un point d'entrée unique ;
|
||||
\item l'accès aux valeurs des \texttt{Options} de configuration ne peut se faire \emph{que} depuis la conf racine.
|
||||
\item \texttt{eole-report/D01AccesVariables.pdf}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Organisation en espace de nommage}
|
||||
\begin{itemize}
|
||||
\item dans \emph{tiramisu} l'accent est mis sur l'organisation arborescente des données ;
|
||||
\item la validation des options de configuration se fait par l'appartenance aux groupes (families, master/slaves \dots) ;
|
||||
\item l'organisation en groupes est unifiée par l'espace de nommage ;
|
||||
\item \texttt{eole-report/D03ReglesEtats.pdf}
|
||||
\item lisibilité d'une config : \texttt{tiramisu/report/build/index.html} rapport html d'une config
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
61
doc/eole-report/presentation/statut.tex
Normal file
61
doc/eole-report/presentation/statut.tex
Normal file
@ -0,0 +1,61 @@
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Etats ("status") de la configuration}
|
||||
\begin{itemize}
|
||||
\item système d'états de la configuration par \emph{droits d'accès} ;
|
||||
\item \texttt{read write}, \texttt{read only} ;
|
||||
\item correspond à \texttt{freeze}, \texttt{hidden}, \texttt{disabled} \dots ;
|
||||
\item \texttt{doc/status.html} ;
|
||||
\item \texttt{eole-report/D03ReglesEtats.pdf} ;
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{hidden if in, hidden if not in}
|
||||
\begin{itemize}
|
||||
\item les hidden if in, disabled if, \dots sont généralisés
|
||||
\item dans tiramisu, ce sont des pré-requis sur une (des) variables
|
||||
\item \texttt{eole-report/D03ReglesEtats.pdf}
|
||||
\item \texttt{doc/consistency.html}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{un peu de mathématiques : prévenir les deadlocks}
|
||||
\begin{itemize}
|
||||
\item sûreté : prévention des deadlocks ;
|
||||
\item dans tiramisu, le modèle est suffisamment abstrait pour que son exploitation mathématique soit
|
||||
réalisable par les techniques de \emph{Model Checking} ;
|
||||
\item soit on a besoin de ne connaître que l'ensemble des états, pas leurs liens $\Rightarrow$ espace d'états ;
|
||||
\item soit on a besoin de connaître toutes les relations $\Rightarrow$ graphe d'accessibilité ;
|
||||
\item la configuration est modélisable en une structure de \emph{Kripe} ;
|
||||
\item déjà le parsing de la conf est facile, la preuve : \texttt{tiramisu/report/build/index.html}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{un peu de mathématiques (suite) CreoleLint}
|
||||
\begin{itemize}
|
||||
\item exemple : $ P = 3 \wedge Q = 1 \triangleleft \langle P = 1 \hookleftarrow Q = 0 \rangle$
|
||||
\item la propriété \og dans aucun état on a $P = 3$ et $Q = 1$ \fg~ est-elle vraie ?
|
||||
Pour vérifier cette propriété, on a besoin de connaître l'espace d'états ;
|
||||
\item la propriété \og chaque chemin débutant dans un état accessible $P=1$ passe par un état où $Q=3$ et $P=2$ \fg~
|
||||
est-elle vraie ? Cela demande de connaître le graphe d'accessibilité ;
|
||||
\item les structures de \emph{Kripe} sont des machines à états étiquetées par les valuations de toutes les variables propositionnelles ;
|
||||
\item une compliation statique devient possible dans \emph{CreoleLint} \dots
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{compatibilité Créole : ce qui reste à faire}
|
||||
\begin{itemize}
|
||||
\item les options spéciales sont implémentées (auto, fill, obligatoire, \dots) reste la librairie des fonctions pour les variables automatiques \texttt{eosfunc} ;
|
||||
\item tous les états sont implémentés (hidden, disabled, mode (normal/expert), \dots), il faut fixer les comportement \texttt{read write} ;
|
||||
\item les "valprec" (valeur précédentes) et une mémoire de \emph{tous} les états antérieurs ;
|
||||
\item fixer les comportement des hides (sous-groupes récursifs, \dots) ;
|
||||
\item validations master/slaves, validations globales au regard de la configuration entière puisque c'est possible maintenant.
|
||||
\end{itemize}
|
||||
|
||||
\end{frame}
|
||||
|
||||
|
36
doc/eole-report/presentation/tiramisu.tex
Normal file
36
doc/eole-report/presentation/tiramisu.tex
Normal file
@ -0,0 +1,36 @@
|
||||
%%presentation
|
||||
\documentclass{beamer}
|
||||
\usepackage{beamerthemetree}
|
||||
%%impression
|
||||
%\documentclass[a4paper,9pt]{extarticle}
|
||||
%\usepackage{beamerarticle}
|
||||
%%
|
||||
|
||||
% class FR
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[frenchb]{babel}
|
||||
|
||||
% image
|
||||
%% \usepackage{graphicx}
|
||||
\usepackage{alltt}
|
||||
\usecolortheme{crane}
|
||||
\beamertemplatetransparentcovered
|
||||
%\logo{\includegraphics[height=1cm]{ban.png}}
|
||||
|
||||
\title{Tiramisu}
|
||||
\subtitle{gestionnaire de configuration}
|
||||
\author{Gwen}
|
||||
\institute{\texttt{git clone git://git.labs.libre-entreprise.org/tiramisu.git} \\
|
||||
\texttt{firefox tiramisu/doc/build/index.html}}
|
||||
|
||||
\date{\today}
|
||||
|
||||
\begin{document}
|
||||
\frame{\titlepage}
|
||||
|
||||
\include{definition}
|
||||
\include{statut}
|
||||
|
||||
\end{document}
|
||||
|
Reference in New Issue
Block a user