lino 1.10.0.pre.1 → 2.2.0.pre.2
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/Gemfile.lock +1 -1
- data/README.md +63 -3
- data/lib/lino/command_line_builder.rb +68 -29
- data/lib/lino/options.rb +35 -0
- data/lib/lino/subcommand_builder.rb +6 -6
- data/lib/lino/version.rb +1 -1
- metadata +3 -3
- data/lib/lino/switches.rb +0 -34
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 2d3239ef901d72bbd89e5598f649ee2625db692423799f43ca6f19d5a2c5adc3
         | 
| 4 | 
            +
              data.tar.gz: 0af4ae160b6537f103ee8c3e44be99dc340e0a6f197fc4c24e0abb4400caeaac
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c32a2ca3976575b417d6c2aa2f90c187aca4b1de97cddc668a3da9e2e3f01a8b8e5a67d1c2333aa37f108cac3823682e40a11dbbb7a07e558a2c04ce86bdaec7
         | 
| 7 | 
            +
              data.tar.gz: 1158933758b878a110f6d956d24484e65a3cd3271c98e39c6f32754f0af2b92beb1d3e2a02950e0b3e604a7db4211960f52c0cb960aa17109b417174db139a10
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -79,7 +79,7 @@ Lino::CommandLineBuilder.for_command('diff') | |
| 79 79 |  | 
| 80 80 | 
             
            # => diff ./file1.txt ./file2.txt
         | 
| 81 81 |  | 
| 82 | 
            -
            #  | 
| 82 | 
            +
            # ... or alternatively
         | 
| 83 83 | 
             
            Lino::CommandLineBuilder.for_command('diff')
         | 
| 84 84 | 
             
                .with_arguments(['./file1.txt', nil, '', './file2.txt'])
         | 
| 85 85 | 
             
                .build
         | 
| @@ -120,6 +120,18 @@ Lino::CommandLineBuilder.for_command('gcloud') | |
| 120 120 | 
             
                .to_s
         | 
| 121 121 |  | 
| 122 122 | 
             
            # => gcloud sql instances set-root-password some-database --password super-secure
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            # ... or alternatively
         | 
| 125 | 
            +
            Lino::CommandLineBuilder.for_command('gcloud')
         | 
| 126 | 
            +
                .with_subcommands(
         | 
| 127 | 
            +
                  %w[sql instances set-root-password some-database]
         | 
| 128 | 
            +
                ) do |sub|
         | 
| 129 | 
            +
                  sub.with_option('--password', 'super-secure')
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
                .build
         | 
| 132 | 
            +
                .to_s
         | 
| 133 | 
            +
                
         | 
| 134 | 
            +
            # => gcloud sql instances set-root-password some-database --password super-secure
         | 
| 123 135 |  | 
| 124 136 | 
             
            # commands controlled by environment variables
         | 
| 125 137 | 
             
            Lino::CommandLineBuilder.for_command('node')
         | 
| @@ -130,6 +142,39 @@ Lino::CommandLineBuilder.for_command('node') | |
| 130 142 | 
             
                .to_s
         | 
| 131 143 |  | 
| 132 144 | 
             
            # => PORT=3030 LOG_LEVEL=debug node ./server.js
         | 
| 145 | 
            +
             | 
| 146 | 
            +
            # note: by default, options are placed after the command, before all subcommands
         | 
| 147 | 
            +
            #       and arguments
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            # this can be expressed explicitly
         | 
| 150 | 
            +
            Lino::CommandLineBuilder.for_command('gcloud')
         | 
| 151 | 
            +
                .with_options_after_command
         | 
| 152 | 
            +
                .with_option('--password', 'super-secure')
         | 
| 153 | 
            +
                .with_subcommands(%w[sql instances set-root-password some-database])
         | 
| 154 | 
            +
                .build
         | 
| 155 | 
            +
                .to_s
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            # => gcloud --password super-secure sql instances set-root-password some-database
         | 
| 158 | 
            +
             | 
| 159 | 
            +
            # options can also come after subcommands
         | 
| 160 | 
            +
            Lino::CommandLineBuilder.for_command('gcloud')
         | 
| 161 | 
            +
                .with_options_after_subcommands
         | 
| 162 | 
            +
                .with_option('--password', 'super-secure')
         | 
| 163 | 
            +
                .with_subcommands(%w[sql instances set-root-password some-database])
         | 
| 164 | 
            +
                .build
         | 
| 165 | 
            +
                .to_s
         | 
| 166 | 
            +
             | 
| 167 | 
            +
            # => gcloud sql instances set-root-password some-database --password super-secure
         | 
| 168 | 
            +
             | 
| 169 | 
            +
            # options can also come after arguments, although usages of this are rare
         | 
| 170 | 
            +
            Lino::CommandLineBuilder.for_command('ls')
         | 
| 171 | 
            +
                .with_options_after_arguments
         | 
| 172 | 
            +
                .with_flag('-l')
         | 
| 173 | 
            +
                .with_argument('/some/directory')
         | 
| 174 | 
            +
                .build
         | 
| 175 | 
            +
                .to_s
         | 
| 176 | 
            +
             | 
| 177 | 
            +
            # => ls /some/directory -l
         | 
| 133 178 | 
             
            ```
         | 
| 134 179 |  | 
| 135 180 | 
             
            ### `Lino::CommandLine`
         | 
| @@ -183,10 +228,25 @@ To install dependencies and run the build, run the pre-commit build: | |
| 183 228 | 
             
            ./go
         | 
| 184 229 | 
             
            ```
         | 
| 185 230 |  | 
| 186 | 
            -
             | 
| 231 | 
            +
            This runs all unit tests and other checks including coverage and code linting / 
         | 
| 232 | 
            +
            formatting.
         | 
| 233 | 
            +
             | 
| 234 | 
            +
            To run only the unit tests, including coverage:
         | 
| 235 | 
            +
             | 
| 236 | 
            +
            ```shell script
         | 
| 237 | 
            +
            ./go test:unit
         | 
| 238 | 
            +
            ```
         | 
| 239 | 
            +
             | 
| 240 | 
            +
            To attempt to fix any code linting / formatting issues:
         | 
| 241 | 
            +
             | 
| 242 | 
            +
            ```shell script
         | 
| 243 | 
            +
            ./go library:fix
         | 
| 244 | 
            +
            ```
         | 
| 245 | 
            +
             | 
| 246 | 
            +
            To check for code linting / formatting issues without fixing:
         | 
| 187 247 |  | 
| 188 248 | 
             
            ```shell script
         | 
| 189 | 
            -
            ./go  | 
| 249 | 
            +
            ./go library:check
         | 
| 190 250 | 
             
            ```
         | 
| 191 251 |  | 
| 192 252 | 
             
            You can also run `bin/console` for an interactive prompt that will allow you to 
         | 
| @@ -4,13 +4,22 @@ require 'hamster' | |
| 4 4 | 
             
            require_relative 'utilities'
         | 
| 5 5 | 
             
            require_relative 'command_line'
         | 
| 6 6 | 
             
            require_relative 'subcommand_builder'
         | 
| 7 | 
            -
            require_relative ' | 
| 7 | 
            +
            require_relative 'options'
         | 
| 8 8 |  | 
| 9 9 | 
             
            module Lino
         | 
| 10 10 | 
             
              # rubocop:disable Metrics/ClassLength
         | 
| 11 11 | 
             
              class CommandLineBuilder
         | 
| 12 | 
            +
                SELECTORS = {
         | 
| 13 | 
            +
                  after_command:
         | 
| 14 | 
            +
                    %i[environment_variables command options subcommands arguments],
         | 
| 15 | 
            +
                  after_subcommands:
         | 
| 16 | 
            +
                    %i[environment_variables command subcommands options arguments],
         | 
| 17 | 
            +
                  after_arguments:
         | 
| 18 | 
            +
                    %i[environment_variables command subcommands arguments options]
         | 
| 19 | 
            +
                }.freeze
         | 
| 20 | 
            +
             | 
| 12 21 | 
             
                include Lino::Utilities
         | 
| 13 | 
            -
                include Lino:: | 
| 22 | 
            +
                include Lino::Options
         | 
| 14 23 |  | 
| 15 24 | 
             
                class << self
         | 
| 16 25 | 
             
                  def for_command(command)
         | 
| @@ -22,19 +31,21 @@ module Lino | |
| 22 31 | 
             
                def initialize(
         | 
| 23 32 | 
             
                  command: nil,
         | 
| 24 33 | 
             
                  subcommands: [],
         | 
| 25 | 
            -
                   | 
| 34 | 
            +
                  options: [],
         | 
| 26 35 | 
             
                  arguments: [],
         | 
| 27 36 | 
             
                  environment_variables: [],
         | 
| 28 37 | 
             
                  option_separator: ' ',
         | 
| 29 | 
            -
                  option_quoting: nil
         | 
| 38 | 
            +
                  option_quoting: nil,
         | 
| 39 | 
            +
                  option_placement: :after_command
         | 
| 30 40 | 
             
                )
         | 
| 31 41 | 
             
                  @command = command
         | 
| 32 42 | 
             
                  @subcommands = Hamster::Vector.new(subcommands)
         | 
| 33 | 
            -
                  @ | 
| 43 | 
            +
                  @options = Hamster::Vector.new(options)
         | 
| 34 44 | 
             
                  @arguments = Hamster::Vector.new(arguments)
         | 
| 35 45 | 
             
                  @environment_variables = Hamster::Vector.new(environment_variables)
         | 
| 36 46 | 
             
                  @option_separator = option_separator
         | 
| 37 47 | 
             
                  @option_quoting = option_quoting
         | 
| 48 | 
            +
                  @option_placement = option_placement
         | 
| 38 49 | 
             
                end
         | 
| 39 50 | 
             
                # rubocop:enable Metrics/ParameterLists
         | 
| 40 51 |  | 
| @@ -48,6 +59,15 @@ module Lino | |
| 48 59 | 
             
                  )
         | 
| 49 60 | 
             
                end
         | 
| 50 61 |  | 
| 62 | 
            +
                def with_subcommands(subcommands, &block)
         | 
| 63 | 
            +
                  without_block = subcommands[0...-1]
         | 
| 64 | 
            +
                  with_block = subcommands.last
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  without_block
         | 
| 67 | 
            +
                    .inject(self) { |s, sc| s.with_subcommand(sc) }
         | 
| 68 | 
            +
                    .with_subcommand(with_block, &block)
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
             | 
| 51 71 | 
             
                def with_option_separator(option_separator)
         | 
| 52 72 | 
             
                  with(option_separator: option_separator)
         | 
| 53 73 | 
             
                end
         | 
| @@ -56,13 +76,28 @@ module Lino | |
| 56 76 | 
             
                  with(option_quoting: character)
         | 
| 57 77 | 
             
                end
         | 
| 58 78 |  | 
| 79 | 
            +
                def with_options_after_command
         | 
| 80 | 
            +
                  with(option_placement: :after_command)
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def with_options_after_subcommands
         | 
| 84 | 
            +
                  with(option_placement: :after_subcommands)
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                def with_options_after_arguments
         | 
| 88 | 
            +
                  with(option_placement: :after_arguments)
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 59 91 | 
             
                def with_argument(argument)
         | 
| 60 | 
            -
                   | 
| 92 | 
            +
                  return self if missing?(argument)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  with(arguments: @arguments.add({ components: [argument] }))
         | 
| 61 95 | 
             
                end
         | 
| 62 96 |  | 
| 63 97 | 
             
                def with_arguments(arguments)
         | 
| 64 | 
            -
                   | 
| 65 | 
            -
             | 
| 98 | 
            +
                  return self if missing?(arguments)
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  arguments.inject(self) { |s, argument| s.with_argument(argument) }
         | 
| 66 101 | 
             
                end
         | 
| 67 102 |  | 
| 68 103 | 
             
                def with_environment_variable(environment_variable, value)
         | 
| @@ -77,30 +112,36 @@ module Lino | |
| 77 112 | 
             
                end
         | 
| 78 113 |  | 
| 79 114 | 
             
                def build
         | 
| 80 | 
            -
                  components =  | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
                    formatted_arguments
         | 
| 86 | 
            -
                  ]
         | 
| 115 | 
            +
                  components = formatted_components
         | 
| 116 | 
            +
                  command_line = SELECTORS[@option_placement]
         | 
| 117 | 
            +
                                 .inject([]) { |c, key| c << components[key] }
         | 
| 118 | 
            +
                                 .reject(&:empty?)
         | 
| 119 | 
            +
                                 .join(' ')
         | 
| 87 120 |  | 
| 88 | 
            -
                   | 
| 89 | 
            -
             | 
| 90 | 
            -
                  CommandLine.new(command_string)
         | 
| 121 | 
            +
                  CommandLine.new(command_line)
         | 
| 91 122 | 
             
                end
         | 
| 92 123 |  | 
| 93 124 | 
             
                private
         | 
| 94 125 |  | 
| 126 | 
            +
                def formatted_components
         | 
| 127 | 
            +
                  {
         | 
| 128 | 
            +
                    environment_variables: formatted_environment_variables,
         | 
| 129 | 
            +
                    command: @command,
         | 
| 130 | 
            +
                    options: formatted_options,
         | 
| 131 | 
            +
                    subcommands: formatted_subcommands,
         | 
| 132 | 
            +
                    arguments: formatted_arguments
         | 
| 133 | 
            +
                  }
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 95 136 | 
             
                def formatted_environment_variables
         | 
| 96 137 | 
             
                  map_and_join(@environment_variables) do |var|
         | 
| 97 138 | 
             
                    "#{var[0]}=\"#{var[1].to_s.gsub(/"/, '\\"')}\""
         | 
| 98 139 | 
             
                  end
         | 
| 99 140 | 
             
                end
         | 
| 100 141 |  | 
| 101 | 
            -
                def  | 
| 142 | 
            +
                def formatted_options
         | 
| 102 143 | 
             
                  map_and_join(
         | 
| 103 | 
            -
                    @ | 
| 144 | 
            +
                    @options,
         | 
| 104 145 | 
             
                    &(quote_with(@option_quoting) >> join_with(@option_separator))
         | 
| 105 146 | 
             
                  )
         | 
| 106 147 | 
             
                end
         | 
| @@ -112,7 +153,10 @@ module Lino | |
| 112 153 | 
             
                end
         | 
| 113 154 |  | 
| 114 155 | 
             
                def formatted_arguments
         | 
| 115 | 
            -
                  map_and_join( | 
| 156 | 
            +
                  map_and_join(
         | 
| 157 | 
            +
                    @arguments,
         | 
| 158 | 
            +
                    &join_with(' ')
         | 
| 159 | 
            +
                  )
         | 
| 116 160 | 
             
                end
         | 
| 117 161 |  | 
| 118 162 | 
             
                def with(**replacements)
         | 
| @@ -123,19 +167,14 @@ module Lino | |
| 123 167 | 
             
                  {
         | 
| 124 168 | 
             
                    command: @command,
         | 
| 125 169 | 
             
                    subcommands: @subcommands,
         | 
| 126 | 
            -
                     | 
| 170 | 
            +
                    options: @options,
         | 
| 127 171 | 
             
                    arguments: @arguments,
         | 
| 128 172 | 
             
                    environment_variables: @environment_variables,
         | 
| 129 173 | 
             
                    option_separator: @option_separator,
         | 
| 130 | 
            -
                    option_quoting: @option_quoting
         | 
| 174 | 
            +
                    option_quoting: @option_quoting,
         | 
| 175 | 
            +
                    option_placement: @option_placement
         | 
| 131 176 | 
             
                  }
         | 
| 132 177 | 
             
                end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                def add_argument(argument)
         | 
| 135 | 
            -
                  return @arguments if missing?(argument)
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                  @arguments = @arguments.add({ components: [argument] })
         | 
| 138 | 
            -
                end
         | 
| 139 178 | 
             
              end
         | 
| 140 179 | 
             
              # rubocop:enable Metrics/ClassLength
         | 
| 141 180 | 
             
            end
         | 
    
        data/lib/lino/options.rb
    ADDED
    
    | @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lino
         | 
| 4 | 
            +
              module Options
         | 
| 5 | 
            +
                def with_option(option, value, separator: nil, quoting: nil)
         | 
| 6 | 
            +
                  return self if missing?(value)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  with(options: @options.add(
         | 
| 9 | 
            +
                    {
         | 
| 10 | 
            +
                      components: [option, value],
         | 
| 11 | 
            +
                      separator: separator,
         | 
| 12 | 
            +
                      quoting: quoting
         | 
| 13 | 
            +
                    }
         | 
| 14 | 
            +
                  ))
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def with_repeated_option(option, values, separator: nil, quoting: nil)
         | 
| 18 | 
            +
                  values.inject(self) do |s, value|
         | 
| 19 | 
            +
                    s.with_option(option, value, separator: separator, quoting: quoting)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def with_flag(flag)
         | 
| 24 | 
            +
                  return self if missing?(flag)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  with(options: @options.add({ components: [flag] }))
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def with_flags(flags)
         | 
| 30 | 
            +
                  return self if missing?(flags)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  flags.inject(self) { |s, flag| s.with_flag(flag) }
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -2,12 +2,12 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'hamster'
         | 
| 4 4 | 
             
            require_relative 'utilities'
         | 
| 5 | 
            -
            require_relative ' | 
| 5 | 
            +
            require_relative 'options'
         | 
| 6 6 |  | 
| 7 7 | 
             
            module Lino
         | 
| 8 8 | 
             
              class SubcommandBuilder
         | 
| 9 9 | 
             
                include Lino::Utilities
         | 
| 10 | 
            -
                include Lino:: | 
| 10 | 
            +
                include Lino::Options
         | 
| 11 11 |  | 
| 12 12 | 
             
                class <<self
         | 
| 13 13 | 
             
                  def for_subcommand(subcommand)
         | 
| @@ -15,16 +15,16 @@ module Lino | |
| 15 15 | 
             
                  end
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 | 
            -
                def initialize(subcommand: nil,  | 
| 18 | 
            +
                def initialize(subcommand: nil, options: [])
         | 
| 19 19 | 
             
                  @subcommand = subcommand
         | 
| 20 | 
            -
                  @ | 
| 20 | 
            +
                  @options = Hamster::Vector.new(options)
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
| 23 23 | 
             
                def build(option_separator, option_quoting)
         | 
| 24 24 | 
             
                  components = [
         | 
| 25 25 | 
             
                    @subcommand,
         | 
| 26 26 | 
             
                    map_and_join(
         | 
| 27 | 
            -
                      @ | 
| 27 | 
            +
                      @options,
         | 
| 28 28 | 
             
                      &(quote_with(option_quoting) >> join_with(option_separator))
         | 
| 29 29 | 
             
                    )
         | 
| 30 30 | 
             
                  ]
         | 
| @@ -40,7 +40,7 @@ module Lino | |
| 40 40 | 
             
                def state
         | 
| 41 41 | 
             
                  {
         | 
| 42 42 | 
             
                    subcommand: @subcommand,
         | 
| 43 | 
            -
                     | 
| 43 | 
            +
                    options: @options
         | 
| 44 44 | 
             
                  }
         | 
| 45 45 | 
             
                end
         | 
| 46 46 | 
             
              end
         | 
    
        data/lib/lino/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: lino
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 2.2.0.pre.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Toby Clemson
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021-04- | 
| 11 | 
            +
            date: 2021-04-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: hamster
         | 
| @@ -224,8 +224,8 @@ files: | |
| 224 224 | 
             
            - lib/lino.rb
         | 
| 225 225 | 
             
            - lib/lino/command_line.rb
         | 
| 226 226 | 
             
            - lib/lino/command_line_builder.rb
         | 
| 227 | 
            +
            - lib/lino/options.rb
         | 
| 227 228 | 
             
            - lib/lino/subcommand_builder.rb
         | 
| 228 | 
            -
            - lib/lino/switches.rb
         | 
| 229 229 | 
             
            - lib/lino/utilities.rb
         | 
| 230 230 | 
             
            - lib/lino/version.rb
         | 
| 231 231 | 
             
            homepage: https://github.com/infrablocks/lino
         | 
    
        data/lib/lino/switches.rb
    DELETED
    
    | @@ -1,34 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Lino
         | 
| 4 | 
            -
              module Switches
         | 
| 5 | 
            -
                def with_option(switch, value, separator: nil, quoting: nil)
         | 
| 6 | 
            -
                  with(switches: add_option(switch, value, separator, quoting))
         | 
| 7 | 
            -
                end
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                def with_repeated_option(switch, values, separator: nil, quoting: nil)
         | 
| 10 | 
            -
                  values.each do |value|
         | 
| 11 | 
            -
                    add_option(switch, value, separator, quoting)
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
                  with({})
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                def with_flag(flag)
         | 
| 17 | 
            -
                  with(switches: @switches.add({ components: [flag] }))
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                private
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                def add_option(switch, value, separator, quoting)
         | 
| 23 | 
            -
                  return @switches if missing?(value)
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  @switches = @switches.add(
         | 
| 26 | 
            -
                    {
         | 
| 27 | 
            -
                      components: [switch, value],
         | 
| 28 | 
            -
                      separator: separator,
         | 
| 29 | 
            -
                      quoting: quoting
         | 
| 30 | 
            -
                    }
         | 
| 31 | 
            -
                  )
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
            end
         |