miga-base 0.7.13.2 → 0.7.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/miga/cli.rb +3 -24
- data/lib/miga/cli/action/browse.rb +4 -4
- data/lib/miga/cli/action/classify_wf.rb +1 -3
- data/lib/miga/cli/action/daemon.rb +6 -1
- data/lib/miga/cli/action/quality_wf.rb +2 -5
- data/lib/miga/cli/action/wf.rb +4 -4
- data/lib/miga/common.rb +35 -2
- data/lib/miga/daemon.rb +13 -3
- data/lib/miga/daemon/base.rb +25 -1
- data/lib/miga/version.rb +2 -2
- data/test/daemon_test.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0160b454e26886637f28dea78ab57e66b1c53ee3fca610c64339f3265ce86afb
         | 
| 4 | 
            +
              data.tar.gz: 6df1a7bfc7ebf0493265cd6be8f8600a575b3c20f07ec43f7c25b8de3035b5c8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 00245e9a4d698ed335f1777bd1f9156ecc2ba325c4ef66f42f01f9e59c70e4bfb42a588a7be62271dd55df73e2fc737a29e24253487ba55e9d8645a43508d91c
         | 
| 7 | 
            +
              data.tar.gz: 12c8beb33f81fc7114d957a59982d4bfab1deceb21db27dde1a93f474d4ab5918308ac04d351c86b9a71f8a6804e0311b3230ccbad16de320523246f1e7e3f9b
         | 
    
        data/lib/miga/cli.rb
    CHANGED
    
    | @@ -110,30 +110,9 @@ class MiGA::Cli < MiGA::MiGA | |
| 110 110 | 
             
              end
         | 
| 111 111 |  | 
| 112 112 | 
             
              ##
         | 
| 113 | 
            -
              #  | 
| 114 | 
            -
               | 
| 115 | 
            -
             | 
| 116 | 
            -
              # The report goes to $stderr iff --verborse
         | 
| 117 | 
            -
              def advance(step, n = 0, total = nil, bin = true)
         | 
| 118 | 
            -
                return unless self[:verbose]
         | 
| 119 | 
            -
             | 
| 120 | 
            -
                adv = total.nil? ? (n == 0 ? '' : num_suffix(n, bin)) :
         | 
| 121 | 
            -
                  ('%.1f%% (%s/%s)' % [100.0 * n / total,
         | 
| 122 | 
            -
                                       num_suffix(n, bin), num_suffix(total, bin)])
         | 
| 123 | 
            -
                $stderr.print("[%s] %s %s    \r" % [Time.now, step, adv])
         | 
| 124 | 
            -
              end
         | 
| 125 | 
            -
             | 
| 126 | 
            -
              def num_suffix(n, bin = false)
         | 
| 127 | 
            -
                p = ''
         | 
| 128 | 
            -
                { T: 4, G: 3, M: 2, K: 1 }.each do |k, x|
         | 
| 129 | 
            -
                  v = (bin ? 1024 : 1e3)**x
         | 
| 130 | 
            -
                  if n > v
         | 
| 131 | 
            -
                    n = '%.1f' % (n / v)
         | 
| 132 | 
            -
                    p = k
         | 
| 133 | 
            -
                    break
         | 
| 134 | 
            -
                  end
         | 
| 135 | 
            -
                end
         | 
| 136 | 
            -
                "#{n}#{p}"
         | 
| 113 | 
            +
              # Same as MiGA::MiGA#advance, but checks if the CLI is verbose
         | 
| 114 | 
            +
              def advance(*par)
         | 
| 115 | 
            +
                super(*par) if self[:verbose]
         | 
| 137 116 | 
             
              end
         | 
| 138 117 |  | 
| 139 118 | 
             
              ##
         | 
| @@ -15,12 +15,12 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action | |
| 15 15 | 
             
                p = cli.load_project
         | 
| 16 16 | 
             
                create_empty_page(p)
         | 
| 17 17 | 
             
                generate_project_page(p)
         | 
| 18 | 
            -
                say 'Creating dataset pages'
         | 
| 18 | 
            +
                cli.say 'Creating dataset pages'
         | 
| 19 19 | 
             
                cli.load_project.each_dataset do |d|
         | 
| 20 20 | 
             
                  generate_dataset_page(p, d)
         | 
| 21 21 | 
             
                end
         | 
| 22 22 | 
             
                generate_datasets_index(p)
         | 
| 23 | 
            -
                say "Open in your browser: #{File.join(p.path, 'index.html')}"
         | 
| 23 | 
            +
                cli.say "Open in your browser: #{File.join(p.path, 'index.html')}"
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 26 | 
             
              private
         | 
| @@ -28,7 +28,7 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action | |
| 28 28 | 
             
              ##
         | 
| 29 29 | 
             
              # Create an empty page with necessary assets for project +p+
         | 
| 30 30 | 
             
              def create_empty_page(p)
         | 
| 31 | 
            -
                say 'Creating project page'
         | 
| 31 | 
            +
                cli.say 'Creating project page'
         | 
| 32 32 | 
             
                FileUtils.mkdir_p(browse_file(p, '.'))
         | 
| 33 33 | 
             
                %w[favicon-32.png style.css].each do |i|
         | 
| 34 34 | 
             
                  FileUtils.cp(template_file(i), browse_file(p, i))
         | 
| @@ -103,7 +103,7 @@ class MiGA::Cli::Action::Browse < MiGA::Cli::Action | |
| 103 103 | 
             
              ##
         | 
| 104 104 | 
             
              # Create pages for reference and query dataset indexes
         | 
| 105 105 | 
             
              def generate_datasets_index(p)
         | 
| 106 | 
            -
                say 'Creating index pages'
         | 
| 106 | 
            +
                cli.say 'Creating index pages'
         | 
| 107 107 | 
             
                data = format_dataset_index(p)
         | 
| 108 108 | 
             
                data.each do |k, v|
         | 
| 109 109 | 
             
                  write_file(p, "#{k}_datasets.html") do
         | 
| @@ -42,9 +42,7 @@ class MiGA::Cli::Action::ClassifyWf < MiGA::Cli::Action | |
| 42 42 | 
             
                    '--no-summaries',
         | 
| 43 43 | 
             
                    'Do not generate intermediate step summaries'
         | 
| 44 44 | 
             
                  ) { |v| cli[:summaries] = v }
         | 
| 45 | 
            -
                  opts_for_wf(
         | 
| 46 | 
            -
                    opt, 'Input genome assemblies (nucleotides, FastA)', qual: false
         | 
| 47 | 
            -
                  )
         | 
| 45 | 
            +
                  opts_for_wf(opt, 'Input genome assemblies (nucleotides, FastA)')
         | 
| 48 46 | 
             
                end
         | 
| 49 47 | 
             
              end
         | 
| 50 48 |  | 
| @@ -6,7 +6,7 @@ require 'miga/daemon' | |
| 6 6 |  | 
| 7 7 | 
             
            class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
         | 
| 8 8 | 
             
              def parse_cli
         | 
| 9 | 
            -
                cli.defaults = { daemon_opts: [] }
         | 
| 9 | 
            +
                cli.defaults = { daemon_opts: [], show_log: false }
         | 
| 10 10 | 
             
                cli.expect_operation = true
         | 
| 11 11 | 
             
                cli.parse do |opt|
         | 
| 12 12 | 
             
                  opt.separator 'Available operations:'
         | 
| @@ -45,6 +45,10 @@ class MiGA::Cli::Action::Daemon < MiGA::Cli::Action | |
| 45 45 | 
             
                    '--json PATH',
         | 
| 46 46 | 
             
                    'Path to a custom daemon definition in json format'
         | 
| 47 47 | 
             
                  ) { |v| cli[:json] = v }
         | 
| 48 | 
            +
                  opt.on(
         | 
| 49 | 
            +
                    '--show-log',
         | 
| 50 | 
            +
                    'Display log on advance instead of the progress summary'
         | 
| 51 | 
            +
                  ) { |v| cli[:show_log] = v }
         | 
| 48 52 | 
             
                  cli.opt_common(opt)
         | 
| 49 53 |  | 
| 50 54 | 
             
                  opt.separator 'Daemon options:'
         | 
| @@ -73,6 +77,7 @@ class MiGA::Cli::Action::Daemon < MiGA::Cli::Action | |
| 73 77 | 
             
                d = MiGA::Daemon.new(p, cli[:json])
         | 
| 74 78 | 
             
                dopts = %i[latency maxjobs nodelist ppn shutdown_when_done]
         | 
| 75 79 | 
             
                dopts.each { |k| d.runopts(k, cli[k]) }
         | 
| 80 | 
            +
                d.show_log! if cli[:show_log]
         | 
| 76 81 | 
             
                d.daemon(cli.operation, cli[:daemon_opts])
         | 
| 77 82 | 
             
              end
         | 
| 78 83 | 
             
            end
         | 
| @@ -9,16 +9,13 @@ class MiGA::Cli::Action::QualityWf < MiGA::Cli::Action | |
| 9 9 |  | 
| 10 10 | 
             
              def parse_cli
         | 
| 11 11 | 
             
                default_opts_for_wf
         | 
| 12 | 
            -
                cli.defaults = { mytaxa: false }
         | 
| 12 | 
            +
                cli.defaults = { mytaxa: false, min_qual: 'no' }
         | 
| 13 13 | 
             
                cli.parse do |opt|
         | 
| 14 14 | 
             
                  opt.on(
         | 
| 15 15 | 
             
                    '-m', '--mytaxa-scan',
         | 
| 16 16 | 
             
                    'Perform MyTaxa scan analysis'
         | 
| 17 17 | 
             
                  ) { |v| cli[:mytaxa] = v }
         | 
| 18 | 
            -
                  opts_for_wf(
         | 
| 19 | 
            -
                    opt, 'Input genome assemblies (nucleotides, FastA)',
         | 
| 20 | 
            -
                    qual: false
         | 
| 21 | 
            -
                  )
         | 
| 18 | 
            +
                  opts_for_wf(opt, 'Input genome assemblies (nucleotides, FastA)')
         | 
| 22 19 | 
             
                end
         | 
| 23 20 | 
             
              end
         | 
| 24 21 |  | 
    
        data/lib/miga/cli/action/wf.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ module MiGA::Cli::Action::Wf | |
| 9 9 | 
             
                cli.defaults = {
         | 
| 10 10 | 
             
                  clean: false, regexp: MiGA::Cli.FILE_REGEXP,
         | 
| 11 11 | 
             
                  project_type: :genomes, dataset_type: :popgenome,
         | 
| 12 | 
            -
                  ncbi_draft: true
         | 
| 12 | 
            +
                  ncbi_draft: true, min_qual: 25.0
         | 
| 13 13 | 
             
                }
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| @@ -42,10 +42,10 @@ module MiGA::Cli::Action::Wf | |
| 42 42 | 
             
                end
         | 
| 43 43 | 
             
                if params[:qual]
         | 
| 44 44 | 
             
                  opt.on(
         | 
| 45 | 
            -
                    '--min-qual FLOAT', | 
| 45 | 
            +
                    '--min-qual FLOAT',
         | 
| 46 46 | 
             
                    'Minimum genome quality to include in analysis',
         | 
| 47 | 
            -
                     | 
| 48 | 
            -
                  ) { |v| cli[:min_qual] = v }
         | 
| 47 | 
            +
                    "By default: #{cli[:min_qual]}"
         | 
| 48 | 
            +
                  ) { |v| cli[:min_qual] = v == 'no' ? v : v.to_f }
         | 
| 49 49 | 
             
                end
         | 
| 50 50 | 
             
                if params[:cleanup]
         | 
| 51 51 | 
             
                  opt.on(
         | 
    
        data/lib/miga/common.rb
    CHANGED
    
    | @@ -6,6 +6,7 @@ require 'miga/json' | |
| 6 6 | 
             
            require 'miga/common/base'
         | 
| 7 7 | 
             
            require 'miga/common/path'
         | 
| 8 8 | 
             
            require 'miga/common/format'
         | 
| 9 | 
            +
            require 'stringio'
         | 
| 9 10 |  | 
| 10 11 | 
             
            ##
         | 
| 11 12 | 
             
            # Generic class used to handle system-wide information and methods, and parent
         | 
| @@ -38,10 +39,42 @@ class MiGA::MiGA | |
| 38 39 | 
             
              ##
         | 
| 39 40 | 
             
              # Print +par+ ensuring new line at the end.
         | 
| 40 41 | 
             
              # Date/time-stamp each line.
         | 
| 41 | 
            -
              # If the first parameter is +IO | 
| 42 | 
            +
              # If the first parameter is +IO+ or +StringIO+ the output is sent there,
         | 
| 42 43 | 
             
              # otherwise it's sent to +$stderr+
         | 
| 43 44 | 
             
              def say(*par)
         | 
| 44 | 
            -
                io = par.first | 
| 45 | 
            +
                io = like_io?(par.first) ? par.shift : $stderr
         | 
| 45 46 | 
             
                io.puts(*par.map { |i| "[#{Time.now}] #{i}" })
         | 
| 46 47 | 
             
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              ##
         | 
| 50 | 
            +
              # Reports the advance of a task at +step+ (String), the +n+ out of +total+.
         | 
| 51 | 
            +
              # The advance is reported in powers of 1,024 if +bin+ is true, or powers of
         | 
| 52 | 
            +
              # 1,000 otherwise.
         | 
| 53 | 
            +
              # The report goes to $stderr iff --verborse
         | 
| 54 | 
            +
              def advance(step, n = 0, total = nil, bin = true)
         | 
| 55 | 
            +
                adv = total.nil? ? (n == 0 ? '' : num_suffix(n, bin)) :
         | 
| 56 | 
            +
                  ('%.1f%% (%s/%s)' % [100.0 * n / total,
         | 
| 57 | 
            +
                                       num_suffix(n, bin), num_suffix(total, bin)])
         | 
| 58 | 
            +
                $stderr.print("[%s] %s %s    \r" % [Time.now, step, adv])
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              ##
         | 
| 62 | 
            +
              # Return formatted number +n+ with the appropriate units as
         | 
| 63 | 
            +
              # powers of 1,000 (if +bin+ if false) or 1,024 (otherwise)
         | 
| 64 | 
            +
              def num_suffix(n, bin = false)
         | 
| 65 | 
            +
                p = ''
         | 
| 66 | 
            +
                { T: 4, G: 3, M: 2, K: 1 }.each do |k, x|
         | 
| 67 | 
            +
                  v = (bin ? 1024 : 1e3)**x
         | 
| 68 | 
            +
                  if n > v
         | 
| 69 | 
            +
                    n = '%.1f' % (n / v)
         | 
| 70 | 
            +
                    p = k
         | 
| 71 | 
            +
                    break
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
                "#{n}#{p}"
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              def like_io?(obj)
         | 
| 78 | 
            +
                obj.is_a?(IO) || obj.is_a?(StringIO)
         | 
| 79 | 
            +
              end
         | 
| 47 80 | 
             
            end
         | 
    
        data/lib/miga/daemon.rb
    CHANGED
    
    | @@ -72,6 +72,7 @@ class MiGA::Daemon < MiGA::MiGA | |
| 72 72 | 
             
                say '-----------------------------------'
         | 
| 73 73 | 
             
                say 'MiGA:%s launched' % project.name
         | 
| 74 74 | 
             
                say '-----------------------------------'
         | 
| 75 | 
            +
                miga_say "Saving log to: #{output_file}" unless show_log?
         | 
| 75 76 | 
             
                recalculate_status!
         | 
| 76 77 | 
             
                load_status
         | 
| 77 78 | 
             
                say 'Configuration options:'
         | 
| @@ -111,10 +112,12 @@ class MiGA::Daemon < MiGA::MiGA | |
| 111 112 | 
             
                say(*msg) if verbosity >= level
         | 
| 112 113 | 
             
              end
         | 
| 113 114 |  | 
| 115 | 
            +
              alias miga_say say
         | 
| 116 | 
            +
             | 
| 114 117 | 
             
              ##
         | 
| 115 118 | 
             
              # Same as +l_say+ with +level = 1+
         | 
| 116 119 | 
             
              def say(*msg)
         | 
| 117 | 
            -
                super(*msg) if verbosity >= 1
         | 
| 120 | 
            +
                super(logfh, *msg) if verbosity >= 1
         | 
| 118 121 | 
             
              end
         | 
| 119 122 |  | 
| 120 123 | 
             
              ##
         | 
| @@ -173,6 +176,12 @@ class MiGA::Daemon < MiGA::MiGA | |
| 173 176 | 
             
                  o = true if ds.ref?
         | 
| 174 177 | 
             
                  queue_job(:d, ds)
         | 
| 175 178 | 
             
                end
         | 
| 179 | 
            +
                unless show_log?
         | 
| 180 | 
            +
                  n = project.dataset_names.count
         | 
| 181 | 
            +
                  k = jobs_to_run.size + jobs_running.size
         | 
| 182 | 
            +
                  advance('Datasets:', n - k, n, false)
         | 
| 183 | 
            +
                  miga_say if k == 0
         | 
| 184 | 
            +
                end
         | 
| 176 185 | 
             
                o
         | 
| 177 186 | 
             
              end
         | 
| 178 187 |  | 
| @@ -332,8 +341,9 @@ class MiGA::Daemon < MiGA::MiGA | |
| 332 341 | 
             
                  kill: %w[pid]
         | 
| 333 342 | 
             
                }.each do |k, v|
         | 
| 334 343 | 
             
                  if !runopts(k).nil? && runopts(k) =~ /%(\d+\$)?[ds]/
         | 
| 335 | 
            -
                    runopts( | 
| 336 | 
            -
             | 
| 344 | 
            +
                    runopts(
         | 
| 345 | 
            +
                      k, runopts(k).gsub(/%(\d+\$)?d/, '%\\1s') % v.map { |i| "{{#{i}}}" }
         | 
| 346 | 
            +
                    )
         | 
| 337 347 | 
             
                  end
         | 
| 338 348 | 
             
                end
         | 
| 339 349 | 
             
                runopts(:format_version, 1)
         | 
    
        data/lib/miga/daemon/base.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ module MiGA::Daemon::Base | |
| 17 17 | 
             
                    if !force && v == 0 && k != :verbosity
         | 
| 18 18 | 
             
                      raise "Daemon's #{k} cannot be set to zero"
         | 
| 19 19 | 
             
                    end
         | 
| 20 | 
            -
                  when :shutdown_when_done
         | 
| 20 | 
            +
                  when :shutdown_when_done, :show_log
         | 
| 21 21 | 
             
                    v = !!v
         | 
| 22 22 | 
             
                  when :nodelist
         | 
| 23 23 | 
             
                    if v =~ /^\$/
         | 
| @@ -73,4 +73,28 @@ module MiGA::Daemon::Base | |
| 73 73 | 
             
              def verbosity
         | 
| 74 74 | 
             
                runopts(:verbosity) || 1
         | 
| 75 75 | 
             
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              ##
         | 
| 78 | 
            +
              # Writing file handler (IO) to the log file
         | 
| 79 | 
            +
              def logfh
         | 
| 80 | 
            +
                show_log? ? $stderr : (@logfh ||= File.open(output_file, 'w'))
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
              ##
         | 
| 84 | 
            +
              # Display log instead of the progress summary
         | 
| 85 | 
            +
              def show_log!
         | 
| 86 | 
            +
                @show_log = true
         | 
| 87 | 
            +
              end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              ##
         | 
| 90 | 
            +
              # Display progress summary instead of the log
         | 
| 91 | 
            +
              def show_summary!
         | 
| 92 | 
            +
                @runopts[:show_log] = false
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              ##
         | 
| 96 | 
            +
              # Display log instead of the progress summary?
         | 
| 97 | 
            +
              def show_log?
         | 
| 98 | 
            +
                @runopts[:show_log] ||= false
         | 
| 99 | 
            +
              end
         | 
| 76 100 | 
             
            end
         | 
    
        data/lib/miga/version.rb
    CHANGED
    
    | @@ -8,7 +8,7 @@ module MiGA | |
| 8 8 | 
             
              # - Float representing the major.minor version.
         | 
| 9 9 | 
             
              # - Integer representing gem releases of the current version.
         | 
| 10 10 | 
             
              # - Integer representing minor changes that require new version number.
         | 
| 11 | 
            -
              VERSION = [0.7,  | 
| 11 | 
            +
              VERSION = [0.7, 15, 0]
         | 
| 12 12 |  | 
| 13 13 | 
             
              ##
         | 
| 14 14 | 
             
              # Nickname for the current major.minor version.
         | 
| @@ -16,7 +16,7 @@ module MiGA | |
| 16 16 |  | 
| 17 17 | 
             
              ##
         | 
| 18 18 | 
             
              # Date of the current gem release.
         | 
| 19 | 
            -
              VERSION_DATE = Date.new(2020, 8,  | 
| 19 | 
            +
              VERSION_DATE = Date.new(2020, 8, 12)
         | 
| 20 20 |  | 
| 21 21 | 
             
              ##
         | 
| 22 22 | 
             
              # Reference of MiGA.
         | 
    
        data/test/daemon_test.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ class DaemonTest < Test::Unit::TestCase | |
| 9 9 | 
             
              def setup
         | 
| 10 10 | 
             
                initialize_miga_home(
         | 
| 11 11 | 
             
                  <<~DAEMON
         | 
| 12 | 
            -
                    { "maxjobs": 1, "ppn": 1, "latency": 2, "varsep": " ",
         | 
| 12 | 
            +
                    { "maxjobs": 1, "ppn": 1, "latency": 2, "varsep": " ", "show_log": true,
         | 
| 13 13 | 
             
                      "var": "{{key}}={{value}}", "cmd": "echo {{task_name}} >/dev/null",
         | 
| 14 14 | 
             
                      "alive": "echo 1 # {{pid}}", "type": "bash", "format_version": 1 }
         | 
| 15 15 | 
             
                  DAEMON
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: miga-base
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.7. | 
| 4 | 
            +
              version: 0.7.15.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Luis M. Rodriguez-R
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020-08- | 
| 11 | 
            +
            date: 2020-08-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: daemons
         |