diff options
Diffstat (limited to '')
-rw-r--r-- | lua/dep/log.lua | 67 | ||||
-rw-r--r-- | lua/dep/package.lua | 95 | ||||
-rw-r--r-- | lua/dep2.lua | 12 |
3 files changed, 97 insertions, 77 deletions
diff --git a/lua/dep/log.lua b/lua/dep/log.lua index d841953..d3ae9e1 100644 --- a/lua/dep/log.lua +++ b/lua/dep/log.lua @@ -15,37 +15,11 @@ local function try_format(...) end end --- Writes logs to a file and prints pretty status messages. -local Logger = { - -- Constructs a new `Logger`. - new = function(mt, path) - path = path or vim.fn.stdpath("cache") .. "/dep.log" - - -- clear and open log file - local handle = vim.loop.fs_open(path, "w", 0x1b4) -- 0664 - local pipe = vim.loop.new_pipe() - pipe:open(handle) - - return setmetatable({ - path = path, - handle = handle, - pipe = pipe, - silent = false, - - -- TODO: This looks good for me ;) but it should have proper vim color mapping for other people. - stage_colors = { - skip = "Comment", - clean = "Boolean", - install = "MoreMsg", - update = "WarningMsg", - delete = "Directory", - error = "ErrorMsg", - }, - }, mt) - end, - +--- Writes logs to a file and prints pretty status messages. +local Logger = setmetatable({ + __metatable = "Logger", __index = { - -- Prints a message associated with a stage. + --- Prints a message associated with a stage. log = function(self, stage, message, ...) -- calling function local source = debug.getinfo(2, "Sl").short_src @@ -77,7 +51,7 @@ local Logger = { end) end, - -- Closes the log file handle. + --- Closes the log file handle. close = function(self) if self.pipe then self.pipe:close() @@ -90,9 +64,36 @@ local Logger = { end end, }, -} +}, { + --- Constructs a new `Logger`. + __call = function(mt, path) + path = path or vim.fn.stdpath("cache") .. "/dep.log" + + -- clear and open log file + local handle = vim.loop.fs_open(path, "w", 0x1b4) -- 0664 + local pipe = vim.loop.new_pipe() + pipe:open(handle) + + return setmetatable({ + path = path, + handle = handle, + pipe = pipe, + silent = false, + + -- TODO: This looks good for me ;) but it should have proper vim color mapping for other people. + stage_colors = { + skip = "Comment", + clean = "Boolean", + install = "MoreMsg", + update = "WarningMsg", + delete = "Directory", + error = "ErrorMsg", + }, + }, mt) + end, +}) return { Logger = Logger, - global = Logger:new(), + global = Logger(), } diff --git a/lua/dep/package.lua b/lua/dep/package.lua index c4f7714..bff4e17 100644 --- a/lua/dep/package.lua +++ b/lua/dep/package.lua @@ -6,8 +6,8 @@ -- -- https://opensource.org/licenses/MIT -- -local require, type, setmetatable, error, assert, math, os, debug = - require, type, setmetatable, error, assert, math, os, debug +local require, type, setmetatable, error, table, assert, math, os, debug = + require, type, setmetatable, error, table, assert, math, os, debug local logger = require("dep.log").global local function parse_name_from_id(id) @@ -23,33 +23,11 @@ local function is_nonempty_str(s) return type(s) == "string" and #s ~= 0 end --- Package information. -local Package = { - -- Constructs a new `Package` with the given identifier. - new = function(mt, id) - local name = parse_name_from_id(id) - return setmetatable({ - id = id, - name = name, - url = "https://github.com/" .. id .. ".git", - enabled = true, - exists = false, - added = false, - configured = false, - loaded = false, - dependencies = {}, - dependents = {}, - subtree_configured = false, - subtree_loaded = false, - on_setup = {}, - on_config = {}, - on_load = {}, - perf = { hooks = {} }, - }, mt) - end, - +--- Package information. +local Package = setmetatable({ + __metatable = "Package", __index = { - -- Runs all registered hooks of the given type. + --- Runs all registered hooks of the given type. run_hooks = function(self, hook) local hooks = self["on_" .. hook] if not hooks or #hooks == 0 then @@ -80,20 +58,36 @@ local Package = { return true end, }, -} - --- Manages a set of packages. -local PackageStore = { - -- Constructs a new `PackageStore`. - new = function(mt) - -- hash part of store maps package ids to packages - -- array part of store is a list of packages - -- all packages in a store are unique based on their id - return setmetatable({}, mt) +}, { + --- Constructs a new `Package` with the given identifier. + __call = function(mt, id) + local name = parse_name_from_id(id) + return setmetatable({ + id = id, + name = name, + url = "https://github.com/" .. id .. ".git", + enabled = true, + exists = false, + added = false, + configured = false, + loaded = false, + dependencies = {}, + dependents = {}, + subtree_configured = false, + subtree_loaded = false, + on_setup = {}, + on_config = {}, + on_load = {}, + perf = { hooks = {} }, + }, mt) end, +}) +--- Manages a set of packages. +local PackageStore = setmetatable({ + __metatable = "PackageStore", __index = { - -- Links the given packages such that the parent must load before the child. + --- Links the given packages such that the parent must load before the child. link_dependency = function(self, parent, child) if not parent.dependents[child.id] then parent.dependents[child.id] = child @@ -106,7 +100,7 @@ local PackageStore = { end end, - -- Ensures the given package spec table is valid. + --- Ensures the given package spec table is valid. validate_spec = function(self, spec) assert(spec[1] ~= nil, "package id missing from spec") assert(type(spec[1]) == "string", "package id must be a string") @@ -132,7 +126,7 @@ local PackageStore = { assert(spec[2] == nil or type(spec[2]) == "function", "package loader must be a function") end, - -- Creates or updates a package given the following spec table, and returns that package. + --- Creates or updates a package from the given spec table, and returns that package. add_spec = function(self, spec, scope) self:validate_spec(spec) scope = scope or {} @@ -141,7 +135,7 @@ local PackageStore = { local pkg = self[id] if not pkg then - pkg = Package:new() + pkg = Package(id) self[id], self[#self + 1] = pkg, pkg end @@ -169,7 +163,7 @@ local PackageStore = { end end, - -- Adds the given list of specs. + --- Adds the given list of specs. add_specs = function(self, specs, scope) assert(type(specs) == "table", "package list must be a table") assert(specs.pin == nil or type(specs.pin) == "boolean", "package list pin must be a boolean") @@ -203,7 +197,7 @@ local PackageStore = { end end, - -- Ensures there are no circular dependencies in this package store. + --- Ensures there are no circular dependencies in this package store. ensure_acyclic = function(self) -- tarjan's strongly connected components algorithm local idx, indices, lowlink, stack = 0, {}, {}, {} @@ -263,4 +257,17 @@ local PackageStore = { end end, }, +}, { + --- Constructs a new `PackageStore`. + __call = function(mt) + -- hash part of store maps package ids to packages + -- array part of store is a list of packages + -- all packages in a store are unique based on their id + return setmetatable({}, mt) + end, +}) + +return { + Package = Package, + PackageStore = PackageStore, } diff --git a/lua/dep2.lua b/lua/dep2.lua new file mode 100644 index 0000000..447f474 --- /dev/null +++ b/lua/dep2.lua @@ -0,0 +1,12 @@ +-- +-- Copyright (c) 2022 chiya.dev +-- +-- Use of this source code is governed by the MIT License +-- which can be found in the LICENSE file and at: +-- +-- https://opensource.org/licenses/MIT +-- +local logger = require("dep.log").global +local store = require("dep.package").PackageStore() + +-- placeholder for refactoring |