1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
"""Tests for packaging.command.install_data."""
import os
import sys
import sysconfig
import packaging.database
from sysconfig import _get_default_scheme
from packaging.tests import unittest, support
from packaging.command.install_data import install_data
from packaging.command.install_dist import install_dist
from packaging.command.install_distinfo import install_distinfo
class InstallDataTestCase(support.TempdirManager,
support.LoggingCatcher,
unittest.TestCase):
def setUp(self):
super(InstallDataTestCase, self).setUp()
scheme = _get_default_scheme()
old_items = sysconfig._SCHEMES.items(scheme)
def restore():
sysconfig._SCHEMES.remove_section(scheme)
sysconfig._SCHEMES.add_section(scheme)
for option, value in old_items:
sysconfig._SCHEMES.set(scheme, option, value)
self.addCleanup(restore)
def test_simple_run(self):
pkg_dir, dist = self.create_dist()
cmd = install_data(dist)
cmd.install_dir = inst = os.path.join(pkg_dir, 'inst')
scheme = _get_default_scheme()
sysconfig._SCHEMES.set(scheme, 'inst',
os.path.join(pkg_dir, 'inst'))
sysconfig._SCHEMES.set(scheme, 'inst2',
os.path.join(pkg_dir, 'inst2'))
one = os.path.join(pkg_dir, 'one')
self.write_file(one, 'xxx')
inst2 = os.path.join(pkg_dir, 'inst2')
two = os.path.join(pkg_dir, 'two')
self.write_file(two, 'xxx')
# FIXME this creates a literal \{inst2\} directory!
cmd.data_files = {one: '{inst}/one', two: '{inst2}/two'}
self.assertCountEqual(cmd.get_inputs(), [one, two])
# let's run the command
cmd.ensure_finalized()
cmd.run()
# let's check the result
self.assertEqual(len(cmd.get_outputs()), 2)
rtwo = os.path.split(two)[-1]
self.assertTrue(os.path.exists(os.path.join(inst2, rtwo)))
rone = os.path.split(one)[-1]
self.assertTrue(os.path.exists(os.path.join(inst, rone)))
cmd.outfiles = []
# let's try with warn_dir one
cmd.warn_dir = True
cmd.finalized = False
cmd.ensure_finalized()
cmd.run()
# let's check the result
self.assertEqual(len(cmd.get_outputs()), 2)
self.assertTrue(os.path.exists(os.path.join(inst2, rtwo)))
self.assertTrue(os.path.exists(os.path.join(inst, rone)))
cmd.outfiles = []
# now using root and empty dir
cmd.root = os.path.join(pkg_dir, 'root')
three = os.path.join(cmd.install_dir, 'three')
self.write_file(three, 'xx')
sysconfig._SCHEMES.set(scheme, 'inst3', cmd.install_dir)
cmd.data_files = {one: '{inst}/one', two: '{inst2}/two',
three: '{inst3}/three'}
cmd.finalized = False
cmd.ensure_finalized()
cmd.run()
# let's check the result
self.assertEqual(len(cmd.get_outputs()), 3)
self.assertTrue(os.path.exists(os.path.join(inst2, rtwo)))
self.assertTrue(os.path.exists(os.path.join(inst, rone)))
def test_resources(self):
install_dir = self.mkdtemp()
scripts_dir = self.mkdtemp()
project_dir, dist = self.create_dist(
name='Spamlib', version='0.1',
data_files={'spamd': '{scripts}/spamd'})
os.chdir(project_dir)
self.write_file('spamd', '# Python script')
sysconfig._SCHEMES.set(_get_default_scheme(), 'scripts', scripts_dir)
sys.path.insert(0, install_dir)
packaging.database.disable_cache()
self.addCleanup(sys.path.remove, install_dir)
self.addCleanup(packaging.database.enable_cache)
cmd = install_dist(dist)
cmd.outputs = ['spamd']
cmd.install_lib = install_dir
dist.command_obj['install_dist'] = cmd
cmd = install_data(dist)
cmd.install_dir = install_dir
cmd.ensure_finalized()
dist.command_obj['install_data'] = cmd
cmd.run()
cmd = install_distinfo(dist)
cmd.ensure_finalized()
dist.command_obj['install_distinfo'] = cmd
cmd.run()
# first a few sanity checks
self.assertEqual(os.listdir(scripts_dir), ['spamd'])
self.assertEqual(os.listdir(install_dir), ['Spamlib-0.1.dist-info'])
# now the real test
fn = os.path.join(install_dir, 'Spamlib-0.1.dist-info', 'RESOURCES')
with open(fn, encoding='utf-8') as fp:
content = fp.read().strip()
expected = 'spamd,%s' % os.path.join(scripts_dir, 'spamd')
self.assertEqual(content, expected)
# just to be sure, we also test that get_file works here, even though
# packaging.database has its own test file
with packaging.database.get_file('Spamlib', 'spamd') as fp:
content = fp.read()
self.assertEqual('# Python script', content)
def test_suite():
return unittest.makeSuite(InstallDataTestCase)
if __name__ == "__main__":
unittest.main(defaultTest="test_suite")
|