-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrequireAll.lua
More file actions
150 lines (134 loc) · 3.64 KB
/
requireAll.lua
File metadata and controls
150 lines (134 loc) · 3.64 KB
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
149
150
local pl = require('pl.import_into')()
local lfs = require('lfs')
local etc = require('./etc')
local log = require('./log')
local sandbox = require('./sandbox')
local time = require('./time')
local __filename = etc.__filename()
local __dirname = etc.__dirname()
local manifestPath = pl.path.join(__dirname, 'lua_modules/lib/luarocks/rocks/manifest')
local _, manifest = sandbox(manifestPath)
local function varNameForModule(m)
return m:gsub('%.', '_'):gsub('%-', '_')
end
local BLACKLIST = {
lua2json = true,
['pl.strict'] = true,
json2lua = true
}
local function requireModule(m)
if BLACKLIST[m] then
-- log('Skipping ' .. m .. '.')
return
end
if string.find(m, '%.') then
return
end
local tk = time.start()
local name = varNameForModule(m)
_G[name] = require(m)
if name == 'pl' then
-- local pltk = time.start()
-- require pl into global
require(m)
_G.pl = require 'pl.import_into'()
-- time.done(pltk, 'requiring-pl-into-global')
end
return time.done(tk, 'require ' .. m, {quiet = true})
end
local function requireAll()
local _times = {}
local tk = time.start()
for m, _ in pairs(manifest.modules) do
_times[m] = requireModule(m)
end
_times.__ALL__ = time.done(tk, 'require-all', {quiet = true})
return _times
end
local function stripLuaExtension(p)
return p:sub(1, #p - 4)
end
local function varNameForFile(p)
-- strip .lua extension
local name = stripLuaExtension(pl.path.basename(p))
if name == 'init' then
name = varNameForModule(pl.path.basename(pl.path.dirname(p)))
end
return name
end
local function getLuaFiles()
local tk = time.start()
local fl = pl.List({})
local filesInThisDir = pl.dir.getfiles('.', '*.lua')
fl:extend(filesInThisDir)
local DIRECTORY_BLACKLIST = {
lua_modules = true
}
local directories = pl.dir.getdirectories(__dirname)
for _, d in ipairs(directories) do
if not DIRECTORY_BLACKLIST[d] then
local files = pl.dir.getfiles(d, '*.lua')
fl:extend(files)
end
end
time.done(tk, 'get-lua-files', {threshold = 300})
return fl
end
local function requireLuaFiles()
local files = getLuaFiles()
local times = {}
local BLACKLIST = {
set_paths = true
}
for _, p in ipairs(files) do
local v = varNameForFile(p)
if not BLACKLIST[v] then
local rn = stripLuaExtension(pl.path.relpath(p, __dirname))
local tk = time.start()
-- log('require ' .. v .. ' from ' .. rn)
_G[v] = require(rn)
times[v] = time.done(tk, 'require-' .. v, {quiet = true})
end
end
return times
end
local function requireAllAndLog()
local allTk = time.start()
local times = requireAll()
local s = ''
local n = 0
for m, t in pairs(times) do
if m ~= '__ALL__' then
n = n + 1
s = s .. m .. '(' .. math.ceil(t) .. ') '
end
end
log('Required ' .. n .. ' modules in ' .. math.ceil(times.__ALL__) .. 'ms')
log(s)
local tk = time.start()
local times2 = requireLuaFiles()
local allTime = time.done(tk, 'require-all-files', {quiet = true})
local s = ''
local n = 0
local ft = 0
for m, t in pairs(times2) do
s = s .. m .. '(' .. math.ceil(t) .. ') '
n = n + 1
ft = ft + t
end
log('Required ' .. n .. ' files in ' .. math.ceil(ft) .. 'ms')
log(s)
local combinedTime = time.done(allTk, 'require-all-combined', {quiet = true})
log(math.ceil(combinedTime) .. 'ms')
end
-- requireAllAndLog()
return {
requireAll = requireAll,
requireAllAndLog = requireAllAndLog,
manifest = manifest,
getLuaFiles = getLuaFiles,
requireLuaFiles = requireLuaFiles,
stripLuaExtension = stripLuaExtension,
varNameForFile = varNameForFile,
varNameForModule = varNameForModule
}