parseconfig 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog +41 -21
  3. data/LICENSE +1 -1
  4. data/README.md +75 -59
  5. data/lib/parseconfig.rb +115 -83
  6. data/lib/version.rb +3 -0
  7. metadata +27 -45
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 79e32d975451b2b4cbf6ee3123e87b26a1fbf540066b3d44322c02d573a451af
4
+ data.tar.gz: 3a53181d9344b6b2ea790f968d7f33305709944bafd1c430a27601c411672fff
5
+ SHA512:
6
+ metadata.gz: d7b538e6e901837e6d6e479e072841ba6dd404ecc060cf417d98a40e714daabaf92fa54c3eeec137ff11d5df98e055f374c8f8f43917ce4d3d3ef4668a3d2efa
7
+ data.tar.gz: 634668d51266a54123d170652bb8bd03fcac5936c4a0deb0f388860ecad6cd84cd88c256b85be6d78a7155b766cbccbc2de0334d3b601e1b9304aaa8403118c9
data/Changelog CHANGED
@@ -1,7 +1,27 @@
1
+ Mon Sep 28, 2020 - v1.1.0
2
+ - Add non-value option support.
3
+ Resolves Issue #11
4
+
5
+ Mon Jan 25, 2016 - v1.0.8
6
+ - Use backward compatible positional arguments (not named keyword arguments)
7
+ Resolves Issue #31
8
+
9
+ Mon Jan 25, 2016 - v1.0.7
10
+ - Support alternative comment types (default: ['#', ';']) (@voobscout)
11
+ Resolves Issue #30
12
+
13
+ Mon Oct 06, 2014 - v1.0.6
14
+ - Fix where extraneous double quotes were getting wrapped around parameters
15
+ that have non-word characters (issue #19)
16
+
17
+ Thu Dec 19, 2013 - v1.0.4
18
+ - Add fix for config files with Byte Order Marker (BOM)
19
+ - Add support for .eql? function.
20
+
1
21
  Tue Jun 12, 2012 - v1.0.2
2
- - Re-enable get_value() as it seems some projects are still using it.
22
+ - Re-enable get_value() as it seems some projects are still using it.
3
23
  That said, get_value() *will* be removed in the future at some point.
4
-
24
+
5
25
  Tue Jun 12, 2012 - v1.0.0
6
26
  - Resolved Issue #3, Config files not closed properly.
7
27
  - Resolved Issue #7, Added basic rspec testing
@@ -11,26 +31,26 @@ Tue Jun 12, 2012 - v1.0.0
11
31
  Sat Feb 27, 2010 - v0.5.2
12
32
  - Re-releasing under MIT License.
13
33
  - Fixed issue with the add() method where if you added a group outside
14
- of the import_config() method, the group would not be properly added to
34
+ of the import_config() method, the group would not be properly added to
15
35
  self.groups[].
16
- - Added feature that if you attempt to add a group that already exists, the
36
+ - Added feature that if you attempt to add a group that already exists, the
17
37
  groups will be merged together. Any existing params in the original
18
38
  group will be overwritten by the new ones.
19
39
  - Fully deprecated override_value() and nil_value(). Anything using
20
40
  'instance_variable*' has been removed as well as it wasn't working properly
21
41
  anyway.
22
- - If you attempt to add_to_group() to a group that doesn't exist, the group
42
+ - If you attempt to add_to_group() to a group that doesn't exist, the group
23
43
  is added automatically.
24
-
44
+
25
45
  Mon Aug 31, 2009 - v0.5
26
46
  - Added sub-groups feature per RubyForge tracker [#27019]. Config files
27
47
  can now have [subgroups] whose values are added to a nested Hash object.
28
- - Added the write() function per RubyForge tracker [#27019]. Will print
48
+ - Added the write() function per RubyForge tracker [#27019]. Will print
29
49
  to STDOUT by default, or to a file object if passed.
30
50
  - Added the add(), and add_to_group() functions to support new features
31
51
  per RubyForge tracker [#27019].
32
52
  - Thank you to Titouan Christophe for the submissions listed above!
33
- - ParseConfig.get_params() returns all params including groups.
53
+ - ParseConfig.get_params() returns all params including groups.
34
54
  ParseConfig.get_groups() returns available sub-groups.
35
55
  - See the demo.rb and demo.conf files which have been updated to reflect
36
56
  this update.
@@ -39,44 +59,44 @@ Mon Aug 31, 2009 - v0.5
39
59
 
40
60
  Sat Mar 28, 2009 - v0.4.3
41
61
  - Added the self.params member that is a Hash holding all parameter/values.
42
- - Added the 'get_params' to return an array of all config parameters.
62
+ - Added the 'get_params' to return an array of all config parameters.
43
63
 
44
64
  Thu Feb 28, 2008 - v0.4.2
45
- - Fixed bug where if the value contains a '=' then the parameter
65
+ - Fixed bug where if the value contains a '=' then the parameter
46
66
  is not properly set. [bjd]
47
- - Fixed bug #13680 Unable to parse config options that contain
48
- single quotes. [bjd]
67
+ - Fixed bug #13680 Unable to parse config options that contain
68
+ single quotes. [bjd]
49
69
 
50
70
  Sun Sep 03, 2007 - v0.4.1
51
71
  - Now using 'instance_variable_set' and 'instance_variable_get'
52
- instead of 'eval' (yeah.. that was dirty). [bjd]
72
+ instead of 'eval' (yeah.. that was dirty). [bjd]
53
73
 
54
74
 
55
75
  Sat Aug 11, 2007 - v0.3.2
56
- - reorganizing files a bit. [bjd]
57
- - renamed methods .... no more uglyStyle... now new_style. [bjd]
76
+ - reorganizing files a bit. [bjd]
77
+ - renamed methods .... no more uglyStyle... now new_style. [bjd]
58
78
 
59
79
 
60
80
  Fri Feb 23, 2007 - v0.3.1
61
81
  - Added a bit of code to remove 'single' quotes... so, until I figure
62
- a better option, values can't contain single quotes. [bjd]
82
+ a better option, values can't contain single quotes. [bjd]
63
83
 
64
84
 
65
85
  Wed Feb 07, 2007 - v0.2.1
66
- - Renamed ParseConfig.class.rb to ParseConfig.rb. [bjd]
67
- - Add 'strip' to remove trailing white spaces from config file. [bjd]
86
+ - Renamed ParseConfig.class.rb to ParseConfig.rb. [bjd]
87
+ - Add 'strip' to remove trailing white spaces from config file. [bjd]
68
88
 
69
89
 
70
90
  Wed Dec 13, 2006 - v0.1.3
71
- - Added error check to ensure configFile is readable. [bjd]
91
+ - Added error check to ensure configFile is readable. [bjd]
72
92
 
73
93
 
74
94
  Sat Nov 25, 2006 - v0.1.2
75
95
  - Added regex to only read lines matching /\s*=\s*/ as
76
- The class would bork if you had say, and empty line. [bjd]
96
+ The class would bork if you had say, and empty line. [bjd]
77
97
 
78
98
 
79
99
  Fri Nov 24 2006 - v0.1.1
80
- - Built class, which is functional and fully usable. [bjd]
100
+ - Built class, which is functional and fully usable. [bjd]
81
101
 
82
102
 
data/LICENSE CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  The MIT License:
3
3
 
4
- Copyright (c) 2006-2012 BJ Dierkes
4
+ Copyright (c) 2006-2016 Data Folk Labs, LLC
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,75 +1,91 @@
1
- Ruby ParseConfig Library
2
- ========================
1
+ # Ruby ParseConfig Library
3
2
 
4
- ParseConfig provides simple parsing of standard configuration files in the
5
- form of 'param = value'. It also supports nested [group] sections.
3
+ ParseConfig provides simple parsing of standard configuration files in the
4
+ form of `param = value`. It also supports nested `[group]` sections.
6
5
 
7
- [![Continuous Integration Status](https://secure.travis-ci.org/derks/ruby-parseconfig.png)](http://travis-ci.org/derks/ruby-parseconfig)
6
+ [![Continuous Integration Status](https://secure.travis-ci.org/datafolklabs/ruby-parseconfig.png)](http://travis-ci.org/datafolklabs/ruby-parseconfig)
8
7
 
9
- Installation
10
- ------------
8
+ ## Installation
11
9
 
12
- $ sudo gem install parseconfig
10
+ ```
11
+ $ gem install parseconfig
12
+ ```
13
13
 
14
- Usage
15
- -----
14
+ Gemfile
15
+
16
+ ```
17
+ gem 'parseconfig'
18
+ ```
19
+
20
+ ## Usage
16
21
 
17
22
  An example configuration file might look like:
18
23
 
19
- # Example Config
20
- param1 = value1
21
- param2 = value2
22
-
23
- [group1]
24
- group1_param1 = group1_value1
25
- group1_param2 = group1_value2
26
-
27
- [group2]
28
- group2_param1 = group2_value1
29
- group2_param2 = group2_value2
30
-
24
+ ```
25
+ # Example Config
26
+ param1 = value1
27
+ param2 = value2
28
+
29
+ [group1]
30
+ group1_param1 = group1_value1
31
+ group1_param2 = group1_value2
32
+
33
+ [group2]
34
+ group2_param1 = group2_value1
35
+ group2_param2 = group2_value2
36
+ ```
31
37
 
32
38
  Access it with ParseConfig:
33
39
 
34
- >> require('parseconfig.rb')
35
- => true
36
-
37
- >> config = ParseConfig.new('/path/to/config/file')
38
- => #<ParseConfig:0x102410908
39
- @config_file="example.conf",
40
- @groups=["group1", "group2"],
41
- @params={
40
+ ```ruby
41
+ >> require 'parseconfig'
42
+ => true
43
+
44
+ >> config = ParseConfig.new('/path/to/config/example.conf')
45
+ => #<ParseConfig:0x102410908
46
+ @config_file="example.conf",
47
+ @groups=["group1", "group2"],
48
+ @params={
49
+ "param1"=>"value1"
50
+ "param2"=>"value2",
51
+ "group1"=>{
42
52
  "param1"=>"value1"
43
53
  "param2"=>"value2",
44
- "group1"=>{
45
- "param1"=>"value1"
46
- "param2"=>"value2",
47
- },
48
- "group2"=>{
49
- "param1"=>"value1"
50
- "param2"=>"value2",
51
- },
52
- }
53
- >
54
-
55
- >> config.get_params()
56
- => ["param1", "param2", "group1", "group2"]
57
-
58
- >> config['param1']
59
- => "value1"
60
-
61
- >> config.get_groups()
62
- => ["group1", "group2"]
63
-
64
- >> config['group1']
65
- => {"group1_param1"=>"group1_value1", "group1_param2"=>"group1_value2"}
66
-
67
- >> config['group1']['group1_param1']
68
- => "group1_value1"
69
-
70
-
71
- License
72
- -------
54
+ },
55
+ "group2"=>{
56
+ "param1"=>"value1"
57
+ "param2"=>"value2",
58
+ },
59
+ }>
60
+
61
+ >> config.get_params
62
+ => ["param1", "param2", "group1", "group2"]
63
+
64
+ >> config['param1']
65
+ => "value1"
66
+
67
+ >> config.get_groups
68
+ => ["group1", "group2"]
69
+
70
+ >> config['group1']
71
+ => {"group1_param1"=>"group1_value1", "group1_param2"=>"group1_value2"}
72
+
73
+ >> config['group1']['group1_param1']
74
+ => "group1_value1"
75
+
76
+ >> file = File.open('/path/to/config/file', 'w')
77
+ => #<File:file>
78
+
79
+ >> config.write(file)
80
+ => []
81
+
82
+ >> file.close
83
+ => nil
84
+
85
+ ```
86
+
87
+ ## License
73
88
 
74
89
  The ParseConfig library is Open Source and distributed under the MIT license.
75
90
  Please see the LICENSE file included with this software.
91
+
@@ -1,25 +1,22 @@
1
- #
2
- # Author:: BJ Dierkes <derks@bjdierkes.com>
3
- # Copyright:: Copyright (c) 2006,2012 BJ Dierkes
4
- # License:: MIT
5
- # URL:: https://github.com/derks/ruby-parseconfig
6
- #
1
+ #
2
+ # Author:: BJ Dierkes <derks@datafolklabs.com>
3
+ # Copyright:: Copyright (c) 2006,2016 Data Folk Labs, LLC
4
+ # License:: MIT
5
+ # URL:: https://github.com/datafolklabs/ruby-parseconfig
6
+ #
7
7
 
8
8
  # This class was written to simplify the parsing of configuration
9
- # files in the format of "param = value". Please review the
9
+ # files in the format of "param = value". Please review the
10
10
  # demo files included with this package.
11
11
  #
12
12
  # For further information please refer to the './doc' directory
13
13
  # as well as the ChangeLog and README files included.
14
14
  #
15
15
 
16
- # Note: A group is a set of parameters defined for a subpart of a
16
+ # Note: A group is a set of parameters defined for a subpart of a
17
17
  # config file
18
18
 
19
19
  class ParseConfig
20
-
21
- Version = '1.0.2'
22
-
23
20
  attr_accessor :config_file, :params, :groups
24
21
 
25
22
  # Initialize the class with the path to the 'config_file'
@@ -28,128 +25,151 @@ class ParseConfig
28
25
  # the config file is 'param = value' then the itializer
29
26
  # will eval "@param = value"
30
27
  #
31
- def initialize(config_file=nil)
28
+ def initialize(config_file = nil, separator = '=', comments = ['#', ';'])
32
29
  @config_file = config_file
33
30
  @params = {}
34
31
  @groups = []
35
-
36
- if(self.config_file)
37
- self.validate_config()
38
- self.import_config()
39
- end
32
+ @split_regex = '\s*' + separator + '\s*'
33
+ @comments = comments
34
+
35
+ return unless config_file
36
+
37
+ validate_config
38
+ import_config
40
39
  end
41
-
40
+
42
41
  # Validate the config file, and contents
43
- def validate_config()
44
- if !File.readable?(self.config_file)
45
- raise Errno::EACCES, "#{self.config_file} is not readable"
46
- end
47
-
42
+ def validate_config
43
+ return if File.readable?(config_file)
44
+
45
+ raise Errno::EACCES, "#{config_file} is not readable"
46
+
48
47
  # FIX ME: need to validate contents/structure?
49
- end
50
-
48
+ end
49
+
51
50
  # Import data from the config to our config object.
52
- def import_config()
51
+ def import_config
53
52
  # The config is top down.. anything after a [group] gets added as part
54
- # of that group until a new [group] is found.
53
+ # of that group until a new [group] is found.
55
54
  group = nil
56
- open(self.config_file) { |f| f.each do |line|
57
- line.strip!
58
- unless (/^\#/.match(line))
59
- if(/\s*=\s*/.match(line))
60
- param, value = line.split(/\s*=\s*/, 2)
61
- var_name = "#{param}".chomp.strip
62
- value = value.chomp.strip
63
- new_value = ''
64
- if (value)
65
- if value =~ /^['"](.*)['"]$/
66
- new_value = $1
55
+ open(config_file) do |f|
56
+ f.each_with_index do |line, i|
57
+ line.strip!
58
+
59
+ # force_encoding not available in all versions of ruby
60
+ begin
61
+ if i.eql? 0 && line.include?("\xef\xbb\xbf".force_encoding('UTF-8'))
62
+ line.delete!("\xef\xbb\xbf".force_encoding('UTF-8'))
63
+ end
64
+ rescue NoMethodError
65
+ end
66
+
67
+ is_comment = false
68
+ @comments.each do |comment|
69
+ if /^#{comment}/.match(line)
70
+ is_comment = true
71
+ break
72
+ end
73
+ end
74
+
75
+ unless is_comment
76
+ if /#{@split_regex}/.match(line)
77
+ param, value = line.split(/#{@split_regex}/, 2)
78
+ var_name = param.to_s.chomp.strip
79
+ value = value.chomp.strip
80
+ new_value = ''
81
+ if value
82
+ if value =~ /^['"](.*)['"]$/
83
+ new_value = Regexp.last_match(1)
84
+ else
85
+ new_value = value
86
+ end
67
87
  else
68
- new_value = value
88
+ new_value = ''
69
89
  end
70
- else
71
- new_value = ''
72
- end
73
90
 
74
- if group
75
- self.add_to_group(group, var_name, new_value)
76
- else
77
- self.add(var_name, new_value)
91
+ if group
92
+ add_to_group(group, var_name, new_value)
93
+ else
94
+ add(var_name, new_value)
95
+ end
96
+ elsif /^\[(.+)\]$/.match(line).to_a != []
97
+ group = /^\[(.+)\]$/.match(line).to_a[1]
98
+ add(group, {})
99
+ elsif /\w+/.match(line)
100
+ add(line.to_s.chomp.strip, true)
78
101
  end
79
-
80
- elsif(/^\[(.+)\]$/.match(line).to_a != [])
81
- group = /^\[(.+)\]$/.match(line).to_a[1]
82
- self.add(group, {})
83
-
84
102
  end
85
103
  end
86
- end }
104
+ end
87
105
  end
88
106
 
89
107
  # This method will provide the value held by the object "@param"
90
- # where "@param" is actually the name of the param in the config
91
- # file.
108
+ # where "@param" is actually the name of the param in the config
109
+ # file.
92
110
  #
93
111
  # DEPRECATED - will be removed in future versions
94
112
  #
95
113
  def get_value(param)
96
- puts "ParseConfig Deprecation Warning: get_value() is deprecated. Use " + \
114
+ puts 'ParseConfig Deprecation Warning: get_value() is deprecated. Use ' \
97
115
  "config['param'] or config['group']['param'] instead."
98
- return self.params[param]
116
+ params[param]
99
117
  end
100
118
 
101
119
  # This method is a shortcut to accessing the @params variable
102
120
  def [](param)
103
- return self.params[param]
121
+ params[param]
104
122
  end
105
123
 
106
124
  # This method returns all parameters/groups defined in a config file.
107
- def get_params()
108
- return self.params.keys
125
+ def get_params
126
+ params.keys
109
127
  end
110
-
128
+
111
129
  # List available sub-groups of the config.
112
- def get_groups()
113
- return self.groups
130
+ def get_groups
131
+ groups
114
132
  end
115
133
 
116
134
  # This method adds an element to the config object (not the config file)
117
135
  # By adding a Hash, you create a new group
118
- def add(param_name, value)
136
+ def add(param_name, value, override = false)
119
137
  if value.class == Hash
120
- if self.params.has_key?(param_name)
121
- if self.params[param_name].class == Hash
122
- self.params[param_name].merge!(value)
123
- elsif self.params.has_key?(param_name)
124
- if self.params[param_name].class != value.class
138
+ if params.key? param_name
139
+ if params[param_name].class == Hash
140
+ if override
141
+ params[param_name] = value
142
+ else
143
+ params[param_name].merge!(value)
144
+ end
145
+ elsif params.key? param_name
146
+ if params[param_name].class != value.class
125
147
  raise ArgumentError, "#{param_name} already exists, and is of different type!"
126
148
  end
127
149
  end
128
150
  else
129
- self.params[param_name] = value
151
+ params[param_name] = value
130
152
  end
131
- if ! self.groups.include?(param_name)
132
- self.groups.push(param_name)
153
+ unless groups.include?(param_name)
154
+ groups.push(param_name)
133
155
  end
134
156
  else
135
- self.params[param_name] = value
157
+ params[param_name] = value
136
158
  end
137
159
  end
138
160
 
139
161
  # Add parameters to a group. Note that parameters with the same name
140
162
  # could be placed in different groups
141
163
  def add_to_group(group, param_name, value)
142
- if ! self.groups.include?(group)
143
- self.add(group, {})
144
- end
145
- self.params[group][param_name] = value
164
+ add(group, {}) unless groups.include?(group)
165
+ params[group][param_name] = value
146
166
  end
147
167
 
148
168
  # Writes out the config file to output_stream
149
- def write(output_stream=STDOUT)
150
- self.params.each do |name,value|
169
+ def write(output_stream = STDOUT, quoted = true)
170
+ params.each do |name, value|
151
171
  if value.class.to_s != 'Hash'
152
- if value.scan(/\w+/).length > 1
172
+ if quoted == true
153
173
  output_stream.puts "#{name} = \"#{value}\""
154
174
  else
155
175
  output_stream.puts "#{name} = #{value}"
@@ -157,11 +177,11 @@ class ParseConfig
157
177
  end
158
178
  end
159
179
  output_stream.puts "\n"
160
-
161
- self.groups.each do |group|
180
+
181
+ groups.each do |group|
162
182
  output_stream.puts "[#{group}]"
163
- self.params[group].each do |param, value|
164
- if value.scan(/\w+/).length > 1
183
+ params[group].each do |param, value|
184
+ if quoted == true
165
185
  output_stream.puts "#{param} = \"#{value}\""
166
186
  else
167
187
  output_stream.puts "#{param} = #{value}"
@@ -170,4 +190,16 @@ class ParseConfig
170
190
  output_stream.puts "\n"
171
191
  end
172
192
  end
193
+
194
+ # Public: Compare this ParseConfig to some other ParseConfig. For two config to
195
+ # be equivalent, they must have the same sections with the same parameters
196
+ #
197
+ # other - The other ParseConfig.
198
+ #
199
+ # Returns true if ParseConfig are equivalent and false if they differ.
200
+
201
+ def eql?(other)
202
+ params == other.params && groups == other.groups
203
+ end
204
+ alias == eql?
173
205
  end
@@ -0,0 +1,3 @@
1
+ module ParseConfig
2
+ VERSION = '1.1.0'.freeze
3
+ end
metadata CHANGED
@@ -1,65 +1,47 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: parseconfig
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 2
9
- version: 1.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - BJ Dierkes
13
- autorequire:
8
+ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2012-06-12 00:00:00 -05:00
18
- default_executable:
11
+ date: 2020-09-28 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
- description: ParseConfig provides simple parsing of standard configuration files in the form of 'param = value'. It also supports nested [group] sections.
22
- email: derks@bjdierkes.com
13
+ description: ParseConfig provides simple parsing of standardconfiguration files in
14
+ the form of 'param = value'. It also supports nested [group] sections.
15
+ email: derks@datafolklabs.com
23
16
  executables: []
24
-
25
17
  extensions: []
26
-
27
18
  extra_rdoc_files: []
28
-
29
- files:
30
- - README.md
19
+ files:
31
20
  - Changelog
32
21
  - LICENSE
22
+ - README.md
33
23
  - lib/parseconfig.rb
34
- has_rdoc: true
35
- homepage: http://github.com/derks/ruby-parseconfig/
24
+ - lib/version.rb
25
+ homepage: http://github.com/datafolklabs/ruby-parseconfig/
36
26
  licenses: []
37
-
38
- post_install_message:
27
+ metadata: {}
28
+ post_install_message:
39
29
  rdoc_options: []
40
-
41
- require_paths:
30
+ require_paths:
42
31
  - lib
43
- required_ruby_version: !ruby/object:Gem::Requirement
44
- requirements:
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
45
34
  - - ">="
46
- - !ruby/object:Gem::Version
47
- segments:
48
- - 0
49
- version: "0"
50
- required_rubygems_version: !ruby/object:Gem::Requirement
51
- requirements:
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
52
39
  - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- version: "0"
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
57
42
  requirements: []
58
-
59
- rubyforge_project:
60
- rubygems_version: 1.3.6
61
- signing_key:
62
- specification_version: 3
43
+ rubygems_version: 3.0.6
44
+ signing_key:
45
+ specification_version: 4
63
46
  summary: Config File Parser for Standard Unix/Linux Type Config Files
64
47
  test_files: []
65
-