sub options {
return {};
-}
+}
sub plugindata {
return {};
-}
+}
sub createSchema {
- my ($class) = @_;
+ my ($class, $skip_type) = @_;
my $pdata = $class->private();
my $propertyList = $pdata->{propertyList};
};
foreach my $p (keys %$propertyList) {
+ next if $skip_type && $p eq 'type';
+
if (!$propertyList->{$p}->{optional}) {
$props->{$p} = $propertyList->{$p};
next;
}
sub updateSchema {
- my ($class) = @_;
+ my ($class, $single_class) = @_;
my $pdata = $class->private();
my $propertyList = $pdata->{propertyList};
my $props = {};
+ my $filter_type = $class->type() if $single_class;
+
foreach my $p (keys %$propertyList) {
next if $p eq 'type';
+
+ my $copts = $class->options();
+
+ next if defined($filter_type) && !defined($copts->{$p});
+
if (!$propertyList->{$p}->{optional}) {
$props->{$p} = $propertyList->{$p};
next;
my $modifyable = 0;
- my $copts = $class->options();
$modifyable = 1 if defined($copts->{$p}) && !$copts->{$p}->{fixed};
foreach my $t (keys %$plugins) {
}
$propertyList->{type}->{type} = 'string';
- $propertyList->{type}->{enum} = [keys %$plugins];
+ $propertyList->{type}->{enum} = [sort keys %$plugins];
}
sub lookup {
my ($class) = @_;
my $pdata = $class->private();
-
- return [ keys %{$pdata->{plugins}} ];
+
+ return [ sort keys %{$pdata->{plugins}} ];
}
sub decode_value {
return $value if $key eq 'type' && $type eq $value;
my $opts = $pdata->{options}->{$type};
- die "unknown section type '$type'\n" if !$opts;
+ die "unknown section type '$type'\n" if !$opts;
die "unexpected property '$key'\n" if !defined($opts->{$key});
}
}
+ if ($ct eq 'boolean' || $ct eq 'integer' || $ct eq 'number') {
+ return $value + 0; # convert to number
+ }
+
return $value;
}
}
sub format_section_header {
- my ($class, $type, $sectionId) = @_;
+ my ($class, $type, $sectionId, $scfg, $done_hash) = @_;
return "$type: $sectionId\n";
}
$raw = '' if !defined($raw);
my $digest = Digest::SHA::sha1_hex($raw);
-
+
my $pri = 1;
my $lineno = 0;
if ($line =~ m/^\s+(\S+)(\s+(.*\S))?\s*$/) {
my ($k, $v) = ($1, $3);
-
+
eval {
die "duplicate attribute\n" if defined($config->{$k});
$config->{$k} = $plugin->check_value($type, $k, $v, $sectionId);
foreach my $k (keys %$config) {
my $value = $config->{$k};
-
+
die "can't change value of fixed parameter '$k'\n"
- if !$create && $opts->{$k}->{fixed};
-
+ if !$create && defined($opts->{$k}) && $opts->{$k}->{fixed};
+
if (defined($value)) {
my $tmp = $class->check_value($type, $k, $value, $sectionId, $skipSchemaCheck);
$settings->{$k} = $class->decode_value($type, $k, $tmp);
if ($key =~ m/[\n\r]/) || ($value =~ m/[\n\r]/);
if ($ct eq 'boolean') {
- return $value ? "\t$key\n" : '';
+ return "\t$key " . ($value ? 1 : 0) . "\n"
+ if defined($value);
} else {
return "\t$key $value\n" if "$value" ne '';
}
my $maxpri = 0;
foreach my $sectionId (keys %$ids) {
- my $pri = $order->{$sectionId};
+ my $pri = $order->{$sectionId};
$maxpri = $pri if $pri && $pri > $maxpri;
}
foreach my $sectionId (keys %$ids) {
if (!defined ($order->{$sectionId})) {
$order->{$sectionId} = ++$maxpri;
- }
+ }
}
foreach my $sectionId (sort {$order->{$a} <=> $order->{$b}} keys %$ids) {
die "unknown section type '$type'\n" if !$opts;
- my $data = $class->format_section_header($type, $sectionId);
- if ($scfg->{comment}) {
+ my $done_hash = {};
+
+ my $data = $class->format_section_header($type, $sectionId, $scfg, $done_hash);
+ if ($scfg->{comment} && !$done_hash->{comment}) {
my $k = 'comment';
my $v = $class->encode_value($type, $k, $scfg->{$k});
$data .= &$format_config_line($propertyList->{$k}, $k, $v);
}
- $data .= "\tdisable\n" if $scfg->{disable};
+ $data .= "\tdisable\n" if $scfg->{disable} && !$done_hash->{disable};
- my $done_hash = { comment => 1, disable => 1};
+ $done_hash->{comment} = 1;
+ $done_hash->{disable} = 1;
- foreach my $k (keys %$opts) {
+ my @option_keys = sort keys %$opts;
+ foreach my $k (@option_keys) {
+ next if defined($done_hash->{$k});
next if $opts->{$k}->{optional};
$done_hash->{$k} = 1;
my $v = $scfg->{$k};
$data .= &$format_config_line($propertyList->{$k}, $k, $v);
}
- foreach my $k (keys %$opts) {
+ foreach my $k (@option_keys) {
next if defined($done_hash->{$k});
my $v = $scfg->{$k};
next if !defined($v);