everything in src for packaging purposes

This commit is contained in:
gwen
2012-07-13 09:40:48 +02:00
parent 3411efc873
commit ddef37ed2a
54 changed files with 6071 additions and 0 deletions

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

View 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

View 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")
>>>

View 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/$@

View File

@ -0,0 +1,6 @@
.PHONY: clean
.SUFFIXES:
clean:
rm -f *.html
rm -f api/*.html

View 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 ;
}

View 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 }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

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

View 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())

View 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

View 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%;
}

View 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``

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View 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

View 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

Binary file not shown.

View 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

View 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}

View 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}

View 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}