Browse Source

gluon-announce, ...: don't output empty lists where not appropriate

Always output empty objects or nothing at all where objects are expected, but
no elements exist.

Also remove a few unneeded "requires", a few basic modules are provided by
announce.lua by default.
Matthias Schiffer 9 years ago
parent
commit
637df6b197

+ 2 - 1
package/gluon-announce/files/usr/lib/lua/gluon/announce.lua

@@ -3,6 +3,7 @@
 module('gluon.announce', package.seeall)
 
 fs = require 'luci.fs'
+json = require 'luci.json'
 uci = require('luci.model.uci').cursor()
 util = require 'luci.util'
 
@@ -15,7 +16,7 @@ local function collect_entry(entry)
 end
 
 function collect_dir(dir)
-	local ret = {}
+	local ret = { [json.null] = true }
 
 	for _, entry in ipairs(fs.dir(dir)) do
 		if entry:sub(1, 1) ~= '.' then

+ 4 - 6
package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv

@@ -1,7 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
-
 local ifname_address_cache = {}
 
 function ifname2address(ifname)
@@ -26,7 +22,7 @@ function batadv()
     if mac1 ~= nil and mac1 == mac2 then
       ifaddress = ifname2address(ifname)
       if interfaces[ifaddress] == nil then
-        interfaces[ifaddress] = { neighbours = {} }
+        interfaces[ifaddress] = { neighbours = { [json.null] = true } }
       end
 
       interfaces[ifaddress].neighbours[mac1] = { tq = tonumber(tq)
@@ -35,7 +31,9 @@ function batadv()
     end
   end
 
-  return interfaces
+  if next(interfaces) then
+    return interfaces
+  end
 end
 
 return batadv()

+ 6 - 5
package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi

@@ -1,6 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
 local iwinfo = require 'iwinfo'
 
 function neighbours(iface)
@@ -12,7 +9,9 @@ function neighbours(iface)
                           }
   end
 
-  return stations
+  if next(stations) then
+    return stations
+  end
 end
 
 function interfaces()
@@ -38,4 +37,6 @@ for address, iface in pairs(interfaces()) do
   wifi[address] = { neighbours = neighbours(iface) }
 end
 
-return wifi
+if next(wifi) then
+  return wifi
+end

+ 2 - 1
package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces

@@ -48,5 +48,6 @@ end
 return {
   wireless = nil_table(wireless),
   tunnel = nil_table(tunnel),
-  other = nil_table(other)
+  other = nil_table(other),
+  [json.null] = true
 }

+ 36 - 0
patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch

@@ -0,0 +1,36 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Thu, 4 Jun 2015 21:03:24 +0200
+Subject: luci-lib-json: ignore null keys to allow encoding empty objects
+
+There is currently no way to encode an empty object {}, as empty tables are
+encoded as empty lists [].
+
+With this patch, encode() will ignore table fields with the key json.null (which
+doesn't make sense anyways). This allows adding a field with key json.null to
+force encoding it as an object.
+
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
+
+diff --git a/libs/json/luasrc/json.lua b/libs/json/luasrc/json.lua
+index 8dbaf91..11a5608 100644
+--- a/libs/json/luasrc/json.lua
++++ b/libs/json/luasrc/json.lua
+@@ -205,11 +205,13 @@ function Encoder.parse_iter(self, obj)
+ 		local first = true
+ 
+ 		for key, entry in pairs(obj) do
+-			first = first or self:put(",")
+-			first = first and false
+-			self:parse_string(tostring(key))
+-			self:put(":")
+-			self:dispatch(entry)
++			if key ~= null then
++				first = first or self:put(",")
++				first = first and false
++				self:parse_string(tostring(key))
++				self:put(":")
++				self:dispatch(entry)
++			end
+ 		end
+ 
+ 		self:put("}")