Commit 4e93cb2f authored by Leonardo Rochael Almeida's avatar Leonardo Rochael Almeida

Warn on App.ImageFile.ImageFile deprecated assumption of software_home....

Warn on App.ImageFile.ImageFile deprecated assumption of software_home. Forward ported 114749 from 2.12 branch
parents e7babeac bc7b6a13
......@@ -36,6 +36,11 @@ Restructuring
Features Added
++++++++++++++
- Warn when App.ImageFile.ImageFile receives a relative path with no prefix,
and then has to assume the path to be relative to "software home". This
behaviour is deprecated as packages can be factored out to their own
distribution, making the "software home" relative path meaningless.
- Updated packages:
- ZODB3 = 3.10.0b2
......
......@@ -18,6 +18,7 @@ import os
import os.path
import stat
import time
import warnings
from AccessControl.class_init import InitializeClass
from AccessControl.SecurityInfo import ClassSecurityInfo
......@@ -34,6 +35,13 @@ PREFIX = os.path.realpath(
os.path.join(os.path.dirname(Zope2.__file__), os.path.pardir)
)
NON_PREFIX_WARNING = ('Assuming image location to be present in the Zope2 '
'distribution. This is deprecated and might lead to '
'broken code if the directory in question is moved '
'to another distribution. Please provide either an '
'absolute file system path or a prefix. Support for '
'relative filenames without a prefix might be '
'dropped in a future Zope2 release.')
class ImageFile(Explicit):
"""Image objects stored in external files."""
......@@ -43,9 +51,12 @@ class ImageFile(Explicit):
def __init__(self, path, _prefix=None):
import Globals # for data
if _prefix is None:
_prefix=getattr(getConfiguration(), 'softwarehome', PREFIX)
_prefix=getattr(getConfiguration(), 'softwarehome', None) or PREFIX
if not os.path.isabs(path):
warnings.warn(NON_PREFIX_WARNING, UserWarning, 2 )
elif type(_prefix) is not type(''):
_prefix=package_home(_prefix)
# _prefix is ignored if path is absolute
path = os.path.join(_prefix, path)
self.path=path
if Globals.DevelopmentMode:
......
......@@ -36,7 +36,7 @@ def getConfiguration():
def setConfiguration(cfg):
"""Set the global configuration object.
Legacy sources of common configuraiton values are updated to
Legacy sources of common configuration values are updated to
reflect the new configuration; this may be removed in some future
version.
"""
......
import unittest
import os.path
import App
from Testing.ZopeTestCase.warnhook import WarningsHook
class TestImageFile(unittest.TestCase):
def setUp(self):
# ugly: need to save the old App.config configuration value since
# ImageFile might read it and trigger setting it to the default value
self.oldcfg = App.config._config
self.warningshook = WarningsHook()
self.warningshook.install()
def tearDown(self):
self.warningshook.uninstall()
# ugly: need to restore configuration, or lack thereof
App.config._config = self.oldcfg
def test_warn_on_software_home_default(self):
App.ImageFile.ImageFile('App/www/zopelogo.jpg')
self.assertEquals(self.warningshook.warnings.pop()[0],
App.ImageFile.NON_PREFIX_WARNING)
def test_no_warn_on_absolute_path(self):
path = os.path.join(os.path.dirname(App.__file__),
'www','zopelogo.jpg')
App.ImageFile.ImageFile(path)
self.failIf(self.warningshook.warnings)
def test_no_warn_on_path_as_prefix(self):
prefix = os.path.dirname(App.__file__)
App.ImageFile.ImageFile('www/zopelogo.jpg', prefix)
self.failIf(self.warningshook.warnings)
def test_no_warn_on_namespace_as_prefix(self):
prefix = App.__dict__ # same as calling globals() inside the App module
App.ImageFile.ImageFile('www/zopelogo.jpg', prefix)
self.failIf(self.warningshook.warnings)
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(TestImageFile),
))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment