Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.buildout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
isaak yansane-sisk
slapos.buildout
Commits
13e25f38
Commit
13e25f38
authored
May 02, 2012
by
Vincent Pelletier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'serialisation'
parents
2c0abccb
01e63a63
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
60 additions
and
5 deletions
+60
-5
src/zc/buildout/buildout.py
src/zc/buildout/buildout.py
+60
-5
No files found.
src/zc/buildout/buildout.py
View file @
13e25f38
...
@@ -36,6 +36,7 @@ import tempfile
...
@@ -36,6 +36,7 @@ import tempfile
import
UserDict
import
UserDict
import
warnings
import
warnings
import
subprocess
import
subprocess
import
pprint
import
zc.buildout
import
zc.buildout
# Workaround for https://bugzilla.osafoundation.org/show_bug.cgi?id=13033
# Workaround for https://bugzilla.osafoundation.org/show_bug.cgi?id=13033
# M2Crypto breaks https links
# M2Crypto breaks https links
...
@@ -49,6 +50,60 @@ except ImportError:
...
@@ -49,6 +50,60 @@ except ImportError:
import
zc.buildout.download
import
zc.buildout.download
import
zc.buildout.easy_install
import
zc.buildout.easy_install
class
BuildoutSerialiser
(
object
):
# XXX: I would like to access pprint._safe_repr, but it's not
# officially available. PrettyPrinter class has a functionally-speaking
# static method "format" which just calls _safe_repr, but it is not
# declared as static... So I must create an instance of it.
_format
=
pprint
.
PrettyPrinter
().
format
_dollar
=
'
\
\
x%02x'
%
ord
(
'$'
)
_semicolon
=
'
\
\
x%02x'
%
ord
(
';'
)
_safe_globals
=
{
'__builtins__'
:
{
# Types which are represented as calls to their constructor.
'bytearray'
:
bytearray
,
'complex'
:
complex
,
'frozenset'
:
frozenset
,
'set'
:
set
,
# Those buildins are available through keywords, which allow creating
# instances which in turn give back access to classes. So no point in
# hiding them.
'dict'
:
dict
,
'list'
:
list
,
'str'
:
str
,
'tuple'
:
tuple
,
}}
def
loads
(
self
,
value
):
return
eval
(
value
,
self
.
_safe_globals
)
def
dumps
(
self
,
value
):
value
,
isreadable
,
_
=
self
.
_format
(
value
,
{},
0
,
0
)
if
not
isreadable
:
raise
ValueError
(
'Value cannot be serialised: %s'
%
(
value
,
))
return
value
.
replace
(
'$'
,
self
.
_dollar
).
replace
(
';'
,
self
.
_semicolon
)
SERIALISED_VALUE_MAGIC
=
'!py'
SERIALISED
=
re
.
compile
(
SERIALISED_VALUE_MAGIC
+
'([^!]*)!(.*)'
)
SERIALISER_REGISTRY
=
{
''
:
BuildoutSerialiser
(),
}
SERIALISER_VERSION
=
''
SERIALISER
=
SERIALISER_REGISTRY
[
SERIALISER_VERSION
]
# Used only to compose data
SERIALISER_PREFIX
=
SERIALISED_VALUE_MAGIC
+
SERIALISER_VERSION
+
'!'
assert
SERIALISED
.
match
(
SERIALISER_PREFIX
).
groups
()
==
(
SERIALISER_VERSION
,
''
),
SERIALISED
.
match
(
SERIALISER_PREFIX
).
groups
()
def
dumps
(
value
):
orig_value
=
value
value
=
SERIALISER
.
dumps
(
value
)
assert
SERIALISER
.
loads
(
value
)
==
orig_value
,
(
repr
(
value
),
orig_value
)
return
SERIALISER_PREFIX
+
value
def
loads
(
value
):
assert
value
.
startswith
(
SERIALISED_VALUE_MAGIC
),
repr
(
value
)
version
,
data
=
SERIALISED
.
match
(
value
).
groups
()
return
SERIALISER_REGISTRY
[
version
].
loads
(
data
)
try
:
try
:
try
:
try
:
...
@@ -1453,11 +1508,13 @@ class Options(UserDict.DictMixin):
...
@@ -1453,11 +1508,13 @@ class Options(UserDict.DictMixin):
v
=
self
.
get
(
key
)
v
=
self
.
get
(
key
)
if
v
is
None
:
if
v
is
None
:
raise
MissingOption
(
"Missing option: %s:%s"
%
(
self
.
name
,
key
))
raise
MissingOption
(
"Missing option: %s:%s"
%
(
self
.
name
,
key
))
elif
v
.
startswith
(
SERIALISED_VALUE_MAGIC
):
v
=
loads
(
v
)
return
v
return
v
def
__setitem__
(
self
,
option
,
value
):
def
__setitem__
(
self
,
option
,
value
):
if
not
isinstance
(
value
,
str
):
if
not
isinstance
(
value
,
str
):
raise
TypeError
(
'Option values must be strings'
,
value
)
value
=
dumps
(
value
)
self
.
_data
[
option
]
=
value
self
.
_data
[
option
]
=
value
def
__delitem__
(
self
,
key
):
def
__delitem__
(
self
,
key
):
...
@@ -1576,10 +1633,8 @@ def _save_option(option, value, f):
...
@@ -1576,10 +1633,8 @@ def _save_option(option, value, f):
def
_save_options
(
section
,
options
,
f
):
def
_save_options
(
section
,
options
,
f
):
print
>>
f
,
'[%s]'
%
section
print
>>
f
,
'[%s]'
%
section
items
=
options
.
items
()
for
option
in
sorted
(
options
.
keys
()):
items
.
sort
()
_save_option
(
option
,
options
.
get
(
option
),
f
)
for
option
,
value
in
items
:
_save_option
(
option
,
value
,
f
)
def
_open
(
base
,
filename
,
seen
,
dl_options
,
override
,
downloaded
):
def
_open
(
base
,
filename
,
seen
,
dl_options
,
override
,
downloaded
):
"""Open a configuration file and return the result as a dictionary,
"""Open a configuration file and return the result as a dictionary,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment