consoler 1.0.3 → 1.3.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 +5 -5
 - data/.github/workflows/tests.yml +34 -0
 - data/.rubocop.yml +45 -0
 - data/README.md +50 -37
 - data/consoler.gemspec +4 -3
 - data/lib/consoler/application.rb +73 -29
 - data/lib/consoler/arguments.rb +0 -1
 - data/lib/consoler/command.rb +0 -1
 - data/lib/consoler/matcher.rb +73 -49
 - data/lib/consoler/option.rb +75 -27
 - data/lib/consoler/options.rb +34 -17
 - data/lib/consoler/version.rb +1 -2
 - metadata +23 -23
 - data/.travis.yml +0 -11
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 4ce3b8eca4b35ef9a82bb1ac0886aae0f49614dca29721c06e20bb94fdfc3d3b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: addc213497a379b6d68fe844df9374bb93c48bb38ac40e7174343a50463e6a5a
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 15b94900e561a891e02f88d57f43b0614abb76b6ed75e59810d5a1ded0945874e71e1ceafacc320fd725be1ad470895bfc912f7f853601c45ce0ffc374ffd8a7
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 0305b071d1b40ebd593d0cd81795787898d9081e2cbebee5636b406136ecbb325facade699426202e18bb6e4a39fc20c6760d3b18a90af33cb308e3d1141b4e2
         
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            name: tests
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            on:
         
     | 
| 
      
 4 
     | 
    
         
            +
              push:
         
     | 
| 
      
 5 
     | 
    
         
            +
                branches: [master]
         
     | 
| 
      
 6 
     | 
    
         
            +
              pull_request:
         
     | 
| 
      
 7 
     | 
    
         
            +
                branches: [master]
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            jobs:
         
     | 
| 
      
 10 
     | 
    
         
            +
              tests:
         
     | 
| 
      
 11 
     | 
    
         
            +
                runs-on: ubuntu-latest
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                strategy:
         
     | 
| 
      
 14 
     | 
    
         
            +
                  fail-fast: false
         
     | 
| 
      
 15 
     | 
    
         
            +
                  matrix:
         
     | 
| 
      
 16 
     | 
    
         
            +
                    ruby: ['2.4', '2.5', '2.6', '2.7', '3.0']
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                name: Ruby ${{ matrix.ruby }}
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                steps:
         
     | 
| 
      
 21 
     | 
    
         
            +
                  - uses: actions/checkout@v2
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  - name: Set up Ruby
         
     | 
| 
      
 24 
     | 
    
         
            +
                    # change this to (see https://github.com/ruby/setup-ruby#versioning):
         
     | 
| 
      
 25 
     | 
    
         
            +
                    uses: ruby/setup-ruby@v1
         
     | 
| 
      
 26 
     | 
    
         
            +
                    with:
         
     | 
| 
      
 27 
     | 
    
         
            +
                      ruby-version: ${{ matrix.ruby }}
         
     | 
| 
      
 28 
     | 
    
         
            +
                      bundler-cache: true
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  - name: Report Ruby version
         
     | 
| 
      
 31 
     | 
    
         
            +
                    run: ruby -v
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  - name: Run tests
         
     | 
| 
      
 34 
     | 
    
         
            +
                    run: bundle exec rake
         
     | 
    
        data/.rubocop.yml
    ADDED
    
    | 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            AllCops:
         
     | 
| 
      
 2 
     | 
    
         
            +
              TargetRubyVersion: 2.2
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 5 
     | 
    
         
            +
                - 'test/**/*'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            # 80 is not enough these days
         
     | 
| 
      
 8 
     | 
    
         
            +
            Metrics/LineLength:
         
     | 
| 
      
 9 
     | 
    
         
            +
              Max: 100
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            # Not ready for 100 yet
         
     | 
| 
      
 12 
     | 
    
         
            +
            Metrics/ClassLength:
         
     | 
| 
      
 13 
     | 
    
         
            +
              Max: 250
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # Not ready for 20 yet
         
     | 
| 
      
 16 
     | 
    
         
            +
            Metrics/MethodLength:
         
     | 
| 
      
 17 
     | 
    
         
            +
              Max: 100
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            Metrics/AbcSize:
         
     | 
| 
      
 20 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            # not ready for 10 just yet
         
     | 
| 
      
 23 
     | 
    
         
            +
            Metrics/CyclomaticComplexity:
         
     | 
| 
      
 24 
     | 
    
         
            +
              Max: 30
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            Metrics/BlockNesting:
         
     | 
| 
      
 27 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            Metrics/PerceivedComplexity:
         
     | 
| 
      
 30 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            # I prefer regular if statements in some cases
         
     | 
| 
      
 33 
     | 
    
         
            +
            Style/IfUnlessModifier:
         
     | 
| 
      
 34 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 35 
     | 
    
         
            +
            Style/GuardClause:
         
     | 
| 
      
 36 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            # `super` makes no sense in this case
         
     | 
| 
      
 39 
     | 
    
         
            +
            # `#respond_to_missing?` is implemented
         
     | 
| 
      
 40 
     | 
    
         
            +
            Style/MethodMissingSuper:
         
     | 
| 
      
 41 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            # I like the comma
         
     | 
| 
      
 44 
     | 
    
         
            +
            Style/TrailingCommaInArguments:
         
     | 
| 
      
 45 
     | 
    
         
            +
              Enabled: false
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Consoler [](https://badge.fury.io/rb/consoler)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            > Sinatra-like application builder for the console
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
         @@ -9,17 +9,19 @@ 
     | 
|
| 
       9 
9 
     | 
    
         
             
            app = Consoler::Application.new description: 'A simple app'
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            # define a command
         
     | 
| 
       12 
     | 
    
         
            -
            app.build '[--clean] output_dir' do |clean, output_dir|
         
     | 
| 
      
 12 
     | 
    
         
            +
            app.build '[--clean] <output_dir>' do |clean, output_dir|
         
     | 
| 
       13 
13 
     | 
    
         
             
              # clean contains a boolean
         
     | 
| 
       14 
14 
     | 
    
         
             
              clean_up if clean
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
              # output_dir contains a string
         
     | 
| 
       17 
17 
     | 
    
         
             
              build_project output_dir
         
     | 
| 
       18 
18 
     | 
    
         
             
            end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            # run with own args
         
     | 
| 
      
 21 
     | 
    
         
            +
            app.run ['build', 'production', '--clean']
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
       21 
23 
     | 
    
         
             
            # this does not match, nothing is executed and the usage message is printed
         
     | 
| 
       22 
     | 
    
         
            -
            app.run 
     | 
| 
      
 24 
     | 
    
         
            +
            app.run ['deploy', 'production']
         
     | 
| 
       23 
25 
     | 
    
         | 
| 
       24 
26 
     | 
    
         
             
            # defaults to ARGV
         
     | 
| 
       25 
27 
     | 
    
         
             
            app.run
         
     | 
| 
         @@ -30,15 +32,17 @@ app.run 
     | 
|
| 
       30 
32 
     | 
    
         
             
            - No fiddling with `ARGV` and friends
         
     | 
| 
       31 
33 
     | 
    
         
             
            - Arguments filled based on their name, for easy access
         
     | 
| 
       32 
34 
     | 
    
         
             
            - Grouped optionals
         
     | 
| 
      
 35 
     | 
    
         
            +
            - Easy option aliasing
         
     | 
| 
       33 
36 
     | 
    
         | 
| 
       34 
37 
     | 
    
         
             
            ## Requirements
         
     | 
| 
       35 
38 
     | 
    
         | 
| 
       36 
39 
     | 
    
         
             
            Tests are run against multiple ruby versions (latest supported):
         
     | 
| 
       37 
40 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
            - `2.2.x`
         
     | 
| 
       39 
     | 
    
         
            -
            - `2.3.x`
         
     | 
| 
       40 
41 
     | 
    
         
             
            - `2.4.x`
         
     | 
| 
       41 
42 
     | 
    
         
             
            - `2.5.x`
         
     | 
| 
      
 43 
     | 
    
         
            +
            - `2.6.x`
         
     | 
| 
      
 44 
     | 
    
         
            +
            - `2.7.x`
         
     | 
| 
      
 45 
     | 
    
         
            +
            - `3.0.x`
         
     | 
| 
       42 
46 
     | 
    
         | 
| 
       43 
47 
     | 
    
         
             
            No other requirements exist.
         
     | 
| 
       44 
48 
     | 
    
         | 
| 
         @@ -51,20 +55,20 @@ gem install consoler 
     | 
|
| 
       51 
55 
     | 
    
         
             
            or add to your `Gemfile` for applications
         
     | 
| 
       52 
56 
     | 
    
         | 
| 
       53 
57 
     | 
    
         
             
            ```ruby
         
     | 
| 
       54 
     | 
    
         
            -
            gem 'consoler', '~> 1.0 
     | 
| 
      
 58 
     | 
    
         
            +
            gem 'consoler', '~> 1.3.0'
         
     | 
| 
       55 
59 
     | 
    
         
             
            ```
         
     | 
| 
       56 
60 
     | 
    
         | 
| 
       57 
61 
     | 
    
         
             
            or to your `.gemspec` file for gems
         
     | 
| 
       58 
62 
     | 
    
         | 
| 
       59 
63 
     | 
    
         
             
            ```ruby
         
     | 
| 
       60 
64 
     | 
    
         
             
            Gem::Specification.new do |spec|
         
     | 
| 
       61 
     | 
    
         
            -
              spec.add_dependency 'consoler', '~> 1.0 
     | 
| 
      
 65 
     | 
    
         
            +
              spec.add_dependency 'consoler', '~> 1.3.0'
         
     | 
| 
       62 
66 
     | 
    
         
             
            end
         
     | 
| 
       63 
67 
     | 
    
         
             
            ```
         
     | 
| 
       64 
68 
     | 
    
         | 
| 
       65 
69 
     | 
    
         
             
            ## Docs
         
     | 
| 
       66 
70 
     | 
    
         | 
| 
       67 
     | 
    
         
            -
            Full API documentation can the found here:  
     | 
| 
      
 71 
     | 
    
         
            +
            Full API documentation can the found here: https://www.rubydoc.info/gems/consoler/1.3.0
         
     | 
| 
       68 
72 
     | 
    
         | 
| 
       69 
73 
     | 
    
         
             
            ### API
         
     | 
| 
       70 
74 
     | 
    
         | 
| 
         @@ -93,11 +97,11 @@ app.build do 
     | 
|
| 
       93 
97 
     | 
    
         
             
            end
         
     | 
| 
       94 
98 
     | 
    
         | 
| 
       95 
99 
     | 
    
         
             
            # to add options to your command, provide a options definition as an argument
         
     | 
| 
       96 
     | 
    
         
            -
            app.build '[--clean] [--env=] [-v] output_dir' do |clean, env,  
     | 
| 
      
 100 
     | 
    
         
            +
            app.build '[--clean] [--env=] [-v|--verbose] <output_dir>' do |clean, env, verbose, output_dir|
         
     | 
| 
       97 
101 
     | 
    
         
             
              # parameters are matched based on name
         
     | 
| 
       98 
102 
     | 
    
         
             
              # `clean` contains a boolean
         
     | 
| 
       99 
103 
     | 
    
         
             
              # `env` contains a string or nil if not provided
         
     | 
| 
       100 
     | 
    
         
            -
              # ` 
     | 
| 
      
 104 
     | 
    
         
            +
              # `verbose` contains a number, counting the times it occurred in the arguments
         
     | 
| 
       101 
105 
     | 
    
         
             
              # `output_dir` contains a string, if needed to match this command
         
     | 
| 
       102 
106 
     | 
    
         
             
            end
         
     | 
| 
       103 
107 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -111,23 +115,23 @@ end 
     | 
|
| 
       111 
115 
     | 
    
         
             
            app = Consoler::Application.new
         
     | 
| 
       112 
116 
     | 
    
         | 
| 
       113 
117 
     | 
    
         
             
            # a build command
         
     | 
| 
       114 
     | 
    
         
            -
            app.build '[--clean] [--env=] [-v] output_dir' do |clean, env,  
     | 
| 
       115 
     | 
    
         
            -
              puts 'Starting build...' if  
     | 
| 
      
 118 
     | 
    
         
            +
            app.build '[--clean] [--env=] [-v|--verbose] <output_dir>' do |clean, env, verbose, output_dir|
         
     | 
| 
      
 119 
     | 
    
         
            +
              puts 'Starting build...' if verbose > 0
         
     | 
| 
       116 
120 
     | 
    
         | 
| 
       117 
121 
     | 
    
         
             
              do_clean_up if clean
         
     | 
| 
       118 
122 
     | 
    
         | 
| 
       119 
123 
     | 
    
         
             
              do_build env || 'development', output_dir
         
     | 
| 
       120 
124 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
              puts 'Build complete' if  
     | 
| 
      
 125 
     | 
    
         
            +
              puts 'Build complete' if verbose > 0
         
     | 
| 
       122 
126 
     | 
    
         
             
            end
         
     | 
| 
       123 
127 
     | 
    
         | 
| 
       124 
128 
     | 
    
         
             
            # a deploy command
         
     | 
| 
       125 
     | 
    
         
            -
            app.build '[-v] [--env=]' do |env|
         
     | 
| 
       126 
     | 
    
         
            -
              puts 'Starting deploy...' if  
     | 
| 
      
 129 
     | 
    
         
            +
            app.build '[-v|--verbose] [--env=]' do |env|
         
     | 
| 
      
 130 
     | 
    
         
            +
              puts 'Starting deploy...' if verbose > 0
         
     | 
| 
       127 
131 
     | 
    
         | 
| 
       128 
132 
     | 
    
         
             
              do_deploy env || 'development'
         
     | 
| 
       129 
133 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
              puts 'Deploy complete' if  
     | 
| 
      
 134 
     | 
    
         
            +
              puts 'Deploy complete' if verbose > 0
         
     | 
| 
       131 
135 
     | 
    
         
             
            end
         
     | 
| 
       132 
136 
     | 
    
         
             
            ```
         
     | 
| 
       133 
137 
     | 
    
         | 
| 
         @@ -137,29 +141,40 @@ _Shell commands:_ 
     | 
|
| 
       137 
141 
     | 
    
         
             
            ruby app.rb build --env production dist
         
     | 
| 
       138 
142 
     | 
    
         | 
| 
       139 
143 
     | 
    
         
             
            # deploy
         
     | 
| 
       140 
     | 
    
         
            -
            ruby app.rb deploy
         
     | 
| 
      
 144 
     | 
    
         
            +
            ruby app.rb deploy --verbose
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
            # or, you can use command shortcuts. this works by prefix matching and only if
         
     | 
| 
      
 147 
     | 
    
         
            +
            # there is one match, exact matches always have priority
         
     | 
| 
      
 148 
     | 
    
         
            +
            ruby app.rb b --env production dist
         
     | 
| 
      
 149 
     | 
    
         
            +
            ruby app.rb d --verbose
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
       141 
151 
     | 
    
         
             
            ```
         
     | 
| 
       142 
152 
     | 
    
         | 
| 
       143 
153 
     | 
    
         
             
            #### Options definition
         
     | 
| 
       144 
154 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
            | Option 
     | 
| 
       146 
     | 
    
         
            -
            |  
     | 
| 
       147 
     | 
    
         
            -
            | `-f` 
     | 
| 
       148 
     | 
    
         
            -
            | `--clean` 
     | 
| 
       149 
     | 
    
         
            -
            | ` 
     | 
| 
       150 
     | 
    
         
            -
            |  
     | 
| 
       151 
     | 
    
         
            -
            |  
     | 
| 
       152 
     | 
    
         
            -
            |  
     | 
| 
      
 155 
     | 
    
         
            +
            | Option          | Meaning                         | Example                                |
         
     | 
| 
      
 156 
     | 
    
         
            +
            | --------------- | ------------------------------- | -------------------------------------- |
         
     | 
| 
      
 157 
     | 
    
         
            +
            | `-f`            | Short option with name `f`      | `ruby app.rb build -f`                 |
         
     | 
| 
      
 158 
     | 
    
         
            +
            | `--clean`       | Long option with name `clean`   | `ruby app.rb build --clean`            |
         
     | 
| 
      
 159 
     | 
    
         
            +
            | `-v\|--verbose` | Alias option for `v`            | `ruby app.rb build --verbose`          |
         
     | 
| 
      
 160 
     | 
    
         
            +
            | `<output_dir>`  | Argument with name `output_dir` | `ruby app.rb build dist/`              |
         
     | 
| 
      
 161 
     | 
    
         
            +
            | `--env=`        | Long option with value          | `ruby app.rb build --env production`   |
         
     | 
| 
      
 162 
     | 
    
         
            +
            | `-e=`           | Short option with value         | `ruby app.rb build -e production`      |
         
     | 
| 
      
 163 
     | 
    
         
            +
            | `[ .. ]`        | Optional options/arguments      | `ruby app.rb build` would match `[-v]` |
         
     | 
| 
       153 
164 
     | 
    
         | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
      
 165 
     | 
    
         
            +
            Some notes about these options:
         
     | 
| 
       155 
166 
     | 
    
         | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
      
 167 
     | 
    
         
            +
            - The `<`, `>` around the argument name a optional, but are always shown in de usage message for better legibility
         
     | 
| 
      
 168 
     | 
    
         
            +
            - Optional-tokens can occur anywhere in the options, as long as they are not nested and properly closed. You can group optional parts, meaning that both options/arguments should be available or both not.
         
     | 
| 
      
 169 
     | 
    
         
            +
            - Options and/or arguments are mandatory unless specified otherwise.
         
     | 
| 
      
 170 
     | 
    
         
            +
            - Aliases should be the same "type", meaning that if the original option expands an value, the alias must do as well
         
     | 
| 
      
 171 
     | 
    
         
            +
            - Aliases are only allowed for short and long options, with or without value and can be optional, just like regular options
         
     | 
| 
       157 
172 
     | 
    
         | 
| 
       158 
173 
     | 
    
         
             
            Grouping of optionals allows you do things like this:
         
     | 
| 
       159 
174 
     | 
    
         | 
| 
       160 
175 
     | 
    
         
             
            ```ruby
         
     | 
| 
       161 
176 
     | 
    
         
             
            app = Consoler::Application.new
         
     | 
| 
       162 
     | 
    
         
            -
            app.shout '[first_name last_name] [name]' do |first_name, last_name, name|
         
     | 
| 
      
 177 
     | 
    
         
            +
            app.shout '[<first_name> <last_name>] [<name>]' do |first_name, last_name, name|
         
     | 
| 
       163 
178 
     | 
    
         
             
              # by definition, `last_name` is also filled
         
     | 
| 
       164 
179 
     | 
    
         
             
              unless first_name.nil? then
         
     | 
| 
       165 
180 
     | 
    
         
             
                puts "Hello #{first_name} #{last_name}!"
         
     | 
| 
         @@ -172,11 +187,11 @@ end 
     | 
|
| 
       172 
187 
     | 
    
         | 
| 
       173 
188 
     | 
    
         
             
            # calling with two arguments can fill the first group
         
     | 
| 
       174 
189 
     | 
    
         
             
            # prints "Hello John Doe!"
         
     | 
| 
       175 
     | 
    
         
            -
            app.run 
     | 
| 
      
 190 
     | 
    
         
            +
            app.run ['shout', 'John', 'Doe']
         
     | 
| 
       176 
191 
     | 
    
         | 
| 
       177 
192 
     | 
    
         
             
            # calling with one argument it is not possible to fill the first group
         
     | 
| 
       178 
193 
     | 
    
         
             
            # prints "Hello Mr. White!"
         
     | 
| 
       179 
     | 
    
         
            -
            app.run 
     | 
| 
      
 194 
     | 
    
         
            +
            app.run ['shout', 'Mr. White!']
         
     | 
| 
       180 
195 
     | 
    
         
             
            ```
         
     | 
| 
       181 
196 
     | 
    
         | 
| 
       182 
197 
     | 
    
         
             
            #### Return types in action block
         
     | 
| 
         @@ -188,6 +203,8 @@ app.run(['shout', 'Mr. White!']) 
     | 
|
| 
       188 
203 
     | 
    
         
             
            | Value       | `String` (`production`) | `nil`                 |
         
     | 
| 
       189 
204 
     | 
    
         
             
            | Argument    | `String` (`dist/`)      | `nil`                 |
         
     | 
| 
       190 
205 
     | 
    
         | 
| 
      
 206 
     | 
    
         
            +
            Aliased keep the properties as the original options; with a definition of `-v|--verbose` and providing `--verbose` as an argument, both `v` and `verbose` contain a number (`1` in this case). Same goes the other way around; with a definition of `--force|-f` and providing `-f` as an argument, both `force` and `f` contain a boolean (`true` in this case).
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
       191 
208 
     | 
    
         
             
            #### Subapplications
         
     | 
| 
       192 
209 
     | 
    
         | 
| 
       193 
210 
     | 
    
         
             
            To make application nesting possible you can provide a complete application to a command, instead of an action block.
         
     | 
| 
         @@ -200,7 +217,7 @@ android = Consoler::Application.new 
     | 
|
| 
       200 
217 
     | 
    
         
             
            android.build do; end
         
     | 
| 
       201 
218 
     | 
    
         | 
| 
       202 
219 
     | 
    
         
             
            # options are supported just like regular apps
         
     | 
| 
       203 
     | 
    
         
            -
            android.clean '--force' do; end
         
     | 
| 
      
 220 
     | 
    
         
            +
            android.clean '--force|-f' do; end
         
     | 
| 
       204 
221 
     | 
    
         | 
| 
       205 
222 
     | 
    
         
             
            # create an application
         
     | 
| 
       206 
223 
     | 
    
         
             
            app = Consoler::Application.new
         
     | 
| 
         @@ -245,7 +262,7 @@ app = Consoler::Application.new 
     | 
|
| 
       245 
262 
     | 
    
         
             
            app.db db
         
     | 
| 
       246 
263 
     | 
    
         
             
            app.cache cache
         
     | 
| 
       247 
264 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
            app.build '[--clean] [--env=] [-v] output_dir -- build the project' do |clean, env, v, output_dir|
         
     | 
| 
      
 265 
     | 
    
         
            +
            app.build '[--clean] [--env=] [-v] <output_dir> -- build the project' do |clean, env, v, output_dir|
         
     | 
| 
       249 
266 
     | 
    
         
             
              puts 'Starting build...' if v > 0
         
     | 
| 
       250 
267 
     | 
    
         | 
| 
       251 
268 
     | 
    
         
             
              if clean
         
     | 
| 
         @@ -274,10 +291,6 @@ Make the file executable with `chmod a+x app.rb`, you can now call it with `./ap 
     | 
|
| 
       274 
291 
     | 
    
         
             
            ./app.rb
         
     | 
| 
       275 
292 
     | 
    
         
             
            ```
         
     | 
| 
       276 
293 
     | 
    
         | 
| 
       277 
     | 
    
         
            -
            ### Current wish-list
         
     | 
| 
       278 
     | 
    
         
            -
             
     | 
| 
       279 
     | 
    
         
            -
            - Aliases, mostly to "document" short options, `-v|--verbose`
         
     | 
| 
       280 
     | 
    
         
            -
             
     | 
| 
       281 
294 
     | 
    
         
             
            ## Final notes
         
     | 
| 
       282 
295 
     | 
    
         | 
| 
       283 
296 
     | 
    
         
             
            If you like what you see, feel free to use it anyway you like. Also, don't hold back if you have suggestions/question and create an issue to let me know, and we can talk about it. And if you don't like what you see, PRs are welcome. You should probably file an issue first to make sure it's something worth doing, and the right way to do it.
         
     | 
    
        data/consoler.gemspec
    CHANGED
    
    | 
         @@ -22,9 +22,10 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       22 
22 
     | 
    
         
             
              # build docs on install
         
     | 
| 
       23 
23 
     | 
    
         
             
              spec.metadata['yard.run'] = 'yri'
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
              spec. 
     | 
| 
       26 
     | 
    
         
            -
              spec.add_development_dependency ' 
     | 
| 
      
 25 
     | 
    
         
            +
              spec.required_ruby_version = '>= 2.4'
         
     | 
| 
      
 26 
     | 
    
         
            +
              spec.add_development_dependency 'bundler', '~> 2.0'
         
     | 
| 
       27 
27 
     | 
    
         
             
              spec.add_development_dependency 'minitest', '~> 5.11.3'
         
     | 
| 
      
 28 
     | 
    
         
            +
              spec.add_development_dependency 'rake', '~> 12.3.0'
         
     | 
| 
      
 29 
     | 
    
         
            +
              spec.add_development_dependency 'simplecov', '~> 0.16.1'
         
     | 
| 
       28 
30 
     | 
    
         
             
              spec.add_development_dependency 'yard', '~> 0.9.12'
         
     | 
| 
       29 
     | 
    
         
            -
              spec.add_development_dependency 'simplecov', '~> 0.15.1'
         
     | 
| 
       30 
31 
     | 
    
         
             
            end
         
     | 
    
        data/lib/consoler/application.rb
    CHANGED
    
    | 
         @@ -4,7 +4,6 @@ require_relative 'options' 
     | 
|
| 
       4 
4 
     | 
    
         
             
            require_relative 'arguments'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module Consoler
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
7 
     | 
    
         
             
              # Consoler application
         
     | 
| 
       9 
8 
     | 
    
         
             
              #
         
     | 
| 
       10 
9 
     | 
    
         
             
              # @example A simple application
         
     | 
| 
         @@ -24,16 +23,31 @@ module Consoler 
     | 
|
| 
       24 
23 
     | 
    
         
             
              #   # this does not match, nothing is executed and the usage message is printed
         
     | 
| 
       25 
24 
     | 
    
         
             
              #   app.run(['deploy', 'production'])
         
     | 
| 
       26 
25 
     | 
    
         
             
              class Application
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
26 
     | 
    
         
             
                # Create a consoler application
         
     | 
| 
       29 
27 
     | 
    
         
             
                #
         
     | 
| 
       30 
28 
     | 
    
         
             
                # @param options [Hash] Options for the application
         
     | 
| 
       31 
29 
     | 
    
         
             
                # @option options [String] :description The description for the application (optional)
         
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
      
 30 
     | 
    
         
            +
                # @option options [bool] :rescue_errors Should the application catch errors (optional)
         
     | 
| 
      
 31 
     | 
    
         
            +
                def initialize(options = {})
         
     | 
| 
       33 
32 
     | 
    
         
             
                  @description = options[:description]
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @rescue_errors = if !options[:rescue_errors].nil? then
         
     | 
| 
      
 34 
     | 
    
         
            +
                                    options[:rescue_errors]
         
     | 
| 
      
 35 
     | 
    
         
            +
                                   else
         
     | 
| 
      
 36 
     | 
    
         
            +
                                     true
         
     | 
| 
      
 37 
     | 
    
         
            +
                                   end
         
     | 
| 
       34 
38 
     | 
    
         
             
                  @commands = []
         
     | 
| 
       35 
39 
     | 
    
         
             
                end
         
     | 
| 
       36 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
                # Accept all method_missing call
         
     | 
| 
      
 42 
     | 
    
         
            +
                #
         
     | 
| 
      
 43 
     | 
    
         
            +
                # We use the name as a command name, thus we accept all names
         
     | 
| 
      
 44 
     | 
    
         
            +
                #
         
     | 
| 
      
 45 
     | 
    
         
            +
                # @param _method_name [String] Name of the method
         
     | 
| 
      
 46 
     | 
    
         
            +
                # @param _include_private [bool] Name of the method
         
     | 
| 
      
 47 
     | 
    
         
            +
                def respond_to_missing?(_method_name, _include_private = false)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  true
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       37 
51 
     | 
    
         
             
                # Register a command for this app
         
     | 
| 
       38 
52 
     | 
    
         
             
                #
         
     | 
| 
       39 
53 
     | 
    
         
             
                # @param command_name [Symbol] Name of the command
         
     | 
| 
         @@ -44,21 +58,21 @@ module Consoler 
     | 
|
| 
       44 
58 
     | 
    
         
             
                  action = nil
         
     | 
| 
       45 
59 
     | 
    
         
             
                  options_def = ''
         
     | 
| 
       46 
60 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
                  unless block.nil? 
     | 
| 
      
 61 
     | 
    
         
            +
                  unless block.nil?
         
     | 
| 
       48 
62 
     | 
    
         
             
                    action = block
         
     | 
| 
       49 
63 
     | 
    
         
             
                    options_def = input
         
     | 
| 
       50 
64 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                    if  
     | 
| 
      
 65 
     | 
    
         
            +
                    if !options_def.nil? && !options_def.instance_of?(String)
         
     | 
| 
       52 
66 
     | 
    
         
             
                      raise 'Invalid options'
         
     | 
| 
       53 
67 
     | 
    
         
             
                    end
         
     | 
| 
       54 
68 
     | 
    
         
             
                  end
         
     | 
| 
       55 
69 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
                  if input.instance_of? Consoler::Application 
     | 
| 
      
 70 
     | 
    
         
            +
                  if input.instance_of? Consoler::Application
         
     | 
| 
       57 
71 
     | 
    
         
             
                    action = input
         
     | 
| 
       58 
72 
     | 
    
         
             
                    options_def = ''
         
     | 
| 
       59 
73 
     | 
    
         
             
                  end
         
     | 
| 
       60 
74 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
                  if action.nil? 
     | 
| 
      
 75 
     | 
    
         
            +
                  if action.nil?
         
     | 
| 
       62 
76 
     | 
    
         
             
                    raise 'Invalid subapp/block'
         
     | 
| 
       63 
77 
     | 
    
         
             
                  end
         
     | 
| 
       64 
78 
     | 
    
         | 
| 
         @@ -66,7 +80,7 @@ module Consoler 
     | 
|
| 
       66 
80 
     | 
    
         | 
| 
       67 
81 
     | 
    
         
             
                  _add_command(command, options_def, action)
         
     | 
| 
       68 
82 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 83 
     | 
    
         
            +
                  nil
         
     | 
| 
       70 
84 
     | 
    
         
             
                end
         
     | 
| 
       71 
85 
     | 
    
         | 
| 
       72 
86 
     | 
    
         
             
                # Run the application with a list of arguments
         
     | 
| 
         @@ -75,15 +89,22 @@ module Consoler 
     | 
|
| 
       75 
89 
     | 
    
         
             
                # @param disable_usage_message [Boolean] Disable the usage message when nothing it matched
         
     | 
| 
       76 
90 
     | 
    
         
             
                # @return [mixed] Result of your matched command, <tt>nil</tt> otherwise
         
     | 
| 
       77 
91 
     | 
    
         
             
                def run(args = ARGV, disable_usage_message = false)
         
     | 
| 
       78 
     | 
    
         
            -
                  # TODO signal handling of some kind?
         
     | 
| 
      
 92 
     | 
    
         
            +
                  # TODO: signal handling of some kind?
         
     | 
| 
       79 
93 
     | 
    
         | 
| 
       80 
94 
     | 
    
         
             
                  result, matched = _run(args.dup)
         
     | 
| 
       81 
95 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                  if  
     | 
| 
      
 96 
     | 
    
         
            +
                  if !matched && !disable_usage_message
         
     | 
| 
       83 
97 
     | 
    
         
             
                    usage
         
     | 
| 
       84 
98 
     | 
    
         
             
                  end
         
     | 
| 
       85 
99 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                   
     | 
| 
      
 100 
     | 
    
         
            +
                  result
         
     | 
| 
      
 101 
     | 
    
         
            +
                rescue RuntimeError => e
         
     | 
| 
      
 102 
     | 
    
         
            +
                  if @rescue_errors
         
     | 
| 
      
 103 
     | 
    
         
            +
                    $stderr.puts "A runtime error occured: #{e.message.strip}"
         
     | 
| 
      
 104 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 105 
     | 
    
         
            +
                  else
         
     | 
| 
      
 106 
     | 
    
         
            +
                    raise e
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
       87 
108 
     | 
    
         
             
                end
         
     | 
| 
       88 
109 
     | 
    
         | 
| 
       89 
110 
     | 
    
         
             
                # Show the usage message
         
     | 
| 
         @@ -93,7 +114,7 @@ module Consoler 
     | 
|
| 
       93 
114 
     | 
    
         
             
                  puts "#{@description}\n\n" unless @description.nil?
         
     | 
| 
       94 
115 
     | 
    
         
             
                  puts 'Usage:'
         
     | 
| 
       95 
116 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
                  _commands_usage $ 
     | 
| 
      
 117 
     | 
    
         
            +
                  _commands_usage $PROGRAM_NAME
         
     | 
| 
       97 
118 
     | 
    
         
             
                end
         
     | 
| 
       98 
119 
     | 
    
         | 
| 
       99 
120 
     | 
    
         
             
                protected
         
     | 
| 
         @@ -104,16 +125,37 @@ module Consoler 
     | 
|
| 
       104 
125 
     | 
    
         
             
                # @return [(mixed, Boolean)] Result of the command, and, did the args match a command at all
         
     | 
| 
       105 
126 
     | 
    
         
             
                def _run(args)
         
     | 
| 
       106 
127 
     | 
    
         
             
                  arg = args.shift
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                  return [nil, false] if arg.nil?
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
       107 
131 
     | 
    
         
             
                  arguments = Consoler::Arguments.new args
         
     | 
| 
      
 132 
     | 
    
         
            +
                  exact_matches = []
         
     | 
| 
      
 133 
     | 
    
         
            +
                  partial_matches = []
         
     | 
| 
       108 
134 
     | 
    
         | 
| 
       109 
135 
     | 
    
         
             
                  @commands.each do |command|
         
     | 
| 
       110 
     | 
    
         
            -
                    if command.command == arg 
     | 
| 
      
 136 
     | 
    
         
            +
                    if command.command == arg
         
     | 
| 
      
 137 
     | 
    
         
            +
                      exact_matches.push command
         
     | 
| 
      
 138 
     | 
    
         
            +
                    elsif command.command.start_with? arg
         
     | 
| 
      
 139 
     | 
    
         
            +
                      partial_matches.push command
         
     | 
| 
      
 140 
     | 
    
         
            +
                    end
         
     | 
| 
      
 141 
     | 
    
         
            +
                  end
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                  # we only allow a single partial match to prevent ambiguity
         
     | 
| 
      
 144 
     | 
    
         
            +
                  partial_match = if partial_matches.size == 1
         
     | 
| 
      
 145 
     | 
    
         
            +
                                    partial_matches[0]
         
     | 
| 
      
 146 
     | 
    
         
            +
                                  end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                  unless exact_matches.empty? && partial_match.nil?
         
     | 
| 
      
 149 
     | 
    
         
            +
                    matches = exact_matches
         
     | 
| 
      
 150 
     | 
    
         
            +
                    matches.push partial_match unless partial_match.nil?
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
                    matches.each do |command|
         
     | 
| 
       111 
153 
     | 
    
         
             
                      # the matched command contains a subapp, run subapp with the same
         
     | 
| 
       112 
154 
     | 
    
         
             
                      # arguments (excluding the arg that matched this command)
         
     | 
| 
       113 
     | 
    
         
            -
                      if command.action.instance_of? 
     | 
| 
      
 155 
     | 
    
         
            +
                      if command.action.instance_of?(Consoler::Application)
         
     | 
| 
       114 
156 
     | 
    
         
             
                        result, matched = command.action._run(args)
         
     | 
| 
       115 
157 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
                        if matched 
     | 
| 
      
 158 
     | 
    
         
            +
                        if matched
         
     | 
| 
       117 
159 
     | 
    
         
             
                          return result, true
         
     | 
| 
       118 
160 
     | 
    
         
             
                        end
         
     | 
| 
       119 
161 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -126,26 +168,26 @@ module Consoler 
     | 
|
| 
       126 
168 
     | 
    
         
             
                    end
         
     | 
| 
       127 
169 
     | 
    
         
             
                  end
         
     | 
| 
       128 
170 
     | 
    
         | 
| 
       129 
     | 
    
         
            -
                   
     | 
| 
      
 171 
     | 
    
         
            +
                  [nil, false]
         
     | 
| 
       130 
172 
     | 
    
         
             
                end
         
     | 
| 
       131 
173 
     | 
    
         | 
| 
       132 
174 
     | 
    
         
             
                # Print the usage message for this command
         
     | 
| 
       133 
175 
     | 
    
         
             
                #
         
     | 
| 
       134 
176 
     | 
    
         
             
                # @param [String] prefix A prefix for the command from a parent app
         
     | 
| 
       135 
177 
     | 
    
         
             
                # @return [Consoler::Application]
         
     | 
| 
       136 
     | 
    
         
            -
                def _commands_usage(prefix='')
         
     | 
| 
      
 178 
     | 
    
         
            +
                def _commands_usage(prefix = '')
         
     | 
| 
       137 
179 
     | 
    
         
             
                  @commands.each do |command|
         
     | 
| 
       138 
180 
     | 
    
         
             
                    # print the usage message of a subapp with a prefix from the current command
         
     | 
| 
       139 
     | 
    
         
            -
                    if command.action.instance_of? 
     | 
| 
      
 181 
     | 
    
         
            +
                    if command.action.instance_of?(Consoler::Application)
         
     | 
| 
       140 
182 
     | 
    
         
             
                      command.action._commands_usage "#{prefix} #{command.command}"
         
     | 
| 
       141 
183 
     | 
    
         
             
                    else
         
     | 
| 
       142 
184 
     | 
    
         
             
                      print "  #{prefix} #{command.command}"
         
     | 
| 
       143 
185 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                      if command.options.size 
     | 
| 
      
 186 
     | 
    
         
            +
                      if command.options.size
         
     | 
| 
       145 
187 
     | 
    
         
             
                        print " #{command.options.to_definition}"
         
     | 
| 
       146 
188 
     | 
    
         
             
                      end
         
     | 
| 
       147 
189 
     | 
    
         | 
| 
       148 
     | 
    
         
            -
                      unless command.options.description.nil? 
     | 
| 
      
 190 
     | 
    
         
            +
                      unless command.options.description.nil?
         
     | 
| 
       149 
191 
     | 
    
         
             
                        print "  -- #{command.options.description}"
         
     | 
| 
       150 
192 
     | 
    
         
             
                      end
         
     | 
| 
       151 
193 
     | 
    
         | 
| 
         @@ -165,11 +207,13 @@ module Consoler 
     | 
|
| 
       165 
207 
     | 
    
         
             
                # @param [Proc, Consoler::Application] action Action or subapp
         
     | 
| 
       166 
208 
     | 
    
         
             
                # @return [Consoler::Application]
         
     | 
| 
       167 
209 
     | 
    
         
             
                def _add_command(command, options_def, action)
         
     | 
| 
       168 
     | 
    
         
            -
                  @commands.push( 
     | 
| 
       169 
     | 
    
         
            -
                     
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
      
 210 
     | 
    
         
            +
                  @commands.push(
         
     | 
| 
      
 211 
     | 
    
         
            +
                    Consoler::Command.new(
         
     | 
| 
      
 212 
     | 
    
         
            +
                      command: command,
         
     | 
| 
      
 213 
     | 
    
         
            +
                      options: Consoler::Options.new(options_def),
         
     | 
| 
      
 214 
     | 
    
         
            +
                      action: action,
         
     | 
| 
      
 215 
     | 
    
         
            +
                    )
         
     | 
| 
      
 216 
     | 
    
         
            +
                  )
         
     | 
| 
       173 
217 
     | 
    
         | 
| 
       174 
218 
     | 
    
         
             
                  self
         
     | 
| 
       175 
219 
     | 
    
         
             
                end
         
     | 
| 
         @@ -183,7 +227,7 @@ module Consoler 
     | 
|
| 
       183 
227 
     | 
    
         
             
                  arguments = action.parameters.map do |parameter|
         
     | 
| 
       184 
228 
     | 
    
         
             
                    parameter_name = parameter[1].to_s
         
     | 
| 
       185 
229 
     | 
    
         | 
| 
       186 
     | 
    
         
            -
                    if match. 
     | 
| 
      
 230 
     | 
    
         
            +
                    if match.key? parameter_name
         
     | 
| 
       187 
231 
     | 
    
         
             
                      match[parameter_name]
         
     | 
| 
       188 
232 
     | 
    
         
             
                    else
         
     | 
| 
       189 
233 
     | 
    
         
             
                      # check for the normalized name of every match to see
         
     | 
| 
         @@ -191,8 +235,8 @@ module Consoler 
     | 
|
| 
       191 
235 
     | 
    
         
             
                      match.each do |name, value|
         
     | 
| 
       192 
236 
     | 
    
         
             
                        normalized_name = _normalize name
         
     | 
| 
       193 
237 
     | 
    
         | 
| 
       194 
     | 
    
         
            -
                        if parameter_name == normalized_name 
     | 
| 
       195 
     | 
    
         
            -
                           
     | 
| 
      
 238 
     | 
    
         
            +
                        if parameter_name == normalized_name
         
     | 
| 
      
 239 
     | 
    
         
            +
                          break value
         
     | 
| 
       196 
240 
     | 
    
         
             
                        end
         
     | 
| 
       197 
241 
     | 
    
         
             
                      end
         
     | 
| 
       198 
242 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -212,7 +256,7 @@ module Consoler 
     | 
|
| 
       212 
256 
     | 
    
         
             
                  # also be an syntax error, like starting with a number.
         
     | 
| 
       213 
257 
     | 
    
         
             
                  # this normalization is more of a comvenience than anything
         
     | 
| 
       214 
258 
     | 
    
         
             
                  # else
         
     | 
| 
       215 
     | 
    
         
            -
                  name. 
     | 
| 
      
 259 
     | 
    
         
            +
                  name.tr('-', '_')
         
     | 
| 
       216 
260 
     | 
    
         
             
                end
         
     | 
| 
       217 
261 
     | 
    
         
             
              end
         
     | 
| 
       218 
262 
     | 
    
         
             
            end
         
     | 
    
        data/lib/consoler/arguments.rb
    CHANGED