Class: Cosmos::ConfigParser
- Defined in:
- lib/cosmos/config/config_parser.rb
Overview
Reads COSMOS style configuration data which consists of keywords followed by 0 or more comma delimited parameters. Parameters with spaces must be enclosed in quotes. Quotes should also be used to indicate a parameter is a string. Keywords are case-insensitive and will be returned in uppercase.
Defined Under Namespace
Classes: Error
Constant Summary collapse
- PARSING_REGEX =
Regular expression used to break up an individual line into a keyword and comma delimited parameters. Handles parameters in single or double quotes.
%r{ (?:"(?:[^\\"]|\\.)*") | (?:'(?:[^\\']|\\.)*') | \S+ }x
- @@message_callback =
nil- @@progress_callback =
nil- @@splash =
Holds the current splash screen
nil
Instance Attribute Summary collapse
-
#filename ⇒ String
The name of the configuration file being parsed.
-
#keyword ⇒ String
The current keyword being parsed.
-
#line ⇒ String
The current line being parsed.
-
#line_number ⇒ Integer
The current line number being parsed.
-
#parameters ⇒ Array<String>
The parameters found after the keyword.
-
#url ⇒ String
The default URL to use in errors.
Class Method Summary collapse
-
.handle_defined_constants(value, data_type = nil, bit_size = nil) ⇒ Numeric
Converts a string representing a defined constant into its value.
-
.handle_nil(value) ⇒ nil|Object
Converts a String containing ”, ‘NIL’ or ‘NULL’ to nil Ruby primitive.
-
.handle_true_false(value) ⇒ true|false|Object
Converts a String containing ‘TRUE’ or ‘FALSE’ to true or false Ruby primitive.
-
.handle_true_false_nil(value) ⇒ true|false|nil|Object
Converts a String containing ”, ‘NIL’, ‘NULL’, ‘TRUE’ or ‘FALSE’ to nil, true or false Ruby primitives.
- .message_callback=(message_callback) ⇒ Object
- .progress_callback=(progress_callback) ⇒ Object
-
.splash ⇒ Object
Returns the current splash screen if present.
- .splash=(splash) ⇒ Object
Instance Method Summary collapse
-
#error(message, usage = "", url = @url) ⇒ Error
Creates an Error.
-
#initialize(url = "http://cosmosrb.com/docs/home") ⇒ ConfigParser
constructor
A new instance of ConfigParser.
-
#parse_file(filename, yield_non_keyword_lines = false, remove_quotes = true, &block) {|keyword, parameters| ... } ⇒ Object
Processes a file and yields |config| to the given block.
-
#render(template_name, options = {}) ⇒ Object
Called by the ERB template to render a partial.
-
#verify_num_parameters(min_num_params, max_num_params, usage = "") ⇒ Object
Verifies the parameters in the config parameter have the specified number of parameter and raises an Error if not.
Constructor Details
#initialize(url = "http://cosmosrb.com/docs/home") ⇒ ConfigParser
Returns a new instance of ConfigParser.
133 134 135 |
# File 'lib/cosmos/config/config_parser.rb', line 133 def initialize(url = "http://cosmosrb.com/docs/home") @url = url end |
Instance Attribute Details
#filename ⇒ String
Returns The name of the configuration file being parsed. This will be an empty string if the parse_string class method is used.
29 30 31 |
# File 'lib/cosmos/config/config_parser.rb', line 29 def filename @filename end |
#keyword ⇒ String
Returns The current keyword being parsed.
22 23 24 |
# File 'lib/cosmos/config/config_parser.rb', line 22 def keyword @keyword end |
#line ⇒ String
Returns The current line being parsed. This is the raw string which is useful when printing errors.
33 34 35 |
# File 'lib/cosmos/config/config_parser.rb', line 33 def line @line end |
#line_number ⇒ Integer
Returns The current line number being parsed. This will still be populated when using parse_string because lines still must be delimited by newline characters.
38 39 40 |
# File 'lib/cosmos/config/config_parser.rb', line 38 def line_number @line_number end |
#parameters ⇒ Array<String>
Returns The parameters found after the keyword.
25 26 27 |
# File 'lib/cosmos/config/config_parser.rb', line 25 def parameters @parameters end |
#url ⇒ String
Returns The default URL to use in errors. The URL can still be overridden by directly passing it to the error method.
42 43 44 |
# File 'lib/cosmos/config/config_parser.rb', line 42 def url @url end |
Class Method Details
.handle_defined_constants(value, data_type = nil, bit_size = nil) ⇒ Numeric
Converts a string representing a defined constant into its value. The defined constants are the minimum and maximum values for all the allowable data types. [MIN/MAX]_[U]INT and [MIN/MAX]_FLOAT. Thus MIN_UINT8, MAX_INT32, and MIN_FLOAT64 are all allowable values. Any other strings raise ArgumentError but all other types are simply returned.
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 |
# File 'lib/cosmos/config/config_parser.rb', line 294 def self.handle_defined_constants(value, data_type = nil, bit_size = nil) if value.class == String case value.upcase when 'MIN', 'MAX' return self.calculate_range_value(value.upcase, data_type, bit_size) when 'MIN_INT8' return -128 when 'MAX_INT8' return 127 when 'MIN_INT16' return -32768 when 'MAX_INT16' return 32767 when 'MIN_INT32' return -2147483648 when 'MAX_INT32' return 2147483647 when 'MIN_INT64' return -9223372036854775808 when 'MAX_INT64' return 9223372036854775807 when 'MIN_UINT8', 'MIN_UINT16', 'MIN_UINT32', 'MIN_UINT64' return 0 when 'MAX_UINT8' return 255 when 'MAX_UINT16' return 65535 when 'MAX_UINT32' return 4294967295 when 'MAX_UINT64' return 18446744073709551615 when 'MIN_FLOAT64' return -Float::MAX when 'MAX_FLOAT64' return Float::MAX when 'MIN_FLOAT32' return -3.402823e38 when 'MAX_FLOAT32' return 3.402823e38 when 'POS_INFINITY' return Float::INFINITY when 'NEG_INFINITY' return -Float::INFINITY else raise ArgumentError, "Could not convert constant: #{value}" end end return value end |
.handle_nil(value) ⇒ nil|Object
Converts a String containing ”, ‘NIL’ or ‘NULL’ to nil Ruby primitive. All other arguments are simply returned.
239 240 241 242 243 244 245 246 247 |
# File 'lib/cosmos/config/config_parser.rb', line 239 def self.handle_nil(value) if String === value case value.upcase when '', 'NIL', 'NULL' return nil end end return value end |
.handle_true_false(value) ⇒ true|false|Object
Converts a String containing ‘TRUE’ or ‘FALSE’ to true or false Ruby primitive. All other values are simply returned.
254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/cosmos/config/config_parser.rb', line 254 def self.handle_true_false(value) if String === value case value.upcase when 'TRUE' return true when 'FALSE' return false end end return value end |
.handle_true_false_nil(value) ⇒ true|false|nil|Object
Converts a String containing ”, ‘NIL’, ‘NULL’, ‘TRUE’ or ‘FALSE’ to nil, true or false Ruby primitives. All other values are simply returned.
271 272 273 274 275 276 277 278 279 280 281 282 283 |
# File 'lib/cosmos/config/config_parser.rb', line 271 def self.handle_true_false_nil(value) if String === value case value.upcase when 'TRUE' return true when 'FALSE' return false when '', 'NIL', 'NULL' return nil end end return value end |
.message_callback=(message_callback) ⇒ Object
49 50 51 |
# File 'lib/cosmos/config/config_parser.rb', line 49 def self.=() = end |
.progress_callback=(progress_callback) ⇒ Object
59 60 61 |
# File 'lib/cosmos/config/config_parser.rb', line 59 def self.progress_callback=(progress_callback) @@progress_callback = progress_callback end |
.splash ⇒ Object
Returns the current splash screen if present
81 82 83 |
# File 'lib/cosmos/config/config_parser.rb', line 81 def self.splash @@splash end |
.splash=(splash) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/cosmos/config/config_parser.rb', line 68 def self.splash=(splash) if splash @@splash = splash @@progress_callback = splash.progress_callback = splash. else @@splash = nil @@progress_callback = nil = nil end end |
Instance Method Details
#error(message, usage = "", url = @url) ⇒ Error
Creates an Error
143 144 145 |
# File 'lib/cosmos/config/config_parser.rb', line 143 def error(, usage = "", url = @url) return Error.new(self, , usage, url) end |
#parse_file(filename, yield_non_keyword_lines = false, remove_quotes = true, &block) {|keyword, parameters| ... } ⇒ Object
Processes a file and yields |config| to the given block
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/cosmos/config/config_parser.rb', line 183 def parse_file(filename, yield_non_keyword_lines = false, remove_quotes = true, &block) raise Error.new(self, "Configuration file #{filename} does not exist.") unless filename && File.exist?(filename) @filename = filename # Create a temp file where we write the ERB parsed output file = create_parsed_output_file(filename) size = file.stat.size.to_f # Callbacks for beginning of parsing .call("Parsing #{size} bytes of #{filename}") if @@progress_callback.call(0.0) if @@progress_callback begin # Loop through each line of the data parse_loop(file, yield_non_keyword_lines, remove_quotes, size, PARSING_REGEX, &block) rescue Exception => e # Catch EVERYTHING so we can re-raise with additional info raise e, "#{e}\n\nParsed output in #{file.path}", e.backtrace ensure file.close unless file.closed? end end |
#render(template_name, options = {}) ⇒ Object
Called by the ERB template to render a partial
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/cosmos/config/config_parser.rb', line 148 def render(template_name, = {}) raise Error.new(self, "Partial name '#{template_name}' must begin with an underscore.") if File.basename(template_name)[0] != '_' b = binding if [:locals] if RUBY_VERSION.split('.')[0..1].join.to_i >= 21 [:locals].each {|key, value| b.local_variable_set(key, value) } else [:locals].each do |key, value| if value.is_a? String b.eval("#{key} = '#{value}'") else b.eval("#{key} = #{value}") end end end end # Assume the file is there. If not we raise a pretty obvious error if File.(template_name) == template_name # absolute path path = template_name else # relative to the current @filename path = File.join(File.dirname(@filename), template_name) end ERB.new(File.read(path)).result(b) end |
#verify_num_parameters(min_num_params, max_num_params, usage = "") ⇒ Object
Verifies the parameters in the config parameter have the specified number of parameter and raises an Error if not.
219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/cosmos/config/config_parser.rb', line 219 def verify_num_parameters(min_num_params, max_num_params, usage = "") # This syntax works with 0 because each doesn't return any values # for a backwards range (1..min_num_params).each do |index| # If the parameter is nil (0 based) then we have a problem if @parameters[index - 1].nil? raise Error.new(self, "Not enough parameters for #{@keyword}.", usage, @url) end end # If they pass nil for max_params we don't check for a maximum number if max_num_params && !@parameters[max_num_params].nil? raise Error.new(self, "Too many parameters for #{@keyword}.", usage, @url) end end |