Class: MiGA::Json

Inherits:
MiGA
  • Object
show all
Defined in:
lib/miga/json.rb

Overview

Taxonomic classifications in MiGA.

Constant Summary

Constants included from MiGA

CITATION, VERSION, VERSION_DATE, VERSION_NAME

Instance Attribute Summary

Attributes included from Common::Net

#remote_connection_uri

Class Method Summary collapse

Methods inherited from MiGA

CITATION, CITATION_ARRAY, DEBUG, DEBUG_OFF, DEBUG_ON, DEBUG_TRACE_OFF, DEBUG_TRACE_ON, FULL_VERSION, LONG_VERSION, VERSION, VERSION_DATE, #advance, debug?, debug_trace?, initialized?, #like_io?, #num_suffix, rc_path, #result_files_exist?, #say

Methods included from Common::Path

#root_path, #script_path

Methods included from Common::Format

#clean_fasta_file, #seqs_length, #tabulate

Methods included from Common::Net

#download_file_ftp, #http_request, #known_hosts, #main_server, #net_method, #normalize_encoding, #remote_connection

Methods included from Common::SystemCall

#run_cmd, #run_cmd_opts

Class Method Details

.default_opts(opts = {}) ⇒ Object

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)



26
27
28
29
30
31
32
33
34
35
# 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

.generate(obj, path = nil) ⇒ Object

Generates and returns prettyfied JSON to represent obj. If path is passed, it saves the JSON in that file.



82
83
84
# File 'lib/miga/json.rb', line 82

def generate(obj, path = nil)
  generate_generic(:pretty_generate, obj, path)
end

.generate_fast(obj, path = nil) ⇒ Object

Generates and returns plain JSON to represent obj without checking for circular references. If path is passed, it saves the JSON in that file.



96
97
98
# File 'lib/miga/json.rb', line 96

def generate_fast(obj, path = nil)
  generate_generic(:fast_generate, obj, path)
end

.generate_plain(obj, path = nil) ⇒ Object

Generates and returns plain JSON to represent obj. If path is passed, it saves the JSON in that file.



89
90
91
# File 'lib/miga/json.rb', line 89

def generate_plain(obj, path = nil)
  generate_generic(:generate, obj, path)
end

.parse(path, opts = {}) ⇒ Object

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.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 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