Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
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
Kirill Smelkov
Zope
Commits
ed87506a
Commit
ed87506a
authored
Aug 14, 2016
by
Hanno Schlichting
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
flake8
parent
036d773a
Changes
22
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
740 additions
and
908 deletions
+740
-908
src/OFS/History.py
src/OFS/History.py
+87
-78
src/OFS/ndiff.py
src/OFS/ndiff.py
+47
-108
src/OFS/tests/__init__.py
src/OFS/tests/__init__.py
+0
-1
src/OFS/tests/testAcquisition.py
src/OFS/tests/testAcquisition.py
+7
-19
src/OFS/tests/testApplication.py
src/OFS/tests/testApplication.py
+7
-7
src/OFS/tests/testCache.py
src/OFS/tests/testCache.py
+0
-6
src/OFS/tests/testChownRecursive.py
src/OFS/tests/testChownRecursive.py
+5
-4
src/OFS/tests/testCopySupport.py
src/OFS/tests/testCopySupport.py
+215
-258
src/OFS/tests/testFTPInterface.py
src/OFS/tests/testFTPInterface.py
+0
-6
src/OFS/tests/testHistory.py
src/OFS/tests/testHistory.py
+10
-16
src/OFS/tests/testObjectManager.py
src/OFS/tests/testObjectManager.py
+93
-97
src/OFS/tests/testOrderSupport.py
src/OFS/tests/testOrderSupport.py
+86
-94
src/OFS/tests/testRanges.py
src/OFS/tests/testRanges.py
+50
-74
src/OFS/tests/testSimpleItem.py
src/OFS/tests/testSimpleItem.py
+13
-17
src/OFS/tests/testTraverse.py
src/OFS/tests/testTraverse.py
+66
-76
src/OFS/tests/test_Uninstalled.py
src/OFS/tests/test_Uninstalled.py
+4
-10
src/OFS/tests/test_event.py
src/OFS/tests/test_event.py
+24
-8
src/OFS/tests/test_metaconfigure.py
src/OFS/tests/test_metaconfigure.py
+15
-14
src/OFS/tests/test_registerclass.py
src/OFS/tests/test_registerclass.py
+1
-0
src/OFS/tests/test_registerpackage.py
src/OFS/tests/test_registerpackage.py
+4
-3
src/OFS/tests/test_subscribers.py
src/OFS/tests/test_subscribers.py
+3
-1
src/OFS/tests/test_userfolder.py
src/OFS/tests/test_userfolder.py
+3
-11
No files found.
src/OFS/History.py
View file @
ed87506a
...
@@ -27,58 +27,65 @@ from DateTime.DateTime import DateTime
...
@@ -27,58 +27,65 @@ from DateTime.DateTime import DateTime
from
ExtensionClass
import
Base
from
ExtensionClass
import
Base
from
zExceptions
import
Redirect
from
zExceptions
import
Redirect
class
TemporalParadox
(
Exception
):
class
TemporalParadox
(
Exception
):
pass
pass
class
HistorySelectionError
(
Exception
):
class
HistorySelectionError
(
Exception
):
pass
pass
class
HystoryJar
:
class
HystoryJar
:
"""A ZODB Connection-like object that provides access to data
"""A ZODB Connection-like object that provides access to data
but prevents history from being changed."""
but prevents history from being changed."""
def
__init__
(
self
,
base
):
def
__init__
(
self
,
base
):
self
.
__base__
=
base
self
.
__base__
=
base
def
__getattr__
(
self
,
name
):
def
__getattr__
(
self
,
name
):
return
getattr
(
self
.
__base__
,
name
)
return
getattr
(
self
.
__base__
,
name
)
def
commit
(
self
,
object
,
transaction
):
def
commit
(
self
,
object
,
transaction
):
if
object
.
_p_changed
:
if
object
.
_p_changed
:
raise
TemporalParadox
,
"You can't change history!"
raise
TemporalParadox
(
"You can't change history!"
)
def
abort
(
*
args
,
**
kw
):
pass
def
abort
(
*
args
,
**
kw
):
pass
tpc_begin
=
tpc_finish
=
abort
tpc_begin
=
tpc_finish
=
abort
def
historicalRevision
(
self
,
serial
):
def
historicalRevision
(
self
,
serial
):
state
=
self
.
_p_jar
.
oldstate
(
self
,
serial
)
state
=
self
.
_p_jar
.
oldstate
(
self
,
serial
)
rev
=
self
.
__class__
.
__basicnew__
()
rev
=
self
.
__class__
.
__basicnew__
()
rev
.
_p_jar
=
HystoryJar
(
self
.
_p_jar
)
rev
.
_p_jar
=
HystoryJar
(
self
.
_p_jar
)
rev
.
_p_oid
=
self
.
_p_oid
rev
.
_p_oid
=
self
.
_p_oid
rev
.
_p_serial
=
serial
rev
.
_p_serial
=
serial
rev
.
__setstate__
(
state
)
rev
.
__setstate__
(
state
)
rev
.
_p_changed
=
0
rev
.
_p_changed
=
0
return
rev
return
rev
class
Historian
(
Implicit
):
class
Historian
(
Implicit
):
"""An Historian's job is to find hysterical revisions of
"""An Historian's job is to find hysterical revisions of
objects, given a time."""
objects, given a time."""
def
__getitem__
(
self
,
key
):
def
__getitem__
(
self
,
key
):
self
=
self
.
aq_parent
self
=
self
.
aq_parent
serial
=
apply
(
pack
,
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
key
.
split
(
'.'
))))
serial
=
pack
(
*
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
key
.
split
(
'.'
))))
if
serial
==
self
.
_p_serial
:
return
self
if
serial
==
self
.
_p_serial
:
return
self
rev
=
historicalRevision
(
self
,
serial
)
rev
=
historicalRevision
(
self
,
serial
)
return
rev
.
__of__
(
self
.
aq_parent
)
return
rev
.
__of__
(
self
.
aq_parent
)
def
manage_workspace
(
self
,
REQUEST
):
def
manage_workspace
(
self
,
REQUEST
):
"We aren't real, so we delegate to that that spawned us!"
"We aren't real, so we delegate to that that spawned us!"
raise
Redirect
,
REQUEST
[
'URL2'
]
+
'/manage_change_history_page'
raise
Redirect
(
REQUEST
[
'URL2'
]
+
'/manage_change_history_page'
)
class
Historical
(
Base
):
class
Historical
(
Base
):
"""Mix-in class to provide a veiw that shows hystorical changes
"""Mix-in class to provide a veiw that shows hystorical changes
...
@@ -94,10 +101,10 @@ class Historical(Base):
...
@@ -94,10 +101,10 @@ class Historical(Base):
security
=
ClassSecurityInfo
()
security
=
ClassSecurityInfo
()
HistoricalRevisions
=
Historian
()
HistoricalRevisions
=
Historian
()
manage_options
=
(
manage_options
=
(
{
'label'
:
'History'
,
'action'
:
'manage_change_history_page'
},
{
'label'
:
'History'
,
'action'
:
'manage_change_history_page'
},
)
)
security
.
declareProtected
(
view_history
,
'manage_change_history_page'
)
security
.
declareProtected
(
view_history
,
'manage_change_history_page'
)
...
@@ -108,63 +115,65 @@ class Historical(Base):
...
@@ -108,63 +115,65 @@ class Historical(Base):
security
.
declareProtected
(
view_history
,
'manage_change_history'
)
security
.
declareProtected
(
view_history
,
'manage_change_history'
)
def
manage_change_history
(
self
):
def
manage_change_history
(
self
):
first
=
0
first
=
0
last
=
20
last
=
20
request
=
getattr
(
self
,
'REQUEST'
,
None
)
request
=
getattr
(
self
,
'REQUEST'
,
None
)
if
request
is
not
None
:
if
request
is
not
None
:
first
=
request
.
get
(
'first_transaction'
,
first
)
first
=
request
.
get
(
'first_transaction'
,
first
)
last
=
request
.
get
(
'last_transaction'
,
last
)
last
=
request
.
get
(
'last_transaction'
,
last
)
r
=
self
.
_p_jar
.
db
().
history
(
self
.
_p_oid
,
size
=
last
)
r
=
self
.
_p_jar
.
db
().
history
(
self
.
_p_oid
,
size
=
last
)
if
r
is
None
:
if
r
is
None
:
# storage doesn't support history
# storage doesn't support history
return
()
return
()
r
=
r
[
first
:]
r
=
r
[
first
:]
for
d
in
r
:
for
d
in
r
:
d
[
'time'
]
=
DateTime
(
d
[
'time'
])
d
[
'time'
]
=
DateTime
(
d
[
'time'
])
d
[
'key'
]
=
'.'
.
join
(
map
(
str
,
unpack
(
">HHHH"
,
d
[
'tid'
])))
d
[
'key'
]
=
'.'
.
join
(
map
(
str
,
unpack
(
">HHHH"
,
d
[
'tid'
])))
return
r
return
r
def
manage_beforeHistoryCopy
(
self
):
pass
# ? (Hook)
def
manage_beforeHistoryCopy
(
self
):
pass
# ? (Hook)
def
manage_historyCopy
(
self
,
keys
=
[],
RESPONSE
=
None
,
URL1
=
None
):
def
manage_historyCopy
(
self
,
keys
=
[],
RESPONSE
=
None
,
URL1
=
None
):
"Copy a selected revision to the present"
"Copy a selected revision to the present"
if
not
keys
:
if
not
keys
:
raise
HistorySelectionError
,
(
raise
HistorySelectionError
(
"No historical revision was selected.<p>"
)
"No historical revision was selected.<p>"
)
if
len
(
keys
)
>
1
:
if
len
(
keys
)
>
1
:
raise
HistorySelectionError
,
(
raise
HistorySelectionError
(
"Only one historical revision can be "
"Only one historical revision can be "
"copied to the present.<p>"
)
"copied to the present.<p>"
)
key
=
keys
[
0
]
key
=
keys
[
0
]
serial
=
apply
(
pack
,
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
key
.
split
(
'.'
))))
serial
=
pack
(
*
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
key
.
split
(
'.'
))))
if
serial
!=
self
.
_p_serial
:
if
serial
!=
self
.
_p_serial
:
self
.
manage_beforeHistoryCopy
()
self
.
manage_beforeHistoryCopy
()
state
=
self
.
_p_jar
.
oldstate
(
self
,
serial
)
state
=
self
.
_p_jar
.
oldstate
(
self
,
serial
)
base
=
aq_base
(
self
)
base
=
aq_base
(
self
)
base
.
_p_activate
()
# make sure we're not a ghost
base
.
_p_activate
()
# make sure we're not a ghost
base
.
__setstate__
(
state
)
# change the state
base
.
__setstate__
(
state
)
# change the state
base
.
_p_changed
=
True
# mark
e object as dirty
base
.
_p_changed
=
True
# mark
object as dirty
self
.
manage_afterHistoryCopy
()
self
.
manage_afterHistoryCopy
()
if
RESPONSE
is
not
None
and
URL1
is
not
None
:
if
RESPONSE
is
not
None
and
URL1
is
not
None
:
RESPONSE
.
redirect
(
URL1
+
'/manage_workspace'
)
RESPONSE
.
redirect
(
URL1
+
'/manage_workspace'
)
def
manage_afterHistoryCopy
(
self
):
pass
# ? (Hook)
def
manage_afterHistoryCopy
(
self
):
pass
# ? (Hook)
_manage_historyComparePage
=
DTMLFile
(
_manage_historyComparePage
=
DTMLFile
(
'dtml/historyCompare'
,
globals
(),
management_view
=
'History'
)
'dtml/historyCompare'
,
globals
(),
management_view
=
'History'
)
security
.
declareProtected
(
view_history
,
'manage_historyCompare'
)
security
.
declareProtected
(
view_history
,
'manage_historyCompare'
)
def
manage_historyCompare
(
self
,
rev1
,
rev2
,
REQUEST
,
def
manage_historyCompare
(
self
,
rev1
,
rev2
,
REQUEST
,
historyComparisonResults
=
''
):
historyComparisonResults
=
''
):
dt1
=
DateTime
(
rev1
.
_p_mtime
)
dt1
=
DateTime
(
rev1
.
_p_mtime
)
dt2
=
DateTime
(
rev2
.
_p_mtime
)
dt2
=
DateTime
(
rev2
.
_p_mtime
)
return
self
.
_manage_historyComparePage
(
return
self
.
_manage_historyComparePage
(
self
,
REQUEST
,
self
,
REQUEST
,
dt1
=
dt1
,
dt2
=
dt2
,
dt1
=
dt1
,
dt2
=
dt2
,
...
@@ -174,31 +183,31 @@ class Historical(Base):
...
@@ -174,31 +183,31 @@ class Historical(Base):
def
manage_historicalComparison
(
self
,
REQUEST
,
keys
=
[]):
def
manage_historicalComparison
(
self
,
REQUEST
,
keys
=
[]):
"Compare two selected revisions"
"Compare two selected revisions"
if
not
keys
:
if
not
keys
:
raise
HistorySelectionError
,
(
raise
HistorySelectionError
(
"No historical revision was selected.<p>"
)
"No historical revision was selected.<p>"
)
if
len
(
keys
)
>
2
:
if
len
(
keys
)
>
2
:
raise
HistorySelectionError
,
(
raise
HistorySelectionError
(
"Only two historical revision can be compared<p>"
)
"Only two historical revision can be compared<p>"
)
serial
=
apply
(
pack
,
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
keys
[
-
1
].
split
(
'.'
))))
serial
=
pack
(
*
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
keys
[
-
1
].
split
(
'.'
))))
rev1
=
historicalRevision
(
self
,
serial
)
rev1
=
historicalRevision
(
self
,
serial
)
if
len
(
keys
)
==
2
:
if
len
(
keys
)
==
2
:
serial
=
apply
(
pack
,
serial
=
pack
(
*
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
keys
[
0
].
split
(
'.'
))))
(
'>HHHH'
,)
+
tuple
(
map
(
int
,
keys
[
0
].
split
(
'.'
))))
rev2
=
historicalRevision
(
self
,
serial
)
rev2
=
historicalRevision
(
self
,
serial
)
else
:
else
:
rev2
=
self
rev2
=
self
return
self
.
manage_historyCompare
(
rev1
,
rev2
,
REQUEST
)
return
self
.
manage_historyCompare
(
rev1
,
rev2
,
REQUEST
)
InitializeClass
(
Historical
)
InitializeClass
(
Historical
)
def
dump
(
tag
,
x
,
lo
,
hi
,
r
):
def
dump
(
tag
,
x
,
lo
,
hi
,
r
):
r1
=
[]
r1
=
[]
r2
=
[]
r2
=
[]
for
i
in
x
range
(
lo
,
hi
):
for
i
in
range
(
lo
,
hi
):
r1
.
append
(
tag
)
r1
.
append
(
tag
)
r2
.
append
(
x
[
i
])
r2
.
append
(
x
[
i
])
r
.
append
(
"<tr>
\
n
"
r
.
append
(
"<tr>
\
n
"
...
@@ -207,21 +216,20 @@ def dump(tag, x, lo, hi, r):
...
@@ -207,21 +216,20 @@ def dump(tag, x, lo, hi, r):
"</tr>
\
n
"
"</tr>
\
n
"
%
(
'
\
n
'
.
join
(
r1
),
escape
(
'
\
n
'
.
join
(
r2
))))
%
(
'
\
n
'
.
join
(
r1
),
escape
(
'
\
n
'
.
join
(
r2
))))
def
replace
(
x
,
xlo
,
xhi
,
y
,
ylo
,
yhi
,
r
):
rx1
=
[]
def
replace
(
x
,
xlo
,
xhi
,
y
,
ylo
,
yhi
,
r
):
rx2
=
[]
rx1
=
[]
for
i
in
xrange
(
xlo
,
xhi
):
rx2
=
[]
for
i
in
range
(
xlo
,
xhi
):
rx1
.
append
(
'-'
)
rx1
.
append
(
'-'
)
rx2
.
append
(
x
[
i
])
rx2
.
append
(
x
[
i
])
ry1
=
[]
ry1
=
[]
ry2
=
[]
ry2
=
[]
for
i
in
x
range
(
ylo
,
yhi
):
for
i
in
range
(
ylo
,
yhi
):
ry1
.
append
(
'+'
)
ry1
.
append
(
'+'
)
ry2
.
append
(
y
[
i
])
ry2
.
append
(
y
[
i
])
r
.
append
(
"<tr>
\
n
"
r
.
append
(
"<tr>
\
n
"
"<td><pre>
\
n
%s
\
n
%s
\
n
</pre></td>
\
n
"
"<td><pre>
\
n
%s
\
n
%s
\
n
</pre></td>
\
n
"
"<td><pre>
\
n
%s
\
n
%s
\
n
</pre></td>
\
n
"
"<td><pre>
\
n
%s
\
n
%s
\
n
</pre></td>
\
n
"
...
@@ -229,13 +237,14 @@ def replace(x, xlo, xhi, y, ylo, yhi, r):
...
@@ -229,13 +237,14 @@ def replace(x, xlo, xhi, y, ylo, yhi, r):
%
(
'
\
n
'
.
join
(
rx1
),
'
\
n
'
.
join
(
ry1
),
%
(
'
\
n
'
.
join
(
rx1
),
'
\
n
'
.
join
(
ry1
),
escape
(
'
\
n
'
.
join
(
rx2
)),
escape
(
'
\
n
'
.
join
(
ry2
))))
escape
(
'
\
n
'
.
join
(
rx2
)),
escape
(
'
\
n
'
.
join
(
ry2
))))
def
html_diff
(
s1
,
s2
):
def
html_diff
(
s1
,
s2
):
a
=
s1
.
split
(
'
\
n
'
)
a
=
s1
.
split
(
'
\
n
'
)
b
=
s2
.
split
(
'
\
n
'
)
b
=
s2
.
split
(
'
\
n
'
)
cruncher
=
difflib
.
SequenceMatcher
()
cruncher
=
difflib
.
SequenceMatcher
()
cruncher
.
set_seqs
(
a
,
b
)
cruncher
.
set_seqs
(
a
,
b
)
r
=
[
'<table border=1>'
]
r
=
[
'<table border=1>'
]
for
tag
,
alo
,
ahi
,
blo
,
bhi
in
cruncher
.
get_opcodes
():
for
tag
,
alo
,
ahi
,
blo
,
bhi
in
cruncher
.
get_opcodes
():
if
tag
==
'replace'
:
if
tag
==
'replace'
:
replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
,
r
)
replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
,
r
)
...
@@ -246,7 +255,7 @@ def html_diff(s1, s2):
...
@@ -246,7 +255,7 @@ def html_diff(s1, s2):
elif
tag
==
'equal'
:
elif
tag
==
'equal'
:
dump
(
' '
,
a
,
alo
,
ahi
,
r
)
dump
(
' '
,
a
,
alo
,
ahi
,
r
)
else
:
else
:
raise
ValueError
,
'unknown tag '
+
`tag`
raise
ValueError
(
'unknown tag %r'
%
tag
)
r
.
append
(
'</table>'
)
r
.
append
(
'</table>'
)
return
'
\
n
'
.
join
(
r
)
return
'
\
n
'
.
join
(
r
)
src/OFS/ndiff.py
View file @
ed87506a
...
@@ -95,20 +95,21 @@ See module comments for details and programmatic interface.
...
@@ -95,20 +95,21 @@ See module comments for details and programmatic interface.
# is sent to stdout. Or you can call main(args), passing what would
# is sent to stdout. Or you can call main(args), passing what would
# have been in sys.argv[1:] had the cmd-line form been used.
# have been in sys.argv[1:] had the cmd-line form been used.
import
re
TRACE
=
0
TRACE
=
0
# define what "junk" means
import
re
def
IS_LINE_JUNK
(
line
,
pat
=
re
.
compile
(
r"\
s*#?
\s*$"
).
match
):
def
IS_LINE_JUNK
(
line
,
pat
=
re
.
compile
(
r"\
s*#?
\s*$"
).
match
):
return
pat
(
line
)
is
not
None
return
pat
(
line
)
is
not
None
def
IS_CHARACTER_JUNK
(
ch
,
ws
=
"
\
t
"
):
def
IS_CHARACTER_JUNK
(
ch
,
ws
=
"
\
t
"
):
return
ch
in
ws
return
ch
in
ws
del
re
class
SequenceMatcher
:
class
SequenceMatcher
(
object
):
def
__init__
(
self
,
isjunk
=
None
,
a
=
''
,
b
=
''
):
def
__init__
(
self
,
isjunk
=
None
,
a
=
''
,
b
=
''
):
# Members:
# Members:
# a
# a
...
@@ -277,9 +278,9 @@ class SequenceMatcher:
...
@@ -277,9 +278,9 @@ class SequenceMatcher:
continue
continue
if
j
>=
bhi
:
if
j
>=
bhi
:
break
break
k
=
newj2len
[
j
]
=
j2lenget
(
j
-
1
,
0
)
+
1
k
=
newj2len
[
j
]
=
j2lenget
(
j
-
1
,
0
)
+
1
if
k
>
bestsize
:
if
k
>
bestsize
:
besti
,
bestj
,
bestsize
=
i
-
k
+
1
,
j
-
k
+
1
,
k
besti
,
bestj
,
bestsize
=
i
-
k
+
1
,
j
-
k
+
1
,
k
j2len
=
newj2len
j2len
=
newj2len
# Now that we have a wholly interesting match (albeit possibly
# Now that we have a wholly interesting match (albeit possibly
...
@@ -290,17 +291,14 @@ class SequenceMatcher:
...
@@ -290,17 +291,14 @@ class SequenceMatcher:
# interesting match, this is clearly the right thing to do,
# interesting match, this is clearly the right thing to do,
# because no other kind of match is possible in the regions.
# because no other kind of match is possible in the regions.
while
besti
>
alo
and
bestj
>
blo
and
\
while
besti
>
alo
and
bestj
>
blo
and
\
isbjunk
(
b
[
bestj
-
1
])
and
\
isbjunk
(
b
[
bestj
-
1
])
and
\
a
[
besti
-
1
]
==
b
[
bestj
-
1
]:
a
[
besti
-
1
]
==
b
[
bestj
-
1
]:
besti
,
bestj
,
bestsize
=
besti
-
1
,
bestj
-
1
,
bestsize
+
1
besti
,
bestj
,
bestsize
=
besti
-
1
,
bestj
-
1
,
bestsize
+
1
while
besti
+
bestsize
<
ahi
and
bestj
+
bestsize
<
bhi
and
\
while
besti
+
bestsize
<
ahi
and
bestj
+
bestsize
<
bhi
and
\
isbjunk
(
b
[
bestj
+
bestsize
])
and
\
isbjunk
(
b
[
bestj
+
bestsize
])
and
\
a
[
besti
+
bestsize
]
==
b
[
bestj
+
bestsize
]:
a
[
besti
+
bestsize
]
==
b
[
bestj
+
bestsize
]:
bestsize
=
bestsize
+
1
bestsize
=
bestsize
+
1
if
TRACE
:
print
"get_matching_blocks"
,
alo
,
ahi
,
blo
,
bhi
print
" returns"
,
besti
,
bestj
,
bestsize
return
besti
,
bestj
,
bestsize
return
besti
,
bestj
,
bestsize
def
get_matching_blocks
(
self
):
def
get_matching_blocks
(
self
):
...
@@ -309,9 +307,7 @@ class SequenceMatcher:
...
@@ -309,9 +307,7 @@ class SequenceMatcher:
self
.
matching_blocks
=
[]
self
.
matching_blocks
=
[]
la
,
lb
=
len
(
self
.
a
),
len
(
self
.
b
)
la
,
lb
=
len
(
self
.
a
),
len
(
self
.
b
)
self
.
__helper
(
0
,
la
,
0
,
lb
,
self
.
matching_blocks
)
self
.
__helper
(
0
,
la
,
0
,
lb
,
self
.
matching_blocks
)
self
.
matching_blocks
.
append
(
(
la
,
lb
,
0
)
)
self
.
matching_blocks
.
append
((
la
,
lb
,
0
))
if
TRACE
:
print
'*** matching blocks'
,
self
.
matching_blocks
return
self
.
matching_blocks
return
self
.
matching_blocks
# builds list of matching blocks covering a[alo:ahi] and
# builds list of matching blocks covering a[alo:ahi] and
...
@@ -326,8 +322,8 @@ class SequenceMatcher:
...
@@ -326,8 +322,8 @@ class SequenceMatcher:
if
alo
<
i
and
blo
<
j
:
if
alo
<
i
and
blo
<
j
:
self
.
__helper
(
alo
,
i
,
blo
,
j
,
answer
)
self
.
__helper
(
alo
,
i
,
blo
,
j
,
answer
)
answer
.
append
(
x
)
answer
.
append
(
x
)
if
i
+
k
<
ahi
and
j
+
k
<
bhi
:
if
i
+
k
<
ahi
and
j
+
k
<
bhi
:
self
.
__helper
(
i
+
k
,
ahi
,
j
+
k
,
bhi
,
answer
)
self
.
__helper
(
i
+
k
,
ahi
,
j
+
k
,
bhi
,
answer
)
def
ratio
(
self
):
def
ratio
(
self
):
"""Return a measure of the sequences' similarity (float in [0,1]).
"""Return a measure of the sequences' similarity (float in [0,1]).
...
@@ -392,25 +388,29 @@ class SequenceMatcher:
...
@@ -392,25 +388,29 @@ class SequenceMatcher:
elif
j
<
bj
:
elif
j
<
bj
:
tag
=
'insert'
tag
=
'insert'
if
tag
:
if
tag
:
answer
.
append
(
(
tag
,
i
,
ai
,
j
,
bj
)
)
answer
.
append
(
(
tag
,
i
,
ai
,
j
,
bj
)
)
i
,
j
=
ai
+
size
,
bj
+
size
i
,
j
=
ai
+
size
,
bj
+
size
# the list of matching blocks is terminated by a
# the list of matching blocks is terminated by a
# sentinel with size 0
# sentinel with size 0
if
size
:
if
size
:
answer
.
append
(
(
'equal'
,
ai
,
i
,
bj
,
j
)
)
answer
.
append
(
(
'equal'
,
ai
,
i
,
bj
,
j
)
)
return
answer
return
answer
# meant for dumping lines
def
dump
(
tag
,
x
,
lo
,
hi
):
def
dump
(
tag
,
x
,
lo
,
hi
):
# meant for dumping lines
for
i
in
xrange
(
lo
,
hi
):
for
i
in
xrange
(
lo
,
hi
):
print
tag
,
x
[
i
],
print
(
tag
,
x
[
i
])
# figure out which mark to stick under characters in lines that
# figure out which mark to stick under characters in lines that
# have changed (blank = same, - = deleted, + = inserted, ^ = replaced)
# have changed (blank = same, - = deleted, + = inserted, ^ = replaced)
_combine
=
{
' '
:
' '
,
_combine
=
{
' '
:
' '
,
'. '
:
'-'
,
'. '
:
'-'
,
' .'
:
'+'
,
' .'
:
'+'
,
'..'
:
'^'
}
'..'
:
'^'
,
}
def
plain_replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
def
plain_replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
assert
alo
<
ahi
and
blo
<
bhi
assert
alo
<
ahi
and
blo
<
bhi
...
@@ -428,12 +428,8 @@ def plain_replace(a, alo, ahi, b, blo, bhi):
...
@@ -428,12 +428,8 @@ def plain_replace(a, alo, ahi, b, blo, bhi):
# used as a synch point, and intraline difference marking is done on
# used as a synch point, and intraline difference marking is done on
# the similar pair. Lots of work, but often worth it.
# the similar pair. Lots of work, but often worth it.
def
fancy_replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
if
TRACE
:
print
'*** fancy_replace'
,
alo
,
ahi
,
blo
,
bhi
dump
(
'>'
,
a
,
alo
,
ahi
)
dump
(
'<'
,
b
,
blo
,
bhi
)
def
fancy_replace
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
# don't synch up unless the lines have a similarity score of at
# don't synch up unless the lines have a similarity score of at
# least cutoff; best_ratio tracks the best score seen so far
# least cutoff; best_ratio tracks the best score seen so far
best_ratio
,
cutoff
=
0.74
,
0.75
best_ratio
,
cutoff
=
0.74
,
0.75
...
@@ -475,13 +471,6 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
...
@@ -475,13 +471,6 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
# there's a close pair, so forget the identical pair (if any)
# there's a close pair, so forget the identical pair (if any)
eqi
=
None
eqi
=
None
# a[best_i] very similar to b[best_j]; eqi is None iff they're not
# identical
if
TRACE
:
print
'*** best_ratio'
,
best_ratio
,
best_i
,
best_j
dump
(
'>'
,
a
,
best_i
,
best_i
+
1
)
dump
(
'<'
,
b
,
best_j
,
best_j
+
1
)
# pump out diffs from before the synch point
# pump out diffs from before the synch point
fancy_helper
(
a
,
alo
,
best_i
,
b
,
blo
,
best_j
)
fancy_helper
(
a
,
alo
,
best_i
,
b
,
blo
,
best_j
)
...
@@ -504,13 +493,13 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
...
@@ -504,13 +493,13 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
atags
=
atags
+
' '
*
la
atags
=
atags
+
' '
*
la
btags
=
btags
+
' '
*
lb
btags
=
btags
+
' '
*
lb
else
:
else
:
raise
ValueError
,
'unknown tag '
+
`tag`
raise
ValueError
(
'unknown tag %r'
%
tag
)
la
,
lb
=
len
(
atags
),
len
(
btags
)
la
,
lb
=
len
(
atags
),
len
(
btags
)
if
la
<
lb
:
if
la
<
lb
:
atags
=
atags
+
' '
*
(
lb
-
la
)
atags
=
atags
+
' '
*
(
lb
-
la
)
elif
lb
<
la
:
elif
lb
<
la
:
btags
=
btags
+
' '
*
(
la
-
lb
)
btags
=
btags
+
' '
*
(
la
-
lb
)
combined
=
map
(
lambda
x
,
y
:
_combine
[
x
+
y
],
atags
,
btags
)
combined
=
map
(
lambda
x
,
y
:
_combine
[
x
+
y
],
atags
,
btags
)
print
'-'
,
aelt
,
'+'
,
belt
,
'?'
,
\
print
'-'
,
aelt
,
'+'
,
belt
,
'?'
,
\
''
.
join
(
combined
).
rstrip
()
''
.
join
(
combined
).
rstrip
()
else
:
else
:
...
@@ -518,7 +507,8 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
...
@@ -518,7 +507,8 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
print
' '
,
aelt
,
print
' '
,
aelt
,
# pump out diffs from after the synch point
# pump out diffs from after the synch point
fancy_helper
(
a
,
best_i
+
1
,
ahi
,
b
,
best_j
+
1
,
bhi
)
fancy_helper
(
a
,
best_i
+
1
,
ahi
,
b
,
best_j
+
1
,
bhi
)
def
fancy_helper
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
def
fancy_helper
(
a
,
alo
,
ahi
,
b
,
blo
,
bhi
):
if
alo
<
ahi
:
if
alo
<
ahi
:
...
@@ -529,6 +519,7 @@ def fancy_helper(a, alo, ahi, b, blo, bhi):
...
@@ -529,6 +519,7 @@ def fancy_helper(a, alo, ahi, b, blo, bhi):
elif
blo
<
bhi
:
elif
blo
<
bhi
:
dump
(
'+'
,
b
,
blo
,
bhi
)
dump
(
'+'
,
b
,
blo
,
bhi
)
def
fail
(
msg
):
def
fail
(
msg
):
import
sys
import
sys
out
=
sys
.
stderr
.
write
out
=
sys
.
stderr
.
write
...
@@ -536,23 +527,27 @@ def fail(msg):
...
@@ -536,23 +527,27 @@ def fail(msg):
out
(
__doc__
)
out
(
__doc__
)
return
0
return
0
# open a file & return the file object; gripe and return 0 if it
# couldn't be opened
def
fopen
(
fname
):
def
fopen
(
fname
):
# open a file & return the file object; gripe and return 0 if it
# couldn't be opened
try
:
try
:
return
open
(
fname
,
'r'
)
return
open
(
fname
,
'r'
)
except
IOError
,
detail
:
except
IOError
,
detail
:
return
fail
(
"couldn't open "
+
fname
+
": "
+
str
(
detail
))
return
fail
(
"couldn't open "
+
fname
+
": "
+
str
(
detail
))
# open two files & spray the diff to stdout; return false iff a problem
def
fcompare
(
f1name
,
f2name
):
def
fcompare
(
f1name
,
f2name
):
# open two files & spray the diff to stdout; return false iff a problem
f1
=
fopen
(
f1name
)
f1
=
fopen
(
f1name
)
f2
=
fopen
(
f2name
)
f2
=
fopen
(
f2name
)
if
not
f1
or
not
f2
:
if
not
f1
or
not
f2
:
return
0
return
0
a
=
f1
.
readlines
();
f1
.
close
()
a
=
f1
.
readlines
()
b
=
f2
.
readlines
();
f2
.
close
()
f1
.
close
()
b
=
f2
.
readlines
()
f2
.
close
()
cruncher
=
SequenceMatcher
(
IS_LINE_JUNK
,
a
,
b
)
cruncher
=
SequenceMatcher
(
IS_LINE_JUNK
,
a
,
b
)
for
tag
,
alo
,
ahi
,
blo
,
bhi
in
cruncher
.
get_opcodes
():
for
tag
,
alo
,
ahi
,
blo
,
bhi
in
cruncher
.
get_opcodes
():
...
@@ -565,62 +560,6 @@ def fcompare(f1name, f2name):
...
@@ -565,62 +560,6 @@ def fcompare(f1name, f2name):
elif
tag
==
'equal'
:
elif
tag
==
'equal'
:
dump
(
' '
,
a
,
alo
,
ahi
)
dump
(
' '
,
a
,
alo
,
ahi
)
else
:
else
:
raise
ValueError
,
'unknown tag '
+
`tag`
raise
ValueError
(
'unknown tag %r'
+
tag
)
return
1
return
1
# crack args (sys.argv[1:] is normal) & compare;
# return false iff a problem
def
main
(
args
):
import
getopt
try
:
opts
,
args
=
getopt
.
getopt
(
args
,
"qr:"
)
except
getopt
.
error
,
detail
:
return
fail
(
str
(
detail
))
noisy
=
1
qseen
=
rseen
=
0
for
opt
,
val
in
opts
:
if
opt
==
"-q"
:
qseen
=
1
noisy
=
0
elif
opt
==
"-r"
:
rseen
=
1
whichfile
=
val
if
qseen
and
rseen
:
return
fail
(
"can't specify both -q and -r"
)
if
rseen
:
if
args
:
return
fail
(
"no args allowed with -r option"
)
if
whichfile
in
"12"
:
restore
(
whichfile
)
return
1
return
fail
(
"-r value must be 1 or 2"
)
if
len
(
args
)
!=
2
:
return
fail
(
"need 2 filename args"
)
f1name
,
f2name
=
args
if
noisy
:
print
'-:'
,
f1name
print
'+:'
,
f2name
return
fcompare
(
f1name
,
f2name
)
def
restore
(
which
):
import
sys
tag
=
{
"1"
:
"- "
,
"2"
:
"+ "
}[
which
]
prefixes
=
(
" "
,
tag
)
for
line
in
sys
.
stdin
.
readlines
():
if
line
[:
2
]
in
prefixes
:
print
line
[
2
:],
if
__name__
==
'__main__'
:
import
sys
args
=
sys
.
argv
[
1
:]
if
"-profile"
in
args
:
import
profile
,
pstats
args
.
remove
(
"-profile"
)
statf
=
"ndiff.pro"
profile
.
run
(
"main(args)"
,
statf
)
stats
=
pstats
.
Stats
(
statf
)
stats
.
strip_dirs
().
sort_stats
(
'time'
).
print_stats
()
else
:
main
(
args
)
src/OFS/tests/__init__.py
View file @
ed87506a
# This helps debugging.
src/OFS/tests/testAcquisition.py
View file @
ed87506a
...
@@ -10,12 +10,6 @@
...
@@ -10,12 +10,6 @@
# FOR A PARTICULAR PURPOSE
# FOR A PARTICULAR PURPOSE
#
#
##############################################################################
##############################################################################
"""Tests demonstrating consequences of guarded_getattr fix from 2004/08/07
http://mail.zope.org/pipermail/zope-checkins/2004-August/028152.html
http://zope.org/Collectors/CMF/259
"""
import
unittest
import
unittest
...
@@ -41,6 +35,7 @@ class AllowedItem(SimpleItem):
...
@@ -41,6 +35,7 @@ class AllowedItem(SimpleItem):
InitializeClass
(
AllowedItem
)
InitializeClass
(
AllowedItem
)
class
DeniedItem
(
SimpleItem
):
class
DeniedItem
(
SimpleItem
):
id
=
'denied'
id
=
'denied'
security
=
ClassSecurityInfo
()
security
=
ClassSecurityInfo
()
...
@@ -48,6 +43,7 @@ class DeniedItem(SimpleItem):
...
@@ -48,6 +43,7 @@ class DeniedItem(SimpleItem):
InitializeClass
(
DeniedItem
)
InitializeClass
(
DeniedItem
)
class
ProtectedItem
(
SimpleItem
):
class
ProtectedItem
(
SimpleItem
):
id
=
'protected'
id
=
'protected'
security
=
ClassSecurityInfo
()
security
=
ClassSecurityInfo
()
...
@@ -74,7 +70,8 @@ class TestGetAttr(unittest.TestCase):
...
@@ -74,7 +70,8 @@ class TestGetAttr(unittest.TestCase):
self
.
app
.
manage_addFolder
(
'plain_folder'
)
self
.
app
.
manage_addFolder
(
'plain_folder'
)
# We also want to be able to acquire simple attributes
# We also want to be able to acquire simple attributes
self
.
app
.
manage_addProperty
(
id
=
'simple_type'
,
type
=
'string'
,
value
=
'a string'
)
self
.
app
.
manage_addProperty
(
id
=
'simple_type'
,
type
=
'string'
,
value
=
'a string'
)
# Set up a subfolder and the objects we want to acquire from
# Set up a subfolder and the objects we want to acquire from
self
.
app
.
manage_addFolder
(
'subfolder'
)
self
.
app
.
manage_addFolder
(
'subfolder'
)
...
@@ -142,7 +139,6 @@ class TestGetAttr(unittest.TestCase):
...
@@ -142,7 +139,6 @@ class TestGetAttr(unittest.TestCase):
class
TestGetAttrAnonymous
(
TestGetAttr
):
class
TestGetAttrAnonymous
(
TestGetAttr
):
# Run all tests again as Anonymous User
# Run all tests again as Anonymous User
def
setUp
(
self
):
def
setUp
(
self
):
...
@@ -151,23 +147,15 @@ class TestGetAttrAnonymous(TestGetAttr):
...
@@ -151,23 +147,15 @@ class TestGetAttrAnonymous(TestGetAttr):
noSecurityManager
()
noSecurityManager
()
class
TestGetAttr
_c
(
TestGetAttr
):
class
TestGetAttr
C
(
TestGetAttr
):
def
setUp
(
self
):
def
setUp
(
self
):
TestGetAttr
.
setUp
(
self
)
TestGetAttr
.
setUp
(
self
)
self
.
guarded_getattr
=
guarded_getattr_c
self
.
guarded_getattr
=
guarded_getattr_c
class
TestGetAttrAnonymous_c
(
TestGetAttrAnonymous
):
class
TestGetAttrAnonymousC
(
TestGetAttrAnonymous
):
def
setUp
(
self
):
def
setUp
(
self
):
TestGetAttrAnonymous
.
setUp
(
self
)
TestGetAttrAnonymous
.
setUp
(
self
)
self
.
guarded_getattr
=
guarded_getattr_c
self
.
guarded_getattr
=
guarded_getattr_c
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
TestGetAttr
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestGetAttrAnonymous
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestGetAttr_c
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestGetAttrAnonymous_c
))
return
suite
src/OFS/tests/testApplication.py
View file @
ed87506a
...
@@ -47,27 +47,27 @@ class ApplicationTests(unittest.TestCase):
...
@@ -47,27 +47,27 @@ class ApplicationTests(unittest.TestCase):
self
.
assertEqual
(
app
.
title_and_id
(),
'Other'
)
self
.
assertEqual
(
app
.
title_and_id
(),
'Other'
)
self
.
assertEqual
(
app
.
title_or_id
(),
'Other'
)
self
.
assertEqual
(
app
.
title_or_id
(),
'Other'
)
def
test_
__bobo_traverse_
_attribute_hit
(
self
):
def
test_
bobo_traverse
_attribute_hit
(
self
):
app
=
self
.
_makeOne
()
app
=
self
.
_makeOne
()
app
.
NAME
=
'attribute'
app
.
NAME
=
'attribute'
app
.
_getOb
=
lambda
x
,
y
:
x
app
.
_getOb
=
lambda
x
,
y
:
x
request
=
{}
request
=
{}
self
.
assertEqual
(
app
.
__bobo_traverse__
(
request
,
'NAME'
),
'attribute'
)
self
.
assertEqual
(
app
.
__bobo_traverse__
(
request
,
'NAME'
),
'attribute'
)
def
test_
__bobo_traverse_
_attribute_miss_key_hit
(
self
):
def
test_
bobo_traverse
_attribute_miss_key_hit
(
self
):
app
=
self
.
_makeOne
()
app
=
self
.
_makeOne
()
app
.
_getOb
=
lambda
x
,
y
:
x
app
.
_getOb
=
lambda
x
,
y
:
x
app
.
_objects
=
[{
'id'
:
'OTHER'
,
'meta_type'
:
None
}]
app
.
_objects
=
[{
'id'
:
'OTHER'
,
'meta_type'
:
None
}]
request
=
{}
request
=
{}
self
.
assertEqual
(
app
.
__bobo_traverse__
(
request
,
'OTHER'
),
'OTHER'
)
self
.
assertEqual
(
app
.
__bobo_traverse__
(
request
,
'OTHER'
),
'OTHER'
)
def
test_
__bobo_traverse_
_attribute_key_miss_R_M_default_real_request
(
self
):
def
test_
bobo_traverse
_attribute_key_miss_R_M_default_real_request
(
self
):
from
UserDict
import
UserDict
from
UserDict
import
UserDict
request
=
UserDict
()
request
=
UserDict
()
class
_Response
:
class
_Response
:
def
notFoundError
(
self
,
msg
):
def
notFoundError
(
self
,
msg
):
1
/
0
1
/
0
request
.
RESPONSE
=
_Response
()
request
.
RESPONSE
=
_Response
()
app
=
self
.
_makeOne
()
app
=
self
.
_makeOne
()
...
@@ -76,21 +76,21 @@ class ApplicationTests(unittest.TestCase):
...
@@ -76,21 +76,21 @@ class ApplicationTests(unittest.TestCase):
self
.
assertRaises
(
ZeroDivisionError
,
self
.
assertRaises
(
ZeroDivisionError
,
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
def
test_
__bobo_traverse_
_attribute_key_miss_R_M_default_fake_request
(
self
):
def
test_
bobo_traverse
_attribute_key_miss_R_M_default_fake_request
(
self
):
app
=
self
.
_makeOne
()
app
=
self
.
_makeOne
()
app
.
_getOb
=
_noWay
app
.
_getOb
=
_noWay
request
=
{}
request
=
{}
self
.
assertRaises
(
KeyError
,
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
self
.
assertRaises
(
KeyError
,
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
def
test_
__bobo_traverse_
_attribute_key_miss_R_M_is_GET
(
self
):
def
test_
bobo_traverse
_attribute_key_miss_R_M_is_GET
(
self
):
app
=
self
.
_makeOne
()
app
=
self
.
_makeOne
()
app
.
_getOb
=
_noWay
app
.
_getOb
=
_noWay
request
=
{
'REQUEST_METHOD'
:
'GET'
}
request
=
{
'REQUEST_METHOD'
:
'GET'
}
self
.
assertRaises
(
KeyError
,
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
self
.
assertRaises
(
KeyError
,
app
.
__bobo_traverse__
,
request
,
'NONESUCH'
)
def
test_
__bobo_traverse_
_attribute_key_miss_R_M_not_GET_POST
(
self
):
def
test_
bobo_traverse
_attribute_key_miss_R_M_not_GET_POST
(
self
):
from
OFS
import
bbb
from
OFS
import
bbb
if
bbb
.
HAS_ZSERVER
:
if
bbb
.
HAS_ZSERVER
:
from
webdav.NullResource
import
NullResource
from
webdav.NullResource
import
NullResource
...
...
src/OFS/tests/testCache.py
View file @
ed87506a
...
@@ -32,9 +32,3 @@ class CacheTests(unittest.TestCase):
...
@@ -32,9 +32,3 @@ class CacheTests(unittest.TestCase):
# The parent_cache should still trigger managersExist
# The parent_cache should still trigger managersExist
self
.
assertTrue
(
managersExist
(
root
.
child
.
child_content
))
self
.
assertTrue
(
managersExist
(
root
.
child
.
child_content
))
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
CacheTests
))
return
suite
src/OFS/tests/testChownRecursive.py
View file @
ed87506a
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
import
unittest
import
unittest
from
Testing
import
ZopeTestCase
from
Testing
import
ZopeTestCase
class
TestRecursiveChangeOwnership
(
ZopeTestCase
.
ZopeTestCase
):
class
TestRecursiveChangeOwnership
(
ZopeTestCase
.
ZopeTestCase
):
user_name2
=
"dumdidum"
user_name2
=
"dumdidum"
user_pass2
=
"dumdidum"
user_pass2
=
"dumdidum"
...
@@ -27,10 +28,10 @@ class TestRecursiveChangeOwnership(ZopeTestCase.ZopeTestCase):
...
@@ -27,10 +28,10 @@ class TestRecursiveChangeOwnership(ZopeTestCase.ZopeTestCase):
# remember user objects
# remember user objects
# is the __of__() call correct? is it needed? without it ownerInfo in
# is the __of__() call correct? is it needed? without it ownerInfo in
# owner.py throws an AttributeError ...
# owner.py throws an AttributeError ...
self
.
user1
=
self
.
folder
[
'acl_users'
].
getUser
(
ZopeTestCase
.
user_name
self
.
user1
=
self
.
folder
[
'acl_users'
].
getUser
(
).
__of__
(
self
.
folder
)
ZopeTestCase
.
user_name
).
__of__
(
self
.
folder
)
self
.
user2
=
self
.
folder
[
'acl_users'
].
getUser
(
self
.
user_name2
self
.
user2
=
self
.
folder
[
'acl_users'
].
getUser
(
).
__of__
(
self
.
folder
)
self
.
user_name2
).
__of__
(
self
.
folder
)
self
.
folder
.
changeOwnership
(
self
.
user1
)
self
.
folder
.
changeOwnership
(
self
.
user1
)
...
...
src/OFS/tests/testCopySupport.py
View file @
ed87506a
This diff is collapsed.
Click to expand it.
src/OFS/tests/testFTPInterface.py
View file @
ed87506a
...
@@ -9,9 +9,3 @@ class TestFTPInterface(unittest.TestCase):
...
@@ -9,9 +9,3 @@ class TestFTPInterface(unittest.TestCase):
from
zope.interface.verify
import
verifyClass
from
zope.interface.verify
import
verifyClass
verifyClass
(
IFTPAccess
,
FTPInterface
)
verifyClass
(
IFTPAccess
,
FTPInterface
)
def
test_suite
():
return
unittest
.
TestSuite
((
unittest
.
makeSuite
(
TestFTPInterface
),
))
src/OFS/tests/testHistory.py
View file @
ed87506a
...
@@ -65,13 +65,13 @@ class HistoryTests(unittest.TestCase):
...
@@ -65,13 +65,13 @@ class HistoryTests(unittest.TestCase):
def
test_manage_change_history
(
self
):
def
test_manage_change_history
(
self
):
r
=
self
.
hi
.
manage_change_history
()
r
=
self
.
hi
.
manage_change_history
()
self
.
assertEqual
(
len
(
r
),
3
)
# three transactions
self
.
assertEqual
(
len
(
r
),
3
)
# three transactions
for
i
in
range
(
3
):
for
i
in
range
(
3
):
entry
=
r
[
i
]
entry
=
r
[
i
]
# check no new keys show up without testing
# check no new keys show up without testing
self
.
assertEqual
(
len
(
entry
.
keys
()),
6
)
self
.
assertEqual
(
len
(
entry
.
keys
()),
6
)
# the transactions are in newest-first order
# the transactions are in newest-first order
self
.
assertEqual
(
entry
[
'description'
],
'Change %i'
%
(
3
-
i
))
self
.
assertEqual
(
entry
[
'description'
],
'Change %i'
%
(
3
-
i
))
self
.
assertTrue
(
'key'
in
entry
)
self
.
assertTrue
(
'key'
in
entry
)
# lets not assume the size will stay the same forever
# lets not assume the size will stay the same forever
self
.
assertTrue
(
'size'
in
entry
)
self
.
assertTrue
(
'size'
in
entry
)
...
@@ -79,24 +79,18 @@ class HistoryTests(unittest.TestCase):
...
@@ -79,24 +79,18 @@ class HistoryTests(unittest.TestCase):
self
.
assertTrue
(
'time'
in
entry
)
self
.
assertTrue
(
'time'
in
entry
)
if
i
:
if
i
:
# check times are increasing
# check times are increasing
self
.
assertTrue
(
entry
[
'time'
]
<
r
[
i
-
1
][
'time'
])
self
.
assertTrue
(
entry
[
'time'
]
<
r
[
i
-
1
][
'time'
])
self
.
assertEqual
(
entry
[
'user_name'
],
''
)
self
.
assertEqual
(
entry
[
'user_name'
],
''
)
def
test_manage_historyCopy
(
self
):
def
test_manage_historyCopy
(
self
):
# we assume this works 'cos it's tested above
# we assume this works 'cos it's tested above
r
=
self
.
hi
.
manage_change_history
()
r
=
self
.
hi
.
manage_change_history
()
# now we do the copy
# now we do the copy
self
.
hi
.
manage_historyCopy
(
self
.
hi
.
manage_historyCopy
(
keys
=
[
r
[
2
][
'key'
]])
keys
=
[
r
[
2
][
'key'
]]
)
# do a commit, just like ZPublisher would
# do a commit, just like ZPublisher would
transaction
.
commit
()
transaction
.
commit
()
# check the body is as it should be, we assume (hopefully not foolishly)
# check the body is as it should be, we assume
# (hopefully not foolishly)
# that all other attributes will behave the same
# that all other attributes will behave the same
self
.
assertEqual
(
self
.
hi
.
title
,
self
.
assertEqual
(
self
.
hi
.
title
,
'First title'
)
'First title'
)
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
HistoryTests
))
return
suite
src/OFS/tests/testObjectManager.py
View file @
ed87506a
This diff is collapsed.
Click to expand it.
src/OFS/tests/testOrderSupport.py
View file @
ed87506a
This diff is collapsed.
Click to expand it.
src/OFS/tests/testRanges.py
View file @
ed87506a
This diff is collapsed.
Click to expand it.
src/OFS/tests/testSimpleItem.py
View file @
ed87506a
...
@@ -27,6 +27,7 @@ class TestItem(unittest.TestCase):
...
@@ -27,6 +27,7 @@ class TestItem(unittest.TestCase):
class
RESPONSE
(
object
):
class
RESPONSE
(
object
):
handle_errors
=
True
handle_errors
=
True
item
=
self
.
_makeOne
()
item
=
self
.
_makeOne
()
def
_raise_during_standard_error_message
(
*
args
,
**
kw
):
def
_raise_during_standard_error_message
(
*
args
,
**
kw
):
raise
ZeroDivisionError
(
'testing'
)
raise
ZeroDivisionError
(
'testing'
)
item
.
standard_error_message
=
_raise_during_standard_error_message
item
.
standard_error_message
=
_raise_during_standard_error_message
...
@@ -36,7 +37,7 @@ class TestItem(unittest.TestCase):
...
@@ -36,7 +37,7 @@ class TestItem(unittest.TestCase):
error_value
=
'simple'
,
error_value
=
'simple'
,
REQUEST
=
REQUEST
(),
REQUEST
=
REQUEST
(),
)
)
except
:
except
Exception
:
import
sys
import
sys
self
.
assertEqual
(
sys
.
exc_info
()[
0
],
OverflowError
)
self
.
assertEqual
(
sys
.
exc_info
()[
0
],
OverflowError
)
value
=
sys
.
exc_info
()[
1
]
value
=
sys
.
exc_info
()[
1
]
...
@@ -45,10 +46,12 @@ class TestItem(unittest.TestCase):
...
@@ -45,10 +46,12 @@ class TestItem(unittest.TestCase):
def
test_raise_StandardErrorMessage_TaintedString_errorValue
(
self
):
def
test_raise_StandardErrorMessage_TaintedString_errorValue
(
self
):
from
AccessControl.tainted
import
TaintedString
from
AccessControl.tainted
import
TaintedString
class
REQUEST
(
object
):
class
REQUEST
(
object
):
class
RESPONSE
(
object
):
class
RESPONSE
(
object
):
handle_errors
=
True
handle_errors
=
True
item
=
self
.
_makeOne
()
item
=
self
.
_makeOne
()
def
_raise_during_standard_error_message
(
*
args
,
**
kw
):
def
_raise_during_standard_error_message
(
*
args
,
**
kw
):
raise
ZeroDivisionError
(
'testing'
)
raise
ZeroDivisionError
(
'testing'
)
item
.
standard_error_message
=
_raise_during_standard_error_message
item
.
standard_error_message
=
_raise_during_standard_error_message
...
@@ -58,7 +61,7 @@ class TestItem(unittest.TestCase):
...
@@ -58,7 +61,7 @@ class TestItem(unittest.TestCase):
error_value
=
TaintedString
(
'<simple>'
),
error_value
=
TaintedString
(
'<simple>'
),
REQUEST
=
REQUEST
(),
REQUEST
=
REQUEST
(),
)
)
except
:
except
Exception
:
import
sys
import
sys
self
.
assertEqual
(
sys
.
exc_info
()[
0
],
OverflowError
)
self
.
assertEqual
(
sys
.
exc_info
()[
0
],
OverflowError
)
value
=
sys
.
exc_info
()[
1
]
value
=
sys
.
exc_info
()[
1
]
...
@@ -113,10 +116,3 @@ class TestSimpleItem(unittest.TestCase):
...
@@ -113,10 +116,3 @@ class TestSimpleItem(unittest.TestCase):
REQUEST
=
REQUEST
())
REQUEST
=
REQUEST
())
self
.
assertEquals
(
sem
.
kw
.
get
(
'error_type'
),
'BadRequest'
)
self
.
assertEquals
(
sem
.
kw
.
get
(
'error_type'
),
'BadRequest'
)
def
test_suite
():
return
unittest
.
TestSuite
((
unittest
.
makeSuite
(
TestItem
),
unittest
.
makeSuite
(
TestItem_w__name__
),
unittest
.
makeSuite
(
TestSimpleItem
),
))
src/OFS/tests/testTraverse.py
View file @
ed87506a
This diff is collapsed.
Click to expand it.
src/OFS/tests/test_Uninstalled.py
View file @
ed87506a
...
@@ -91,23 +91,21 @@ class TestsOfBroken(unittest.TestCase):
...
@@ -91,23 +91,21 @@ class TestsOfBroken(unittest.TestCase):
"_p_mtime"
,
"_p_mtime"
,
"_p_oid"
,
"_p_oid"
,
"_p_serial"
,
"_p_serial"
,
"_p_state"
,
"_p_state"
]
]
PERSISTENCE_METHODS
=
[
"_p_deactivate"
,
PERSISTENCE_METHODS
=
[
"_p_deactivate"
,
"_p_activate"
,
"_p_activate"
,
"_p_invalidate"
,
"_p_invalidate"
,
"_p_getattr"
,
"_p_getattr"
,
"_p_setattr"
,
"_p_setattr"
,
"_p_delattr"
,
"_p_delattr"
]
]
inst
=
Broken
(
self
,
OID
,
(
'Products.MyProduct.MyClass'
,
'MyClass'
))
inst
=
Broken
(
self
,
OID
,
(
'Products.MyProduct.MyClass'
,
'MyClass'
))
for
attr_name
in
PERSISTENCE_ATTRS
:
for
attr_name
in
PERSISTENCE_ATTRS
:
attr
=
getattr
(
inst
,
attr_name
)
# doesn't raise
getattr
(
inst
,
attr_name
)
# doesn't raise
for
meth_name
in
PERSISTENCE_METHODS
:
for
meth_name
in
PERSISTENCE_METHODS
:
meth
=
getattr
(
inst
,
meth_name
)
# doesn't raise
getattr
(
inst
,
meth_name
)
# doesn't raise
class
TestsIntegratedBroken
(
base
.
TestCase
):
class
TestsIntegratedBroken
(
base
.
TestCase
):
...
@@ -146,7 +144,3 @@ def test_suite():
...
@@ -146,7 +144,3 @@ def test_suite():
suite
.
addTest
(
unittest
.
makeSuite
(
TestsOfBroken
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestsOfBroken
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestsIntegratedBroken
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestsIntegratedBroken
))
return
suite
return
suite
def
main
():
unittest
.
main
(
defaultTest
=
'test_suite'
)
src/OFS/tests/test_event.py
View file @
ed87506a
...
@@ -23,54 +23,70 @@ from OFS.OrderedFolder import OrderedFolder
...
@@ -23,54 +23,70 @@ from OFS.OrderedFolder import OrderedFolder
from
zope.component
import
testing
,
eventtesting
from
zope.component
import
testing
,
eventtesting
def
setUp
(
test
):
def
setUp
(
test
):
testing
.
setUp
(
test
)
testing
.
setUp
(
test
)
eventtesting
.
setUp
(
test
)
eventtesting
.
setUp
(
test
)
class
DontComplain
(
object
):
class
DontComplain
(
object
):
def
_verifyObjectPaste
(
self
,
object
,
validate_src
=
1
):
def
_verifyObjectPaste
(
self
,
object
,
validate_src
=
1
):
pass
pass
def
cb_isMoveable
(
self
):
def
cb_isMoveable
(
self
):
return
True
return
True
def
cb_isCopyable
(
self
):
def
cb_isCopyable
(
self
):
return
True
return
True
class
NotifyBase
(
DontComplain
):
class
NotifyBase
(
DontComplain
):
def
manage_afterAdd
(
self
,
item
,
container
):
def
manage_afterAdd
(
self
,
item
,
container
):
print
'old manage_afterAdd %s %s %s'
%
(
self
.
getId
(),
item
.
getId
(),
print
(
'old manage_afterAdd %s %s %s'
%
(
container
.
getId
(
))
self
.
getId
(),
item
.
getId
(),
container
.
getId
()
))
super
(
NotifyBase
,
self
).
manage_afterAdd
(
item
,
container
)
super
(
NotifyBase
,
self
).
manage_afterAdd
(
item
,
container
)
manage_afterAdd
.
__five_method__
=
True
# Shut up deprecation warnings
manage_afterAdd
.
__five_method__
=
True
# Shut up deprecation warnings
def
manage_beforeDelete
(
self
,
item
,
container
):
def
manage_beforeDelete
(
self
,
item
,
container
):
super
(
NotifyBase
,
self
).
manage_beforeDelete
(
item
,
container
)
super
(
NotifyBase
,
self
).
manage_beforeDelete
(
item
,
container
)
print
'old manage_beforeDelete %s %s %s'
%
(
self
.
getId
(),
item
.
getId
(),
print
(
'old manage_beforeDelete %s %s %s'
%
(
container
.
getId
(
))
self
.
getId
(),
item
.
getId
(),
container
.
getId
()
))
manage_beforeDelete
.
__five_method__
=
True
# Shut up deprecation warnings
manage_beforeDelete
.
__five_method__
=
True
# Shut up deprecation warnings
def
manage_afterClone
(
self
,
item
):
def
manage_afterClone
(
self
,
item
):
print
'old manage_afterClone %s %s'
%
(
self
.
getId
(),
item
.
getId
(
))
print
(
'old manage_afterClone %s %s'
%
(
self
.
getId
(),
item
.
getId
()
))
super
(
NotifyBase
,
self
).
manage_afterClone
(
item
)
super
(
NotifyBase
,
self
).
manage_afterClone
(
item
)
manage_afterClone
.
__five_method__
=
True
# Shut up deprecation warnings
manage_afterClone
.
__five_method__
=
True
# Shut up deprecation warnings
class
MyApp
(
Folder
):
class
MyApp
(
Folder
):
def
getPhysicalRoot
(
self
):
def
getPhysicalRoot
(
self
):
return
self
return
self
class
MyFolder
(
NotifyBase
,
Folder
):
class
MyFolder
(
NotifyBase
,
Folder
):
pass
pass
class
MyOrderedFolder
(
NotifyBase
,
OrderedFolder
):
class
MyOrderedFolder
(
NotifyBase
,
OrderedFolder
):
pass
pass
class
MyContent
(
NotifyBase
,
SimpleItem
):
class
MyContent
(
NotifyBase
,
SimpleItem
):
def
__init__
(
self
,
id
):
def
__init__
(
self
,
id
):
self
.
_setId
(
id
)
self
.
_setId
(
id
)
# These don't have manage_beforeDelete & co methods
# These don't have manage_beforeDelete & co methods
class
MyNewContent
(
DontComplain
,
SimpleItem
):
class
MyNewContent
(
DontComplain
,
SimpleItem
):
def
__init__
(
self
,
id
):
def
__init__
(
self
,
id
):
self
.
_setId
(
id
)
self
.
_setId
(
id
)
class
MyNewFolder
(
DontComplain
,
Folder
):
class
MyNewFolder
(
DontComplain
,
Folder
):
pass
pass
...
...
src/OFS/tests/test_metaconfigure.py
View file @
ed87506a
import
unittest
import
unittest
_marker
=
object
()
_marker
=
object
()
class
Test__registerClass
(
unittest
.
TestCase
):
class
TestRegisterClass
(
unittest
.
TestCase
):
def
setUp
(
self
):
def
setUp
(
self
):
from
zope.component.testing
import
setUp
from
zope.component.testing
import
setUp
...
@@ -45,6 +46,7 @@ class Test__registerClass(unittest.TestCase):
...
@@ -45,6 +46,7 @@ class Test__registerClass(unittest.TestCase):
pass
pass
else
:
else
:
from
zope.interface
import
implements
from
zope.interface
import
implements
class
Dummy
(
object
):
class
Dummy
(
object
):
implements
(
ifaces
)
implements
(
ifaces
)
return
Dummy
return
Dummy
...
@@ -53,10 +55,13 @@ class Test__registerClass(unittest.TestCase):
...
@@ -53,10 +55,13 @@ class Test__registerClass(unittest.TestCase):
from
zope.component
import
provideUtility
from
zope.component
import
provideUtility
from
zope.interface
import
implements
from
zope.interface
import
implements
from
zope.security.interfaces
import
IPermission
from
zope.security.interfaces
import
IPermission
class
Perm
:
class
Perm
:
implements
(
IPermission
)
implements
(
IPermission
)
def
__init__
(
self
,
title
):
def
__init__
(
self
,
title
):
self
.
title
=
title
self
.
title
=
title
if
title
is
None
:
if
title
is
None
:
title
=
name
.
capitalize
()
title
=
name
.
capitalize
()
provideUtility
(
Perm
(
title
),
name
=
name
)
provideUtility
(
Perm
(
title
),
name
=
name
)
...
@@ -66,8 +71,7 @@ class Test__registerClass(unittest.TestCase):
...
@@ -66,8 +71,7 @@ class Test__registerClass(unittest.TestCase):
import
Products
import
Products
return
(
getattr
(
Products
,
'meta_types'
,
_marker
),
return
(
getattr
(
Products
,
'meta_types'
,
_marker
),
OFS
.
metaconfigure
.
_register_monkies
,
OFS
.
metaconfigure
.
_register_monkies
,
OFS
.
metaconfigure
.
_meta_type_regs
,
OFS
.
metaconfigure
.
_meta_type_regs
)
)
def
test_minimal
(
self
):
def
test_minimal
(
self
):
klass
=
self
.
_makeClass
()
klass
=
self
.
_makeClass
()
...
@@ -80,7 +84,7 @@ class Test__registerClass(unittest.TestCase):
...
@@ -80,7 +84,7 @@ class Test__registerClass(unittest.TestCase):
self
.
assertEqual
(
len
(
mt
),
1
)
self
.
assertEqual
(
len
(
mt
),
1
)
self
.
assertEqual
(
mt
[
0
][
'name'
],
'Dummy'
)
self
.
assertEqual
(
mt
[
0
][
'name'
],
'Dummy'
)
self
.
assertEqual
(
mt
[
0
][
'action'
],
''
)
self
.
assertEqual
(
mt
[
0
][
'action'
],
''
)
self
.
assertEqual
(
mt
[
0
][
'product'
],
'OFS'
)
# XXX why?
self
.
assertEqual
(
mt
[
0
][
'product'
],
'OFS'
)
self
.
assertEqual
(
mt
[
0
][
'permission'
],
'Perm'
)
self
.
assertEqual
(
mt
[
0
][
'permission'
],
'Perm'
)
self
.
assertEqual
(
mt
[
0
][
'visibility'
],
None
)
self
.
assertEqual
(
mt
[
0
][
'visibility'
],
None
)
self
.
assertEqual
(
mt
[
0
][
'interfaces'
],
())
self
.
assertEqual
(
mt
[
0
][
'interfaces'
],
())
...
@@ -109,8 +113,10 @@ class Test__registerClass(unittest.TestCase):
...
@@ -109,8 +113,10 @@ class Test__registerClass(unittest.TestCase):
def
test_w_interfaces
(
self
):
def
test_w_interfaces
(
self
):
from
zope.interface
import
Interface
from
zope.interface
import
Interface
class
IDummy
(
Interface
):
class
IDummy
(
Interface
):
pass
pass
klass
=
self
.
_makeClass
((
IDummy
,))
klass
=
self
.
_makeClass
((
IDummy
,))
self
.
_registerPermission
(
'perm'
)
self
.
_registerPermission
(
'perm'
)
...
@@ -135,8 +141,3 @@ class Test__registerClass(unittest.TestCase):
...
@@ -135,8 +141,3 @@ class Test__registerClass(unittest.TestCase):
self
.
assertEqual
(
klass
.
meta_type
,
'Dummy'
)
self
.
assertEqual
(
klass
.
meta_type
,
'Dummy'
)
mt
,
monkies
,
mt_regs
=
self
.
_getRegistered
()
mt
,
monkies
,
mt_regs
=
self
.
_getRegistered
()
self
.
assertEqual
(
len
(
mt
),
1
)
self
.
assertEqual
(
len
(
mt
),
1
)
def
test_suite
():
return
unittest
.
TestSuite
((
unittest
.
makeSuite
(
Test__registerClass
),
))
src/OFS/tests/test_registerclass.py
View file @
ed87506a
...
@@ -167,6 +167,7 @@ def test_registerClass():
...
@@ -167,6 +167,7 @@ def test_registerClass():
[]
[]
"""
"""
def
test_suite
():
def
test_suite
():
from
Testing.ZopeTestCase
import
ZopeDocTestSuite
from
Testing.ZopeTestCase
import
ZopeDocTestSuite
return
ZopeDocTestSuite
()
return
ZopeDocTestSuite
()
src/OFS/tests/test_registerpackage.py
View file @
ed87506a
...
@@ -20,6 +20,7 @@ import sys
...
@@ -20,6 +20,7 @@ import sys
from
Products.Five.tests
import
testing
from
Products.Five.tests
import
testing
sys
.
path
.
append
(
testing
.
__path__
[
0
])
sys
.
path
.
append
(
testing
.
__path__
[
0
])
def
test_registerPackage
():
def
test_registerPackage
():
"""
"""
Testing registerPackage
Testing registerPackage
...
...
src/OFS/tests/test_subscribers.py
View file @
ed87506a
...
@@ -66,8 +66,10 @@ class TestMaybeWarnDeprecated(unittest.TestCase):
...
@@ -66,8 +66,10 @@ class TestMaybeWarnDeprecated(unittest.TestCase):
class
Deprecated
(
object
):
class
Deprecated
(
object
):
def
manage_afterAdd
(
self
):
def
manage_afterAdd
(
self
):
pass
pass
class
ASubClass
(
Deprecated
):
class
ASubClass
(
Deprecated
):
pass
pass
self
.
deprecatedManageAddDeleteClasses
.
append
(
Deprecated
)
self
.
deprecatedManageAddDeleteClasses
.
append
(
Deprecated
)
self
.
assertLog
(
ASubClass
,
''
)
self
.
assertLog
(
ASubClass
,
''
)
...
...
src/OFS/tests/test_userfolder.py
View file @
ed87506a
...
@@ -176,11 +176,3 @@ class UserFolderTests(unittest.TestCase):
...
@@ -176,11 +176,3 @@ class UserFolderTests(unittest.TestCase):
from
AccessControl
import
Unauthorized
from
AccessControl
import
Unauthorized
app
=
self
.
_makeApp
()
app
=
self
.
_makeApp
()
self
.
assertRaises
(
Unauthorized
,
app
.
restrictedTraverse
,
'doc'
)
self
.
assertRaises
(
Unauthorized
,
app
.
restrictedTraverse
,
'doc'
)
def
test_suite
():
suite
=
unittest
.
TestSuite
((
unittest
.
makeSuite
(
BasicUserFolderTests
),
unittest
.
makeSuite
(
UserFolderTests
),
))
return
suite
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