Taxonomic classifications in MiGA.
Default parsing options. Supported opts keys:
:contents: If true, the input is assumed to be the contents to
parse, not the path to a JSON file.
:default: A base to attach the parsed hash. A Hash or a String (path).
:additions: If addition classes should be parsed. By default
is false.
:symbolize: If names should be symbolized. By default it's
true if additions is false, or false otherwise. They can both be false, but
an exception will be raised if both are true
:large_file: If passed, the file is treated as a file with
very long lines (possibly a single long line)
# File lib/miga/json.rb, line 26 def default_opts(opts = {}) opts[:contents] ||= false opts[:additions] ||= false opts[:symbolize] = !opts[:additions] if opts[:symbolize].nil? if opts[:additions] and opts[:symbolize] raise 'JSON additions are not supported with symbolized names' end opts end
Generates and returns prettyfied JSON to represent obj. If
path is passed, it saves the JSON in that file.
# File lib/miga/json.rb, line 82 def generate(obj, path = nil) generate_generic(:pretty_generate, obj, path) end
Generates and returns plain JSON to represent obj without
checking for circular references. If path is passed, it saves
the JSON in that file.
# File lib/miga/json.rb, line 96 def generate_fast(obj, path = nil) generate_generic(:fast_generate, obj, path) end
Generates and returns plain JSON to represent obj. If
path is passed, it saves the JSON in that file.
# File lib/miga/json.rb, line 89 def generate_plain(obj, path = nil) generate_generic(:generate, obj, path) end
Parse a JSON file in path and return a hash. Optionally, use
default as the base to attach the parsed hash.
default can be a Hash or a String
(path). See default_opts for supported opts.
# File lib/miga/json.rb, line 42 def parse(path, opts = {}) opts = default_opts(opts) # Read JSON cont = path if opts[:large_file] cont = '' File.open(path, 'r') do |fh| cont += fh.read(2 ** 16) until fh.eof? end elsif !opts[:contents] 12.times do cont = File.read(path) break unless cont.empty? sleep 1 # Wait up to 12 seconds for racing processes (iff empty file) end end raise "Empty descriptor: #{opts[:contents] ? "''" : path}" if cont.empty? # Parse JSON params = { symbolize_names: opts[:symbolize], create_additions: opts[:additions] } y = JSON.parse(cont, params) # Add defaults unless opts[:default].nil? opts[:default] = parse(opts[:default]) if opts[:default].is_a? String y.each { |k, v| opts[:default][k] = v } y = opts[:default] end # Return y end