Compare commits
No commits in common. "master" and "v1.2.0" have entirely different histories.
23 changed files with 65 additions and 133 deletions
5
.busted
5
.busted
|
@ -1,8 +1,5 @@
|
|||
return {
|
||||
_all = {
|
||||
lpath = "?.lua;?/init.lua"
|
||||
};
|
||||
core = {
|
||||
recursive = false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
[*]
|
||||
indent_style = tab
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"workspace.checkThirdParty": false
|
||||
}
|
30
glass-dev-1.rockspec
Normal file
30
glass-dev-1.rockspec
Normal file
|
@ -0,0 +1,30 @@
|
|||
package = "glass"
|
||||
version = "dev-1"
|
||||
source = {
|
||||
url = "git+https://github.com/darkwiiplayer/glass"
|
||||
}
|
||||
description = {
|
||||
homepage = "https://github.com/darkwiiplayer/glass",
|
||||
license = "Unlicense"
|
||||
}
|
||||
dependencies = {
|
||||
"luafilesystem"
|
||||
}
|
||||
build = {
|
||||
type = "builtin",
|
||||
modules = {
|
||||
glass = "glass.lua",
|
||||
["glass.cosmo"] = "glass/cosmo.lua",
|
||||
["glass.discount"] = "glass/discount.lua",
|
||||
["glass.environment"] = "glass/environment.lua",
|
||||
["glass.error"] = "glass/error.lua",
|
||||
["glass.json"] = "glass/json.lua",
|
||||
["glass.lua"] = "glass/lua.lua",
|
||||
["glass.moonhtml"] = "glass/moonhtml.lua",
|
||||
["glass.raw"] = "glass/raw.lua",
|
||||
["glass.skooma.html"] = "glass/skooma/html.lua",
|
||||
["glass.skooma.xml"] = "glass/skooma/xml.lua",
|
||||
["glass.table"] = "glass/table.lua",
|
||||
["glass.yaml"] = "glass/yaml.lua",
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package = "glass"
|
||||
version = "dev-2"
|
||||
source = {
|
||||
url = "git+https://github.com/darkwiiplayer/glass"
|
||||
}
|
||||
description = {
|
||||
summary = "A library to load configuration files by accessing tables",
|
||||
homepage = "https://github.com/darkwiiplayer/glass",
|
||||
license = "Unlicense"
|
||||
}
|
||||
dependencies = {
|
||||
"luafilesystem"
|
||||
}
|
||||
build = {
|
||||
type = "builtin",
|
||||
modules = {
|
||||
glass = "glass.lua",
|
||||
["glass.cosmo"] = "glass/cosmo.lua",
|
||||
["glass.csv"] = "glass/csv.lua",
|
||||
["glass.discount"] = "glass/discount.lua",
|
||||
["glass.environment"] = "glass/environment.lua",
|
||||
["glass.error"] = "glass/error.lua",
|
||||
["glass.fennel"] = "glass/fennel.lua",
|
||||
["glass.json"] = "glass/json.lua",
|
||||
["glass.lua"] = "glass/lua.lua",
|
||||
["glass.raw"] = "glass/raw.lua",
|
||||
["glass.skooma.html"] = "glass/skooma/html.lua",
|
||||
["glass.skooma.xml"] = "glass/skooma/xml.lua",
|
||||
["glass.table"] = "glass/table.lua",
|
||||
["glass.yaml"] = "glass/yaml.lua",
|
||||
}
|
||||
}
|
|
@ -21,8 +21,8 @@ function __metatable:__index(index)
|
|||
return config.bind(path, self.__loaders)
|
||||
else
|
||||
for _, loader in ipairs(self.__loaders) do
|
||||
local success, result = loader(path)
|
||||
if success then
|
||||
local result = loader(path)
|
||||
if result then
|
||||
rawset(self, index, result)
|
||||
return result
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
-- @module glass.cosmo
|
||||
|
||||
local cosmo = require 'cosmo'
|
||||
local raw = require 'glass.raw'
|
||||
local readfile = require 'restia.config.readfile'
|
||||
|
||||
--- Loads a cosmo template from a file and returns the compiled template.
|
||||
-- Returns nil if no template can be found.
|
||||
|
@ -10,8 +10,10 @@ local raw = require 'glass.raw'
|
|||
-- @function load
|
||||
return function(name)
|
||||
name = tostring(name) .. '.cosmo'
|
||||
local text = raw(name)
|
||||
local text = readfile(name)
|
||||
if text then
|
||||
return true, assert(cosmo.compile(text, name))
|
||||
return assert(cosmo.compile(text, name))
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
--- Loader for CSV-Data using streamcsv
|
||||
-- @module glass.csv
|
||||
|
||||
local csv = require 'streamcsv'
|
||||
|
||||
--- Loads a CSV-File and returns a corresponding Lua table.
|
||||
-- CSV file is assumed to have a header row.
|
||||
-- @treturn table CSV-Data
|
||||
-- @function load
|
||||
return function(name)
|
||||
local file = io.open(name..'.csv')
|
||||
if file then
|
||||
return true, csv.file(file)
|
||||
end
|
||||
end
|
|
@ -14,8 +14,10 @@ return function(name)
|
|||
local file = io.open(name)
|
||||
if file then
|
||||
local html = discount(file:read("*a"))
|
||||
return true, function()
|
||||
return function()
|
||||
return html
|
||||
end
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,5 +4,5 @@
|
|||
--- Loads values from environment variables
|
||||
-- @treturn string The value of the environment variable
|
||||
return function(name)
|
||||
return true, os.getenv(name:match("[^/].+$"))
|
||||
return os.getenv(name:match("[^/].+$"))
|
||||
end
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
--- Loader for Fennel files
|
||||
-- @module glass.fennel
|
||||
|
||||
local fennel = require "fennel"
|
||||
local read = require 'glass.raw'
|
||||
|
||||
--- Loads and compiles a Fennel file and runs it.
|
||||
-- Returns the result of running the Fennel file.
|
||||
-- If running the code immediately is not desired,
|
||||
-- it has to be returned as a function.
|
||||
-- @return The result of the Fennel file after running it
|
||||
-- @function load
|
||||
return function(file)
|
||||
local success, raw = read(file..'.fnl')
|
||||
if success then
|
||||
return true, fennel.eval(raw)
|
||||
end
|
||||
end
|
|
@ -2,7 +2,7 @@
|
|||
-- @module glass.json
|
||||
|
||||
local json = require 'cjson'
|
||||
local read = require 'glass.raw'
|
||||
local readfile = require 'restia.cofnig.readfile'
|
||||
|
||||
--- Loads a JSON-File and returns a corresponding Lua table.
|
||||
-- May return non-table values for invalid JSON,
|
||||
|
@ -11,8 +11,8 @@ local read = require 'glass.raw'
|
|||
-- @treturn table JSON-Data
|
||||
-- @function load
|
||||
return function(file)
|
||||
local success, raw = read(file..'.json')
|
||||
if success then
|
||||
return true, json.decode(raw)
|
||||
local raw = readfile(file..'.json')
|
||||
if raw then
|
||||
return json.decode(raw)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,7 +9,5 @@
|
|||
-- @function load
|
||||
return function(name)
|
||||
local f = loadfile(name..'.lua')
|
||||
if f then
|
||||
return true, f()
|
||||
end
|
||||
return f and f() or nil
|
||||
end
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
--- Loader for MoonHTML files
|
||||
-- @module glass.moonhtml
|
||||
|
||||
|
||||
local template = require 'restia.template'
|
||||
|
||||
--- Loads and compiles a moonhtml template.
|
||||
|
@ -10,7 +11,7 @@ return function(name)
|
|||
name = tostring(name) .. '.moonhtml'
|
||||
local file = io.open(name)
|
||||
if file then
|
||||
return true, assert(template.loadmoon(file:read("*a"), name))
|
||||
return assert(template.loadmoon(file:read("*a"), name))
|
||||
else
|
||||
return nil
|
||||
end
|
||||
|
|
|
@ -6,10 +6,8 @@
|
|||
-- @function load
|
||||
return function(path)
|
||||
local f = io.open(path)
|
||||
if not f then
|
||||
return false
|
||||
end
|
||||
if not f then return end
|
||||
local result = f:read("*a")
|
||||
f:close()
|
||||
return true, result
|
||||
return result
|
||||
end
|
||||
|
|
|
@ -17,12 +17,9 @@ end})
|
|||
-- @function load
|
||||
return function(name)
|
||||
name = tostring(name)..'.html.skooma'
|
||||
local template, err = loadfile(name, "t", env)
|
||||
if template == nil then
|
||||
return nil, err
|
||||
end
|
||||
local template = loadfile(name, "t", env)
|
||||
if setfenv then
|
||||
setfenv(template, env)
|
||||
end
|
||||
return true, template
|
||||
return template
|
||||
end
|
||||
|
|
|
@ -17,12 +17,9 @@ end})
|
|||
-- @function load
|
||||
return function(name)
|
||||
name = tostring(name)..'.xml.skooma'
|
||||
local template, err = loadfile(name, "t", env)
|
||||
if template == nil then
|
||||
return nil, err
|
||||
end
|
||||
local template = loadfile(name, "t", env)
|
||||
if setfenv then
|
||||
setfenv(template, env)
|
||||
end
|
||||
return true, template
|
||||
return template
|
||||
end
|
||||
|
|
|
@ -7,9 +7,6 @@
|
|||
-- @treturn function A loader function to be used with `glass.bind`
|
||||
return function(input)
|
||||
return function(name)
|
||||
local result = input[name:match("[^/].+$")]
|
||||
if result then
|
||||
return true, result
|
||||
end
|
||||
return input[name:match("[^/].+$")]
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
-- @module glass.yaml
|
||||
|
||||
local yaml = require 'lyaml'
|
||||
local read = require 'glass.raw'
|
||||
local readfile = require 'restia.config.readfile'
|
||||
|
||||
--- Loads a YAML-File and returns a corresponding Lua table.
|
||||
-- May return non-table values for invalid YAML,
|
||||
|
@ -11,11 +11,8 @@ local read = require 'glass.raw'
|
|||
-- @treturn table YAML-Data
|
||||
-- @function load
|
||||
return function(file)
|
||||
local success, raw = read(file..'.yml')
|
||||
if not success then
|
||||
success, raw = read(file..'.yaml')
|
||||
end
|
||||
if success then
|
||||
return true, yaml.load(raw)
|
||||
local raw = readfile(file..'.yml') or readfile(file..'.yaml')
|
||||
if raw then
|
||||
return yaml.load(raw)
|
||||
end
|
||||
end
|
||||
|
|
10
readme.md
10
readme.md
|
@ -28,10 +28,8 @@ A glass loader is initialised with a list of loaders and will try each of them i
|
|||
## Loaders
|
||||
Glass offers the following loaders out of the box:
|
||||
* `cosmo` loads cosmo templates
|
||||
* `csv` loads csv files (with header line)
|
||||
* `discount` loads markdown files\*.
|
||||
* `environment` loads environment variables.
|
||||
* `fennel` loads and executes fennel files.
|
||||
* `json` loads a JSON file as a Lua table. (requires `cjson`)
|
||||
* `lua` loads and executes a Lua file.
|
||||
* `moonhtml` loads a MoonHTML template and returns it as a function.
|
||||
|
@ -54,8 +52,6 @@ file and attempts to load it into a Lua value.
|
|||
Loaders will typically add an extension to the given file name before checking
|
||||
whether that file exists and can be loaded.
|
||||
|
||||
A successful loader should return `true` followed by its result.
|
||||
When a loader can't load a key, it should return `false` and an optional
|
||||
description of why.
|
||||
When a loader encounters an error (file found but can't be parsed), it should
|
||||
error.
|
||||
When a loader cannot find the expected file, it should return `nil` to let glass
|
||||
continue the loader chain. When a loader returns a truthy value, this will be
|
||||
used and no further loaders will be tried.
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
describe 'fennel loader', ->
|
||||
before_each -> export loader = require 'glass.fennel'
|
||||
it 'loads Fennel files', ->
|
||||
success, result = loader 'spec/fixtures/test'
|
||||
assert.true success
|
||||
assert.same { foo: 'bar', tab: {} }, result
|
2
spec/fixtures/test.fnl
vendored
2
spec/fixtures/test.fnl
vendored
|
@ -1,2 +0,0 @@
|
|||
{"foo" "bar"
|
||||
"tab" []}
|
|
@ -1,11 +1,9 @@
|
|||
describe 'raw loader', ->
|
||||
before_each -> export loader = require 'glass.raw'
|
||||
it 'loads files as plain text', ->
|
||||
assert.same {true, 'plain text\n'}, {loader 'spec/fixtures/test'}
|
||||
assert.same 'plain text\n', loader 'spec/fixtures/test'
|
||||
|
||||
describe 'lua loader', ->
|
||||
before_each -> export loader = require 'glass.lua'
|
||||
it 'loads Lua files', ->
|
||||
success, result = loader 'spec/fixtures/test'
|
||||
assert.true success
|
||||
assert.same { foo: 'bar', tab: {} }, result
|
||||
assert.same { foo: 'bar', tab: {} }, loader 'spec/fixtures/test'
|
||||
|
|
Loading…
Reference in a new issue