Commit Graph

462 Commits

Author SHA1 Message Date
9f903d3e04 add username's option 2014-03-06 22:09:12 +01:00
gwen
f3a826a8d7 Merge branch 'master' of ssh://git.labs.libre-entreprise.org/gitroot/tiramisu 2014-02-25 16:19:49 +01:00
gwen
0c9d6554ae a hostname shall not start with a number 2014-02-25 15:20:03 +01:00
gwen
716d2b2348 allows a DomainnameOption to start with a number 2014-02-25 15:16:15 +01:00
d5b83c123c tiramisu/setting.py : properties store in cache was a reference to a list modified in validation, should copy properties in cache 2014-02-20 16:55:35 +01:00
bf0501b1d6 tiramisu/setting.py : properties store in cache was a reference to a list modified in validation, should copy properties in cache 2014-02-20 14:27:29 +01:00
fc7f3c24a5 properties option in consistencies are now allowed
Conflicts:
	tiramisu/option.py (PortOption._validate): Strange try/except
	removed.
2014-02-17 17:45:37 +01:00
194c82faad tests pass now with dictionary and sqlalchemy storage 2014-02-16 23:37:27 +01:00
0aeb64731b comment state test 2014-02-06 22:25:04 +01:00
21c8ed5d76 Merge branch 'master' into orm
Conflicts:
	test/test_option_consistency.py
	test/test_state.py
	tiramisu/option.py
2014-02-06 22:24:50 +01:00
e7531e1fda more tests 2014-02-06 22:17:20 +01:00
72f06bc29d properties option in consistencies are now allowed 2014-02-06 19:19:48 +01:00
Daniel Dehennin
f8ac263c86 Hotfix release 1.0~2.4.1
-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iF4EABEKAAYFAlLyBpcACgkQWjgIUPVihwwhyQD/Ri/R6wO/zk49ILx5UzPdDDcU
 UCWxsKvbCIloO76BMcIA/0nx/6PUVc/v3iag5reNvtrXJQzdKlprmkjvBhLalVJS
 =w09x
 -----END PGP SIGNATURE-----

Merge tag 'release/1.0_2.4.1'

Hotfix release 1.0~2.4.1
2014-02-05 11:22:17 +01:00
6f5d471db1 if option with requires has a property, calculated properties are store in storage 2014-02-05 10:37:39 +01:00
98bd35ad36 Merge branch 'master' into orm
Conflicts:
	tiramisu/config.py
	tiramisu/option.py
2014-02-04 21:54:30 +01:00
c52b2f84f4 if option with requires has a property, calculated properties are store in storage 2014-02-04 21:40:07 +01:00
a067d2cdd9 add some tests 2014-02-04 21:14:30 +01:00
5646fc35a2 Merge branch 'master' into orm
Conflicts:
	test/test_parsing_group.py
2014-02-03 22:11:58 +01:00
8d10ad4002 add tests 2014-02-02 22:47:46 +01:00
5897231421 Merge branch 'master' into orm
Conflicts:
	test/test_dereference.py
	test/test_state.py
	tiramisu/config.py
	tiramisu/value.py
2014-02-02 18:52:13 +01:00
26158fc3c4 update test for metaconfig serialization 2014-02-02 18:33:21 +01:00
f8faec408f Merge branch 'master' into metaconfig 2014-02-02 18:21:22 +01:00
ced260046c test for multi 2014-02-02 18:21:09 +01:00
683e40fbb5 when change len of calculated master, change len of slave too 2014-02-02 18:20:01 +01:00
8709386570 __getattr__ OD 2014-02-01 18:35:18 +01:00
2f40216fad Merge branch 'master' into orm 2014-02-01 17:25:39 +01:00
71b235551e add tests for find() 2014-02-01 17:25:31 +01:00
cddeef0990 Merge branch 'master' into orm 2014-02-01 16:49:29 +01:00
f48f3e7544 add tests for find() 2014-02-01 16:49:16 +01:00
313b03b246 cache in sql works 2014-02-01 16:26:23 +01:00
02a987b39d sqlalchemy 2014-01-30 22:55:15 +01:00
2eb63c917b active callback's slave verification 2014-01-28 09:14:56 +01:00
7c8049a8d0 Merge branch 'master' into orm 2014-01-27 23:28:43 +01:00
a1dd2cfce7 require works well in sqlalchemy storage 2014-01-27 17:16:05 +01:00
gwen
9deb67f887 warning and error messages not translated in the tests 2014-01-27 14:55:53 +01:00
880b6366eb Merge branch 'master' into orm
Conflicts:
	tiramisu/setting.py
2014-01-25 16:39:32 +01:00
138018dfe9 if we delete all reference to a Config and we have reference to old SubConfig, Values, Multi or Settings, make a ConfigError instead of AttributError on NoneType object 2014-01-25 11:20:11 +01:00
3b3e5216fe cache 2014-01-25 10:15:25 +01:00
661f844ce6 sqlalchemy has a storage 2014-01-20 14:53:14 +01:00
068f68460d Merge branch 'master' into orm 2014-01-18 10:25:09 +01:00
9d92ab84d7 regression: permissive for option is apply every time, not only when global permissive is set 2014-01-16 09:49:37 +01:00
cde04d654a Merge branch 'master' into orm
Conflicts:
	tiramisu/setting.py
2014-01-09 20:32:17 +01:00
gwen
3c36e05d82 adds test for an API 2014-01-06 14:40:29 +01:00
64ca069a0b Merge branch 'master' into orm
Conflicts:
	test/test_config.py
	tiramisu/autolib.py
	tiramisu/option.py
	tiramisu/value.py
2013-12-12 17:50:42 +01:00
c58de18b62 add more tests 2013-12-09 18:56:29 +01:00
73745be440 Important behavior change : to add default_multi value, now use Multi.append(), not Multi.append(None) 2013-12-09 17:59:39 +01:00
bb1f6947e3 better name's validation 2013-12-09 17:55:52 +01:00
6e4f19eebe more tests 2013-12-09 15:43:45 +01:00
0f966f6d26 check if permissive is in global properties before allow permissive for an option 2013-12-09 15:29:37 +01:00
20bef5ff04 Important behavior change in callback with multi.
Before, tiramisu iterable multi's callback_params in all cases.
Now, this append only if multi's callback_params are in master/slave group.
2013-12-09 15:08:14 +01:00
gwen
029452ccbc validation of an ip if an ip term starts with a zero 2013-12-02 15:10:05 +01:00
374c56a9c8 first version with sqlalchemy option's storage 2013-11-23 23:34:17 +01:00
eb3327cd75 correction in allow_without_dot + test 2013-10-01 10:13:17 +02:00
6902ad4f18 some extra tests for filename 2013-10-01 08:23:10 +02:00
2dcdbb137e rename FileOption to FilenameOption
python 3 support
2013-10-01 08:19:10 +02:00
0a83a9261f update invalid's message and display all informations when raises 2013-09-30 22:56:08 +02:00
cce080cbd3 add FileOption 2013-09-30 21:21:47 +02:00
1a294e3d09 refactor DomainnameOption
add options EmailOption and URLOption
2013-09-30 19:41:56 +02:00
feeb9842f5 serialize metaconfig/groupconfig 2013-09-30 16:22:08 +02:00
6b7db20716 Merge branch 'master' into metaconfig 2013-09-28 22:49:50 +02:00
70f684e70c tiramisu/option.py:
separate _consistencies (for Option) and _cache_consistencies (for OptionDescription)
  _launch_consistency need index for multi's option
  _cons_not_equal support multi options

tiramisu/value.py:
  Multi._validate support consistency
2013-09-28 17:05:01 +02:00
482dfec7f2 consistancies can have more than one option
add _cons_broadcast
2013-09-27 23:27:08 +02:00
gwen
2490d00935 refactor name only_private 2013-09-27 11:28:23 +02:00
gwen
162ae02df8 refactor (warnings_only) 2013-09-27 09:52:18 +02:00
f4677b9ef9 use warnings instead of a new dictionary 2013-09-26 21:56:06 +02:00
f040d3da61 warning is now a dict 2013-09-26 18:35:20 +02:00
e63dbf308d more tests for warnings 2013-09-26 09:31:51 +02:00
329b9ac349 add _second_level_validation (second's one return only warning almost _validator raise) 2013-09-25 21:10:45 +02:00
06baff2f3b add warning ability 2013-09-24 23:19:20 +02:00
3fc89be40e comment tiramisu/autolib.py + some modification 2013-09-23 22:40:10 +02:00
ff7714d8d3 add find test value in a multi's option 2013-09-22 21:31:37 +02:00
c84d13a1c6 we can serialize Config now 2013-09-22 20:57:52 +02:00
972dff0a1c serialize new callback 2013-09-20 23:47:40 +02:00
ae4df32d0e error if change slave len for default's slave option 2013-09-19 23:02:15 +02:00
28c416dd84 add allow_reserved in IPOption 2013-09-19 21:51:55 +02:00
90ae9aa70d refactore carry_out_calculation + test + documentation 2013-09-19 21:39:41 +02:00
866364059c dont change anything if config_error 2013-09-17 09:10:08 +02:00
7165f73292 add metaconfig 2013-09-17 09:02:10 +02:00
57f4dd8d3f allow mandatory value (see 9ddf100118 for more details) 2013-09-16 20:51:13 +02:00
9ddf100118 when we get an option's value, we need it's values to calculate properties (ie for mandatory's option)
if a disabled option has a callback to an other disabled value, it's raise ConfigError

now only raise if option has no other propertiesError
2013-09-16 15:07:34 +02:00
3dc72c505c support no expire in getcache 2013-09-07 22:37:13 +02:00
77c1ccf40b add 'cache' property 2013-09-07 17:25:22 +02:00
f8b0a53c3f cache is always a dictionary in memory 2013-09-07 10:31:39 +02:00
22bfbb9fa4 storage no more in setting.py, code is now in storage/__init__.py 2013-09-06 23:15:36 +02:00
3b733d1b4f support cache consistencies + no consistencies for a symlink + test 2013-09-03 22:41:18 +02:00
aeeaf6ec14 impl_get_information and impl_set_information are, now, persistent in storage 2013-09-03 10:38:38 +02:00
f106f3ced7 cannot set properties if those properties are in requirement 2013-09-02 19:47:00 +02:00
4636a977cc requirements: calculate all requirements for an option 2013-09-02 17:13:43 +02:00
gwen
52a6705fbf new logo for the tiramisu project 2013-09-02 16:27:22 +02:00
5893f8ad72 attributes in Option are now read-only if option set in Config (_name is everytime read-only) 2013-08-30 21:15:55 +02:00
c01f14920d test more sloted options 2013-08-30 09:40:28 +02:00
eb62d0c4a4 add test for impl_get_path_by_opt and impl_get_opt_by_path 2013-08-29 09:29:28 +02:00
8aa4260404 test force_default_on_freeze with multi and correction in Multi() 2013-08-28 22:50:35 +02:00
8c24903dfb order in properties can change 2013-08-28 21:23:42 +02:00
gwen
fbf05ba5e4 python 3 compatibility
remove __eq__ and __ne__ in Option
2013-08-28 21:13:42 +02:00
71a8171c52 add tests for persistent mode 2013-08-27 22:08:35 +02:00
3be005e82e add test test/test_dereference.py + memoryleaks in optiondescription's cache 2013-08-27 21:36:52 +02:00
gwen
a894a5e27b rename API add_owner -> addowner 2013-08-27 16:12:53 +02:00
acd27fb56c huge use of weakrefs to remove memoryleaks due to circular references 2013-08-27 11:39:32 +02:00
36def6533f store session in dictionary storage 2013-08-27 09:46:52 +02:00
gwen
551b9fb1e3 getting stated documentation 2013-08-26 17:14:14 +02:00
36ed6f874f add some tests for values
cannot use __setitem__ to set value for an option
in append, len should not greater than master option
2013-08-25 18:06:07 +02:00
f482737a47 add test to known if has a value + some corrections 2013-08-24 23:10:35 +02:00
e6a183c00d test get_modified_values 2013-08-24 22:54:02 +02:00
e4c129efc5 getowner need now an option 2013-08-24 22:32:54 +02:00
4c27cb586d in __setattr__, name should never be object's variable name
remove context in type_ find's option
find_first_context return AttributError if no results
2013-08-24 21:26:10 +02:00
c2b16d2605 add _path in reset for performance + more tests 2013-08-24 16:30:46 +02:00
62553aba1f test invalid owner in setowner 2013-08-23 09:29:42 +02:00
ac62931525 add test for recursive path in requirement 2013-08-22 22:57:32 +02:00
04aa4e6bf1 never same calculated properties has properties (only in cache) 2013-08-22 22:48:09 +02:00
gwen
3d67e35447 documentation on the tests 2013-08-22 12:17:10 +02:00
b6bb685ca5 key is now always path and change opt by path dictionary storage 2013-08-21 22:21:50 +02:00
e826f3d1c6 we can personalise storage easily 2013-08-20 09:47:12 +02:00
df7d6759cd add sqlite plugin 2013-08-19 11:01:21 +02:00
de44daafeb - can reset directly custom settings for an option: setting[option].reset()
- option properties are now tuple in internal, and change it to set when needed (that coping data)
2013-07-13 10:42:10 +02:00
1c951558da add new option's type: PortOption 2013-07-11 23:05:33 +02:00
c06659012b Config: __str__ raise if no str/unicode value 2013-07-03 21:56:31 +02:00
0afb521766 support multi requirement with inverse for same option 2013-07-03 15:04:15 +02:00
9b134c3aa7 requirement are now a dictionary (not anymore a tuple) 2013-06-29 18:41:14 +02:00
e501c6d12d support multi requires with inverse set to True 2013-06-28 11:59:51 +02:00
75f7e7ce5d callback with option in params which is in an hidden optiondescription 2013-06-26 16:26:42 +02:00
23f6d2228f add symlink test 2013-06-13 22:07:58 +02:00
4d15c91383 symlink support for getowner and raise if option in master/slave 2013-06-13 22:06:49 +02:00
c2471320c3 apply_requires: add property if any property raise PropertyError if same_action is False 2013-06-13 14:43:51 +02:00
755b2312c2 allow None in requirement 2013-06-13 12:15:46 +02:00
fd02a954ca add sort, reverse, insert and extend in Multi 2013-06-12 22:48:22 +02:00
0d114001f4 Works callback/multi/master-slave
- in multi, never modify _default value
- _reset slave when _reset master
- if append None in master with callback return not a list, replace None by the value
- list support in slave
2013-06-12 10:22:50 +02:00
ada5bfbf6c add test for callback not in multi 2013-06-11 15:36:08 +02:00
6d1cf308b2 Better support for slave with callback:
- callback must return single value, not a list
- if default value, append slave values with master len
- if not default and append, set default value
2013-06-11 15:12:31 +02:00
gwen
1c70a07d7e transitivity in the requirements 2013-06-10 15:19:00 +02:00
2751a2694a RequirementRecursiveError => RequirementError
Properties in "apply_requires" are now transitive (but only if tested property is in properties list)
New requirement option (a boolean), don't touch properties if PropertyError in "apply_requires"
2013-05-31 23:30:00 +02:00
1d8c248d1b Multi: don't touch slave's value if it's default one's + don't check slave properties (if, for example, disabled for example) 2013-05-21 11:09:09 +02:00
536eb27904 multi, None and validation 2013-05-10 22:34:07 +02:00
fa5d643aee tiramisu/autolib.py: optimpl_ => impl_
tiramisu/option.py: consistency simplication and allow multi
tiramisu/option.py: don't touch cache if force_permissive or force_properties
tiramisu/values.py: set validate paramaters in Multi()
2013-05-10 15:10:06 +02:00
6ffd71a43e DomainnameOption now works with default value 2013-05-10 09:27:54 +02:00
6de65859b4 * config herite from BaseInformation class
* _cfgimpl_ => _impl_
* optimpl_ => impl_
* properties/permissives are now set/frozenset
* validation raise ValueError if not valid, didn't return anything otherwise
* consistencies are now validate in setting and when deleting value
* ip/network with netmask consistency now works
* DomainnameOption now works
* if no validation, don't set cache for value
* symlinkoption: remove path (not used)
2013-05-08 18:14:42 +02:00
1b29793e0f compare option 2013-05-05 21:43:19 +02:00
2d57ed160e work on MetaConfig 2013-05-02 11:34:57 +02:00
2c5bbb7bc0 Requires need option, not path
Valid requires
2013-04-26 14:40:44 +02:00
f0ef1734f4 add a test for force_store_value in read_only mode 2013-04-23 19:01:03 +02:00
7cd44d6886 remove an unused callback in test 2013-04-23 11:41:16 +02:00
e883e5b89e remove _setoption in SymLinkOption
objimpl_ => optimpl_
ConflictConfigError => ConflictError
add read_write/read_only/getowner in Config
2013-04-22 09:19:05 +02:00
682d9fe207 add option name's validation and rename Option method with objimpl_ 2013-04-20 21:58:52 +02:00
d4ef47759e Manipulate properties is now more convenient:
c.cfgimpl_get_settings().has_property('hidden') => 'hidden' in c.cfgimpl_get_settings()
c.cfgimpl_get_settings().has_property('hidden', option1) => 'frozen' in c.cfgimpl_get_settings()[opt]

c.cfgimpl_get_settings().get_properties(option1) => c.cfgimpl_get_settings()[option1]
c.cfgimpl_get_settings().get_properties(option1) => c.cfgimpl_get_settings()[option1]

c.cfgimpl_get_settings().add_property('hidden', option1) => c.cfgimpl_get_settings()[optiont1].append('hidden')
c.cfgimpl_get_settings().del_property('hidden', option1) => c.cfgimpl_get_settings()[optiont1].remove('hidden')

c.cfgimpl_get_settings().enable_property('hidden') => c.cfgimpl_get_settings().append('hidden')
c.cfgimpl_get_settings().disable_property('hidden') => c.cfgimpl_get_settings().remove('hidden')
2013-04-20 17:30:05 +02:00
54fe8d0f4b cache for properties is now in get_properties and not for validate_properties 2013-04-20 11:25:14 +02:00
d7b5d9dc16 add SlaveError for slave's length 2013-04-19 20:23:34 +02:00
e08bd93cd8 all multi gestion is now in Multi 2013-04-18 23:06:14 +02:00
324c3d2cf6 * to "reset" a value, now you just have to delete it
config.unwrap_from_path("string").reset(config) => del(config.string)
* add cache for value/setting to 5 secds
to "reset" cache just do: config.cfgimpl_clean_cache()
* can desactivate cache by removing "expire" property
2013-04-18 20:26:40 +02:00
d5e1cb6576 pass force_properties to value's _setitem and remove config's setoption 2013-04-17 23:19:53 +02:00
5e67522f91 _empty is u'' for UnicodeOption 2013-04-17 22:06:10 +02:00
80438b1495 Rename AmbigousOptionError as ConflictOptionError 2013-04-17 21:50:31 +02:00
3170237c8e properties validation not in setting and now launch when modify multi 2013-04-17 21:33:34 +02:00
656b751995 mandatory is a true property (no more MandatoryError) + tests 2013-04-16 22:44:16 +02:00
9357b342c1 review exception 2013-04-14 12:01:32 +02:00
9c2dcc164c attribute in Option now starts with '_'
add ValidateError
add consistancies in Option
remove byattr in find
2013-04-13 22:50:55 +02:00
26568dc45a Values validate now value 2013-04-11 11:30:58 +02:00
67e67a5020 NoValueReturn is not needed now + apply_requires is now in settings 2013-04-08 16:05:56 +02:00
d100d66548 tiramisu/config.py can specify return type for find ('option', 'value', 'path') and remove get
user need replace config.get(value) by config.find(byname="value", type_='value')
2013-04-05 12:20:33 +02:00
e9902d8ce2 rewrite make_dict 2013-04-04 11:24:00 +02:00
gwen
e75d6abad1 test_option_has_an_api_name temporarily disabled 2013-04-03 16:01:53 +02:00
e6f00948f3 optimisations and all is properties 2013-04-03 12:20:26 +02:00
gwen
ccf75aac89 tests for get_home_by_paths 2013-03-15 09:24:43 +01:00
gwen
df3753c36b finally a getvalue without a getattr 2013-02-27 11:09:13 +01:00
gwen
eb632c002d option names shall be valid names 2013-02-25 16:06:10 +01:00
gwen
7b4f3b5d36 option's name shall not have an api's method name 2013-02-25 11:33:20 +01:00
gwen
e6d5d349c8 refactoring values 2013-02-21 17:07:00 +01:00
gwen
a8e6bac87f refactoring, the values are in an OptionValues object 2013-02-08 11:50:22 +01:00
gwen
9259a6e3f7 values are in value objects now 2013-02-07 16:20:21 +01:00
gwen
29914051e0 master groups that have multis 2013-02-06 17:19:56 +01:00
gwen
a404c4c992 masters shall have the same names as groups 2013-02-06 16:21:30 +01:00
gwen
6a3b7102b5 adds a freeze_everything possibility 2013-02-06 14:59:24 +01:00
gwen
e2a02c5b7a find raises an exception if no option found Fixes #4721 2013-01-28 09:55:51 +01:00
gwen
ca2f4487dd add owner 2012-12-10 14:38:25 +01:00
gwen
cd50cf7551 owners are *real* objects now 2012-12-10 14:10:05 +01:00
gwen
e118f07539 groupe_types are real types now 2012-12-06 18:14:57 +01:00
gwen
9736298ba2 tests on groups/masters allowed groups 2012-12-06 15:19:43 +01:00
gwen
7784a82cde tests on group types 2012-12-05 09:41:53 +01:00
gwen
d633574cc5 comparison failed 2012-12-03 15:48:04 +01:00
gwen
e13fec23fe doc for the settings 2012-11-19 16:48:47 +01:00
gwen
86f9096937 settings are in a separate object 2012-11-19 10:45:03 +01:00
gwen
eb7e393864 the value owner is a string now 2012-11-15 10:55:14 +01:00
gwen
09dba4b959 suppression of the override 2012-11-12 12:06:58 +01:00
gwen
bfb5045753 test mandatory 2012-11-06 15:19:36 +01:00
gwen
b3da043190 trimming options's callbacks 2012-10-15 15:06:41 +02:00
gwen
0bd7624eea find method in config filters by attrs 2012-10-12 11:35:07 +02:00
gwen
aa67ae31aa find method in config 2012-10-11 16:16:43 +02:00
gwen
8ca58c508d __dir__ deleted 2012-10-05 11:02:58 +02:00
gwen
b2e97573bd tests on frozen and None value 2012-09-19 09:31:02 +02:00
gwen
c70fc04f3a has_callback options cannot be overrided 2012-09-18 15:25:35 +02:00
gwen
e2bcac1c01 mandatory or type error raised 2012-09-12 10:38:41 +02:00
gwen
d8370b008b commented code for unicity by name 2012-08-16 11:42:24 +02:00
gwen
bf0dcbe2c8 replace special_owner with hascallback_and_freeze 2012-08-14 10:55:08 +02:00
gwen
11b2edd07d Option.force_default() -> opt value returns the default value 2012-08-13 16:06:02 +02:00
gwen
753b0a55c7 opt.hidden and opt.disabled is replaced by opt.properties 2012-08-13 12:49:58 +02:00
gwen
5ee7247e52 suppression of the notion of normal and expert mode 2012-08-13 10:51:52 +02:00
gwen
d05feb78f9 suppression of the notion of normal and expert mode 2012-08-13 09:32:33 +02:00
gwen
45ff59aea2 tests are passing again after package renaming 2012-07-23 14:52:08 +02:00
gwen
e3b379b974 ready for debian packaging now 2012-07-13 11:22:00 +02:00
gwen
9aa9d9780a everything in src for packaging purposes 2012-07-13 09:42:14 +02:00
gwen
d1f97ca50f everything in src for packaging purposes 2012-07-13 09:37:25 +02:00
gwen
736a1c77b6 add getowner method 2012-07-11 15:31:59 +02:00
gwen
4ec7dff6c4 value None in multi values 2012-07-11 12:30:45 +02:00
gwen
bd9d98fcc6 None and [] are both possible 2012-07-10 16:46:30 +02:00
gwen
a80b868cae default value if option is set to None 2012-07-10 15:15:35 +02:00
gwen
166ffc72f7 default value if option is set to None 2012-07-10 14:36:09 +02:00
gwen
10df0e1cd1 value owners can be lists 2012-07-09 17:34:39 +02:00
gwen
9f184d54c3 add type list for value owners 2012-07-09 11:27:51 +02:00
gwen
b008f31e27 came prepared for setitem tests 2012-07-08 21:15:59 +02:00
gwen
f3a9a96714 possibility to have a default as multi 2012-06-29 11:48:03 +02:00
gwen
97b000bf1d possibility to reset a value 2012-06-29 10:46:44 +02:00
gwen
99b117e838 possibility to reset a value 2012-06-29 10:46:12 +02:00
gwen
8b16814ab4 first revision 2012-05-13 20:48:51 +02:00