##// END OF EJS Templates
resourceutil: implement `contents()` to iterate over resources in a package...
Matt Harbison -
r44481:bba9149a default
parent child Browse files
Show More
@@ -1,74 +1,84 b''
1 1 # resourceutil.py - utility for looking up resources
2 2 #
3 3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com>
4 4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
5 5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
6 6 #
7 7 # This software may be used and distributed according to the terms of the
8 8 # GNU General Public License version 2 or any later version.
9 9
10 10 from __future__ import absolute_import
11 11
12 12 import imp
13 13 import os
14 14 import sys
15 15
16 16 from .. import pycompat
17 17
18 18
19 19 def mainfrozen():
20 20 """return True if we are a frozen executable.
21 21
22 22 The code supports py2exe (most common, Windows only) and tools/freeze
23 23 (portable, not much used).
24 24 """
25 25 return (
26 26 pycompat.safehasattr(sys, "frozen")
27 27 or pycompat.safehasattr(sys, "importers") # new py2exe
28 28 or imp.is_frozen("__main__") # old py2exe
29 29 ) # tools/freeze
30 30
31 31
32 32 # the location of data files matching the source code
33 33 if mainfrozen() and getattr(sys, 'frozen', None) != 'macosx_app':
34 34 # executable version (py2exe) doesn't support __file__
35 35 datapath = os.path.dirname(pycompat.sysexecutable)
36 36 else:
37 37 datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__)))
38 38 _rootpath = os.path.dirname(datapath)
39 39
40 40 try:
41 41 from importlib import resources
42 42
43 43 from .. import encoding
44 44
45 45 # Force loading of the resources module
46 46 resources.open_binary # pytype: disable=module-attr
47 47
48 48 def open_resource(package, name):
49 49 return resources.open_binary( # pytype: disable=module-attr
50 50 pycompat.sysstr(package), pycompat.sysstr(name)
51 51 )
52 52
53 53 def is_resource(package, name):
54 54 return resources.is_resource(
55 55 pycompat.sysstr(package), encoding.strfromlocal(name)
56 56 )
57 57
58 def contents(package):
59 for r in resources.contents(pycompat.sysstr(package)):
60 yield encoding.strtolocal(r)
61
58 62
59 63 except (ImportError, AttributeError):
60 64
61 65 def _package_path(package):
62 66 return os.path.join(_rootpath, *package.split(b'.'))
63 67
64 68 def open_resource(package, name):
65 69 path = os.path.join(_package_path(package), name)
66 70 return open(path, 'rb')
67 71
68 72 def is_resource(package, name):
69 73 path = os.path.join(_package_path(package), name)
70 74
71 75 try:
72 76 return os.path.isfile(pycompat.fsdecode(path))
73 77 except (IOError, OSError):
74 78 return False
79
80 def contents(package):
81 path = pycompat.fsdecode(_package_path(package))
82
83 for p in os.listdir(path):
84 yield pycompat.fsencode(p)
General Comments 0
You need to be logged in to leave comments. Login now