command_mapper 0.1.1 → 0.2.1
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/.document +3 -0
- data/.github/workflows/ruby.yml +2 -1
- data/ChangeLog.md +32 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +41 -8
- data/examples/grep.rb +62 -0
- data/lib/command_mapper/arg.rb +5 -0
- data/lib/command_mapper/argument.rb +6 -0
- data/lib/command_mapper/command.rb +209 -56
- data/lib/command_mapper/option.rb +50 -13
- data/lib/command_mapper/option_value.rb +22 -0
- data/lib/command_mapper/types/enum.rb +8 -0
- data/lib/command_mapper/types/hex.rb +16 -2
- data/lib/command_mapper/types/input_dir.rb +2 -0
- data/lib/command_mapper/types/input_file.rb +2 -0
- data/lib/command_mapper/types/input_path.rb +2 -0
- data/lib/command_mapper/types/key_value.rb +10 -0
- data/lib/command_mapper/types/key_value_list.rb +2 -0
- data/lib/command_mapper/types/list.rb +10 -0
- data/lib/command_mapper/types/map.rb +12 -1
- data/lib/command_mapper/types/num.rb +28 -1
- data/lib/command_mapper/types/str.rb +10 -1
- data/lib/command_mapper/types/type.rb +4 -0
- data/lib/command_mapper/version.rb +1 -1
- data/spec/commnad_spec.rb +345 -74
- data/spec/option_spec.rb +252 -1
- data/spec/option_value_spec.rb +28 -0
- data/spec/types/hex_spec.rb +59 -1
- data/spec/types/map_spec.rb +2 -2
- data/spec/types/num_spec.rb +93 -3
- metadata +4 -2
    
        data/spec/option_spec.rb
    CHANGED
    
    | @@ -41,6 +41,14 @@ describe CommandMapper::Option do | |
| 41 41 | 
             
                  end
         | 
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 | 
            +
                context "when value_in_flag: true is given" do
         | 
| 45 | 
            +
                  subject { described_class.new(flag, value_in_flag: true) }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  it "#value_in_flag? must return true" do
         | 
| 48 | 
            +
                    expect(subject.value_in_flag?).to be(true)
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 44 52 | 
             
                context "when given the repeats: true keyword argument" do
         | 
| 45 53 | 
             
                  subject { described_class.new(flag, repeats: true) }
         | 
| 46 54 |  | 
| @@ -177,6 +185,97 @@ describe CommandMapper::Option do | |
| 177 185 | 
             
                end
         | 
| 178 186 | 
             
              end
         | 
| 179 187 |  | 
| 188 | 
            +
              describe "#accepts_value?" do
         | 
| 189 | 
            +
                context "when initialized with the value: keyword argument" do
         | 
| 190 | 
            +
                  context "and when value: is true" do
         | 
| 191 | 
            +
                    subject { described_class.new(flag, value: true) }
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                    it "must return true" do
         | 
| 194 | 
            +
                      expect(subject.accepts_value?).to be(true)
         | 
| 195 | 
            +
                    end
         | 
| 196 | 
            +
                  end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                  context "and when value: is a Hash" do
         | 
| 199 | 
            +
                    let(:value_required) { true }
         | 
| 200 | 
            +
                    let(:value_type)     { Types::KeyValue.new }
         | 
| 201 | 
            +
                    let(:value_kwargs) do
         | 
| 202 | 
            +
                      {
         | 
| 203 | 
            +
                        required: value_required,
         | 
| 204 | 
            +
                        type:     value_type
         | 
| 205 | 
            +
                      }
         | 
| 206 | 
            +
                    end
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                    subject { described_class.new(flag, value: value_kwargs) }
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                    it "must return true" do
         | 
| 211 | 
            +
                      expect(subject.accepts_value?).to be(true)
         | 
| 212 | 
            +
                    end
         | 
| 213 | 
            +
                  end
         | 
| 214 | 
            +
                end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                context "when not initialied with the value: keyword argument" do
         | 
| 217 | 
            +
                  subject { described_class.new(flag) }
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                  it "must return false" do
         | 
| 220 | 
            +
                    expect(subject.accepts_value?).to be(false)
         | 
| 221 | 
            +
                  end
         | 
| 222 | 
            +
                end
         | 
| 223 | 
            +
              end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
              describe "#equals?" do
         | 
| 226 | 
            +
                context "when initialized with equals: true" do
         | 
| 227 | 
            +
                  subject { described_class.new(flag, value: true, equals: true) }
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                  it "must return true" do
         | 
| 230 | 
            +
                    expect(subject.equals?).to be(true)
         | 
| 231 | 
            +
                  end
         | 
| 232 | 
            +
                end
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                context "when not initialized with equals: true" do
         | 
| 235 | 
            +
                  subject { described_class.new(flag, value: true) }
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                  it "must return nil" do
         | 
| 238 | 
            +
                    expect(subject.equals?).to be(nil)
         | 
| 239 | 
            +
                  end
         | 
| 240 | 
            +
                end
         | 
| 241 | 
            +
              end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
              describe "#repeats?" do
         | 
| 244 | 
            +
                context "when initialized with repeats: true" do
         | 
| 245 | 
            +
                  subject { described_class.new(flag, value: true, repeats: true) }
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                  it "must return true" do
         | 
| 248 | 
            +
                    expect(subject.repeats?).to be(true)
         | 
| 249 | 
            +
                  end
         | 
| 250 | 
            +
                end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                context "when not initialized with repeats: true" do
         | 
| 253 | 
            +
                  subject { described_class.new(flag, value: true) }
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                  it "must return false" do
         | 
| 256 | 
            +
                    expect(subject.repeats?).to be(false)
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
                end
         | 
| 259 | 
            +
              end
         | 
| 260 | 
            +
             | 
| 261 | 
            +
              describe "#value_in_flag?" do
         | 
| 262 | 
            +
                context "when initialized with value_in_flag: true" do
         | 
| 263 | 
            +
                  subject { described_class.new(flag, value: true, value_in_flag: true) }
         | 
| 264 | 
            +
             | 
| 265 | 
            +
                  it "must return true" do
         | 
| 266 | 
            +
                    expect(subject.value_in_flag?).to be(true)
         | 
| 267 | 
            +
                  end
         | 
| 268 | 
            +
                end
         | 
| 269 | 
            +
             | 
| 270 | 
            +
                context "when not initialized with value_in_flag: true" do
         | 
| 271 | 
            +
                  subject { described_class.new(flag, value: true) }
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                  it "must return nil" do
         | 
| 274 | 
            +
                    expect(subject.value_in_flag?).to be(nil)
         | 
| 275 | 
            +
                  end
         | 
| 276 | 
            +
                end
         | 
| 277 | 
            +
              end
         | 
| 278 | 
            +
             | 
| 180 279 | 
             
              let(:flag) { "--opt" }
         | 
| 181 280 | 
             
              let(:name) { "opt" }
         | 
| 182 281 |  | 
| @@ -199,11 +298,17 @@ describe CommandMapper::Option do | |
| 199 298 | 
             
                }
         | 
| 200 299 | 
             
              end
         | 
| 201 300 |  | 
| 301 | 
            +
              let(:equals) { nil }
         | 
| 302 | 
            +
              let(:value_in_flag) { nil }
         | 
| 303 | 
            +
             | 
| 202 304 | 
             
              subject do
         | 
| 203 305 | 
             
                if accepts_value
         | 
| 204 306 | 
             
                  described_class.new(flag, name:    name,
         | 
| 205 307 | 
             
                                            value:   value_kwargs,
         | 
| 206 | 
            -
                                            repeats: repeats | 
| 308 | 
            +
                                            repeats: repeats,
         | 
| 309 | 
            +
                                            # formatting options
         | 
| 310 | 
            +
                                            equals:        equals,
         | 
| 311 | 
            +
                                            value_in_flag: value_in_flag)
         | 
| 207 312 | 
             
                else
         | 
| 208 313 | 
             
                  described_class.new(flag, name: name, repeats: repeats)
         | 
| 209 314 | 
             
                end
         | 
| @@ -516,6 +621,34 @@ describe CommandMapper::Option do | |
| 516 621 | 
             
                          )
         | 
| 517 622 | 
             
                        end
         | 
| 518 623 |  | 
| 624 | 
            +
                        context "and #equals? is true" do
         | 
| 625 | 
            +
                          let(:equals) { true }
         | 
| 626 | 
            +
             | 
| 627 | 
            +
                          it "must return an argv of option flag=value Strings" do
         | 
| 628 | 
            +
                            expect(subject.argv(values)).to eq(
         | 
| 629 | 
            +
                              [
         | 
| 630 | 
            +
                                "#{flag}=#{values[0]}",
         | 
| 631 | 
            +
                                "#{flag}=#{values[1]}",
         | 
| 632 | 
            +
                                "#{flag}=#{values[2]}"
         | 
| 633 | 
            +
                              ]
         | 
| 634 | 
            +
                            )
         | 
| 635 | 
            +
                          end
         | 
| 636 | 
            +
                        end
         | 
| 637 | 
            +
             | 
| 638 | 
            +
                        context "and #value_in_flag? is true" do
         | 
| 639 | 
            +
                          let(:value_in_flag) { true }
         | 
| 640 | 
            +
             | 
| 641 | 
            +
                          it "must return an argv of option flag + value Strings" do
         | 
| 642 | 
            +
                            expect(subject.argv(values)).to eq(
         | 
| 643 | 
            +
                              [
         | 
| 644 | 
            +
                                "#{flag}#{values[0]}",
         | 
| 645 | 
            +
                                "#{flag}#{values[1]}",
         | 
| 646 | 
            +
                                "#{flag}#{values[2]}"
         | 
| 647 | 
            +
                              ]
         | 
| 648 | 
            +
                            )
         | 
| 649 | 
            +
                          end
         | 
| 650 | 
            +
                        end
         | 
| 651 | 
            +
             | 
| 519 652 | 
             
                        context "but one of the Array's elements is invalid" do
         | 
| 520 653 | 
             
                          let(:value) { ["foo", " ", "baz"] }
         | 
| 521 654 |  | 
| @@ -578,6 +711,32 @@ describe CommandMapper::Option do | |
| 578 711 | 
             
                            )
         | 
| 579 712 | 
             
                          end
         | 
| 580 713 |  | 
| 714 | 
            +
                          context "and #equals? is true" do
         | 
| 715 | 
            +
                            let(:equals) { true }
         | 
| 716 | 
            +
             | 
| 717 | 
            +
                            it "must return an argv of option flag=value Strings" do
         | 
| 718 | 
            +
                              expect(subject.argv(values)).to eq(
         | 
| 719 | 
            +
                                [
         | 
| 720 | 
            +
                                  "#{flag}=#{subject.value.format(values[0])}",
         | 
| 721 | 
            +
                                  "#{flag}=#{subject.value.format(values[1])}"
         | 
| 722 | 
            +
                                ]
         | 
| 723 | 
            +
                              )
         | 
| 724 | 
            +
                            end
         | 
| 725 | 
            +
                          end
         | 
| 726 | 
            +
             | 
| 727 | 
            +
                          context "and #value_in_flag? is true" do
         | 
| 728 | 
            +
                            let(:value_in_flag) { true }
         | 
| 729 | 
            +
             | 
| 730 | 
            +
                            it "must return an argv of option flag + value Strings" do
         | 
| 731 | 
            +
                              expect(subject.argv(values)).to eq(
         | 
| 732 | 
            +
                                [
         | 
| 733 | 
            +
                                  "#{flag}#{subject.value.format(values[0])}",
         | 
| 734 | 
            +
                                  "#{flag}#{subject.value.format(values[1])}"
         | 
| 735 | 
            +
                                ]
         | 
| 736 | 
            +
                              )
         | 
| 737 | 
            +
                            end
         | 
| 738 | 
            +
                          end
         | 
| 739 | 
            +
             | 
| 581 740 | 
             
                          context "but one of the Hashes is empty" do
         | 
| 582 741 | 
             
                            let(:values) do
         | 
| 583 742 | 
             
                              [{"foo" => 1}, {}]
         | 
| @@ -621,6 +780,22 @@ describe CommandMapper::Option do | |
| 621 780 | 
             
                          expect(subject.argv(value)).to eq([flag, value])
         | 
| 622 781 | 
             
                        end
         | 
| 623 782 |  | 
| 783 | 
            +
                        context "and #equals? is true" do
         | 
| 784 | 
            +
                          let(:equals) { true }
         | 
| 785 | 
            +
             | 
| 786 | 
            +
                          it "must return an argv containing an option flag=value String" do
         | 
| 787 | 
            +
                            expect(subject.argv(value)).to eq(["#{flag}=#{value}"])
         | 
| 788 | 
            +
                          end
         | 
| 789 | 
            +
                        end
         | 
| 790 | 
            +
             | 
| 791 | 
            +
                        context "and #value_in_flag? is true" do
         | 
| 792 | 
            +
                          let(:value_in_flag) { true }
         | 
| 793 | 
            +
             | 
| 794 | 
            +
                          it "must return an argv containing an option flag + value String" do
         | 
| 795 | 
            +
                            expect(subject.argv(value)).to eq(["#{flag}#{value}"])
         | 
| 796 | 
            +
                          end
         | 
| 797 | 
            +
                        end
         | 
| 798 | 
            +
             | 
| 624 799 | 
             
                        context "but it's invalid" do
         | 
| 625 800 | 
             
                          let(:value) { " " }
         | 
| 626 801 |  | 
| @@ -656,6 +831,26 @@ describe CommandMapper::Option do | |
| 656 831 | 
             
                            )
         | 
| 657 832 | 
             
                          end
         | 
| 658 833 |  | 
| 834 | 
            +
                          context "and #equals? is true" do
         | 
| 835 | 
            +
                            let(:equals) { true }
         | 
| 836 | 
            +
             | 
| 837 | 
            +
                            it "must return an argv containing an option flag=value String" do
         | 
| 838 | 
            +
                              expect(subject.argv(value)).to eq(
         | 
| 839 | 
            +
                                ["#{flag}=#{subject.value.format(value)}"]
         | 
| 840 | 
            +
                              )
         | 
| 841 | 
            +
                            end
         | 
| 842 | 
            +
                          end
         | 
| 843 | 
            +
             | 
| 844 | 
            +
                          context "and #value_in_flag? is true" do
         | 
| 845 | 
            +
                            let(:value_in_flag) { true }
         | 
| 846 | 
            +
             | 
| 847 | 
            +
                            it "must return an argv of option flag + value Strings" do
         | 
| 848 | 
            +
                              expect(subject.argv(value)).to eq(
         | 
| 849 | 
            +
                                ["#{flag}#{subject.value.format(value)}"]
         | 
| 850 | 
            +
                              )
         | 
| 851 | 
            +
                            end
         | 
| 852 | 
            +
                          end
         | 
| 853 | 
            +
             | 
| 659 854 | 
             
                          context "but it's empty" do
         | 
| 660 855 | 
             
                            let(:value) { {} }
         | 
| 661 856 |  | 
| @@ -704,6 +899,22 @@ describe CommandMapper::Option do | |
| 704 899 | 
             
                        expect(subject.argv(value)).to eq([flag, value])
         | 
| 705 900 | 
             
                      end
         | 
| 706 901 |  | 
| 902 | 
            +
                      context "and #equals? is true" do
         | 
| 903 | 
            +
                        let(:equals) { true }
         | 
| 904 | 
            +
             | 
| 905 | 
            +
                        it "must return an argv containing an option flag=value String" do
         | 
| 906 | 
            +
                          expect(subject.argv(value)).to eq(["#{flag}=#{value}"])
         | 
| 907 | 
            +
                        end
         | 
| 908 | 
            +
                      end
         | 
| 909 | 
            +
             | 
| 910 | 
            +
                      context "and #value_in_flag? is true" do
         | 
| 911 | 
            +
                        let(:value_in_flag) { true }
         | 
| 912 | 
            +
             | 
| 913 | 
            +
                        it "must return an argv containing an option flag + value String" do
         | 
| 914 | 
            +
                          expect(subject.argv(value)).to eq(["#{flag}#{value}"])
         | 
| 915 | 
            +
                        end
         | 
| 916 | 
            +
                      end
         | 
| 917 | 
            +
             | 
| 707 918 | 
             
                      context "but it's invalid" do
         | 
| 708 919 | 
             
                        let(:value) { " " }
         | 
| 709 920 |  | 
| @@ -743,6 +954,26 @@ describe CommandMapper::Option do | |
| 743 954 | 
             
                          )
         | 
| 744 955 | 
             
                        end
         | 
| 745 956 |  | 
| 957 | 
            +
                        context "and #equals? is true" do
         | 
| 958 | 
            +
                          let(:equals) { true }
         | 
| 959 | 
            +
             | 
| 960 | 
            +
                          it "must return an argv containing an option flag=value String" do
         | 
| 961 | 
            +
                            expect(subject.argv(value)).to eq(
         | 
| 962 | 
            +
                              ["#{flag}=#{subject.value.format(value)}"]
         | 
| 963 | 
            +
                            )
         | 
| 964 | 
            +
                          end
         | 
| 965 | 
            +
                        end
         | 
| 966 | 
            +
             | 
| 967 | 
            +
                        context "and #value_in_flag? is true" do
         | 
| 968 | 
            +
                          let(:value_in_flag) { true }
         | 
| 969 | 
            +
             | 
| 970 | 
            +
                          it "must return an argv containing an option flag + value String" do
         | 
| 971 | 
            +
                            expect(subject.argv(value)).to eq(
         | 
| 972 | 
            +
                              ["#{flag}#{subject.value.format(value)}"]
         | 
| 973 | 
            +
                            )
         | 
| 974 | 
            +
                          end
         | 
| 975 | 
            +
                        end
         | 
| 976 | 
            +
             | 
| 746 977 | 
             
                        context "but one of the Array's elements is nil" do
         | 
| 747 978 | 
             
                          let(:value) { ["foo", nil, "baz"] }
         | 
| 748 979 |  | 
| @@ -795,6 +1026,26 @@ describe CommandMapper::Option do | |
| 795 1026 | 
             
                          )
         | 
| 796 1027 | 
             
                        end
         | 
| 797 1028 |  | 
| 1029 | 
            +
                        context "and #equals? is true" do
         | 
| 1030 | 
            +
                          let(:equals) { true }
         | 
| 1031 | 
            +
             | 
| 1032 | 
            +
                          it "must return an argv containing an option flag=value String" do
         | 
| 1033 | 
            +
                            expect(subject.argv(value)).to eq(
         | 
| 1034 | 
            +
                              ["#{flag}=#{subject.value.format(value)}"]
         | 
| 1035 | 
            +
                            )
         | 
| 1036 | 
            +
                          end
         | 
| 1037 | 
            +
                        end
         | 
| 1038 | 
            +
             | 
| 1039 | 
            +
                        context "and #value_in_flag? is true" do
         | 
| 1040 | 
            +
                          let(:value_in_flag) { true }
         | 
| 1041 | 
            +
             | 
| 1042 | 
            +
                          it "must return an argv of option flag + value Strings" do
         | 
| 1043 | 
            +
                            expect(subject.argv(value)).to eq(
         | 
| 1044 | 
            +
                              ["#{flag}#{subject.value.format(value)}"]
         | 
| 1045 | 
            +
                            )
         | 
| 1046 | 
            +
                          end
         | 
| 1047 | 
            +
                        end
         | 
| 1048 | 
            +
             | 
| 798 1049 | 
             
                        context "but it's empty" do
         | 
| 799 1050 | 
             
                          let(:value) { {} }
         | 
| 800 1051 |  | 
    
        data/spec/option_value_spec.rb
    CHANGED
    
    | @@ -1,8 +1,36 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 | 
             
            require 'command_mapper/option_value'
         | 
| 3 | 
            +
            require 'command_mapper/types/num'
         | 
| 3 4 | 
             
            require 'command_mapper/types/list'
         | 
| 4 5 |  | 
| 5 6 | 
             
            describe CommandMapper::OptionValue do
         | 
| 7 | 
            +
              describe "#validate" do
         | 
| 8 | 
            +
                let(:type) { Types::Num.new }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                subject { described_class.new(type: type) }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                context "when the option value is not required" do
         | 
| 13 | 
            +
                  subject do
         | 
| 14 | 
            +
                    described_class.new(type: type, required: false)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  context "and given a value of true" do
         | 
| 18 | 
            +
                    it "must return true" do
         | 
| 19 | 
            +
                      expect(subject.validate(true)).to be(true)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                context "otherwise" do
         | 
| 25 | 
            +
                  it "must validate the value using #type.validate" do
         | 
| 26 | 
            +
                    expect(subject.validate('1234')).to be(true)
         | 
| 27 | 
            +
                    expect(subject.validate('foo')).to eq(
         | 
| 28 | 
            +
                      [false, "contains non-numeric characters (\"foo\")"]
         | 
| 29 | 
            +
                    )
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 6 34 | 
             
              describe "#format" do
         | 
| 7 35 | 
             
                let(:type) { Types::List.new }
         | 
| 8 36 |  | 
    
        data/spec/types/hex_spec.rb
    CHANGED
    
    | @@ -14,6 +14,16 @@ describe CommandMapper::Types::Hex do | |
| 14 14 | 
             
                    expect(subject.leading_zero?).to be(true)
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 | 
             
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                context "when initialized with range: ..." do
         | 
| 19 | 
            +
                  let(:range) { 1..10 }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  subject { described_class.new(range: range) }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  it "must set #range" do
         | 
| 24 | 
            +
                    expect(subject.range).to eq(range)
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 17 27 | 
             
              end
         | 
| 18 28 |  | 
| 19 29 | 
             
              describe "#leading_zero?" do
         | 
| @@ -69,12 +79,60 @@ describe CommandMapper::Types::Hex do | |
| 69 79 | 
             
                      expect(subject.validate(value)).to be(true)
         | 
| 70 80 | 
             
                    end
         | 
| 71 81 |  | 
| 82 | 
            +
                    context "when initialized with range: ..." do
         | 
| 83 | 
            +
                      let(:range) { 2..16 }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                      subject { described_class.new(range: range) }
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      context "and the value is within the range of values" do
         | 
| 88 | 
            +
                        let(:value) { 'a' }
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                        it "must return true" do
         | 
| 91 | 
            +
                          expect(subject.validate(value)).to be(true)
         | 
| 92 | 
            +
                        end
         | 
| 93 | 
            +
                      end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                      context "but the value is not within the range of values" do
         | 
| 96 | 
            +
                        let(:value) { '0' }
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                        it "must return [false, \"unacceptable value (...)\"]" do
         | 
| 99 | 
            +
                          expect(subject.validate(value)).to eq(
         | 
| 100 | 
            +
                            [false, "unacceptable value (#{value.inspect})"]
         | 
| 101 | 
            +
                          )
         | 
| 102 | 
            +
                        end
         | 
| 103 | 
            +
                      end
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
             | 
| 72 106 | 
             
                    context "and the String begins with a '0x'" do
         | 
| 73 107 | 
             
                      let(:value) { "0xabcdef" }
         | 
| 74 108 |  | 
| 75 109 | 
             
                      it "must return true" do
         | 
| 76 110 | 
             
                        expect(subject.validate(value)).to be(true)
         | 
| 77 111 | 
             
                      end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                      context "when initialized with range: ..." do
         | 
| 114 | 
            +
                        let(:range) { 2..16 }
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                        subject { described_class.new(range: range) }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                        context "and the value is within the range of values" do
         | 
| 119 | 
            +
                          let(:value) { '0x4' }
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                          it "must return true" do
         | 
| 122 | 
            +
                            expect(subject.validate(value)).to be(true)
         | 
| 123 | 
            +
                          end
         | 
| 124 | 
            +
                        end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                        context "but the value is not within the range of values" do
         | 
| 127 | 
            +
                          let(:value) { '0x0' }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                          it "must return [false, \"unacceptable value (...)\"]" do
         | 
| 130 | 
            +
                            expect(subject.validate(value)).to eq(
         | 
| 131 | 
            +
                              [false, "unacceptable value (#{value.inspect})"]
         | 
| 132 | 
            +
                            )
         | 
| 133 | 
            +
                          end
         | 
| 134 | 
            +
                        end
         | 
| 135 | 
            +
                      end
         | 
| 78 136 | 
             
                    end
         | 
| 79 137 |  | 
| 80 138 | 
             
                    context "and the String contains a newline" do
         | 
| @@ -88,7 +146,7 @@ describe CommandMapper::Types::Hex do | |
| 88 146 | 
             
                    end
         | 
| 89 147 | 
             
                  end
         | 
| 90 148 |  | 
| 91 | 
            -
                  context "but the String  | 
| 149 | 
            +
                  context "but the String contains other characters" do
         | 
| 92 150 | 
             
                    let(:value) { "foo" }
         | 
| 93 151 |  | 
| 94 152 | 
             
                    it "must return [false, \"not in hex format (...)\"]" do
         | 
    
        data/spec/types/map_spec.rb
    CHANGED
    
    | @@ -41,9 +41,9 @@ describe CommandMapper::Types::Map do | |
| 41 41 | 
             
                context "when given a value that is not in the map" do
         | 
| 42 42 | 
             
                  let(:value) { 42 }
         | 
| 43 43 |  | 
| 44 | 
            -
                  it "must return [false, \"unknown value (...) | 
| 44 | 
            +
                  it "must return [false, \"unknown value (...) must be ..., or ...\"]" do
         | 
| 45 45 | 
             
                    expect(subject.validate(value)).to eq(
         | 
| 46 | 
            -
                      [false, "unknown value (#{value.inspect})"]
         | 
| 46 | 
            +
                      [false, "unknown value (#{value.inspect}) must be #{subject.map.keys.map(&:inspect).join(', ')}, or #{subject.map.values.map(&:inspect).join(', ')}"]
         | 
| 47 47 | 
             
                    )
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 | 
             
                end
         | 
    
        data/spec/types/num_spec.rb
    CHANGED
    
    | @@ -2,6 +2,24 @@ require 'spec_helper' | |
| 2 2 | 
             
            require 'command_mapper/types/num'
         | 
| 3 3 |  | 
| 4 4 | 
             
            describe CommandMapper::Types::Num do
         | 
| 5 | 
            +
              describe "#initialize" do
         | 
| 6 | 
            +
                context "when initialized with no keyword arguments" do
         | 
| 7 | 
            +
                  it "must set #range to nil" do
         | 
| 8 | 
            +
                    expect(subject.range).to be(nil)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                context "when initialized with range: ..." do
         | 
| 13 | 
            +
                  let(:range) { 1..10 }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  subject { described_class.new(range: range) }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  it "must set #range" do
         | 
| 18 | 
            +
                    expect(subject.range).to eq(range)
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 5 23 | 
             
              describe "#validate" do
         | 
| 6 24 | 
             
                context "when given an Integer" do
         | 
| 7 25 | 
             
                  let(:value) { 1 }
         | 
| @@ -9,6 +27,30 @@ describe CommandMapper::Types::Num do | |
| 9 27 | 
             
                  it "must return true" do
         | 
| 10 28 | 
             
                    expect(subject.validate(value)).to be(true)
         | 
| 11 29 | 
             
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  context "when initialized with range: ..." do
         | 
| 32 | 
            +
                    let(:range) { 2..10 }
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    subject { described_class.new(range: range) }
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    context "and the value is within the range of values" do
         | 
| 37 | 
            +
                      let(:value) { 4 }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      it "must return true" do
         | 
| 40 | 
            +
                        expect(subject.validate(value)).to be(true)
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    context "but the value is not within the range of values" do
         | 
| 45 | 
            +
                      let(:value) { 0 }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                      it "must return [false, \"(...) not within the range of acceptable values (...)\"]" do
         | 
| 48 | 
            +
                        expect(subject.validate(value)).to eq(
         | 
| 49 | 
            +
                          [false, "(#{value.inspect}) not within the range of acceptable values (#{range.inspect})"]
         | 
| 50 | 
            +
                        )
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                  end
         | 
| 12 54 | 
             
                end
         | 
| 13 55 |  | 
| 14 56 | 
             
                context "when given a String" do
         | 
| @@ -19,7 +61,31 @@ describe CommandMapper::Types::Num do | |
| 19 61 | 
             
                      expect(subject.validate(value)).to be(true)
         | 
| 20 62 | 
             
                    end
         | 
| 21 63 |  | 
| 22 | 
            -
                    context " | 
| 64 | 
            +
                    context "when initialized with range: ..." do
         | 
| 65 | 
            +
                      let(:range) { 2..10 }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                      subject { described_class.new(range: range) }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                      context "and the value is within the range of values" do
         | 
| 70 | 
            +
                        let(:value) { '4' }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                        it "must return true" do
         | 
| 73 | 
            +
                          expect(subject.validate(value)).to be(true)
         | 
| 74 | 
            +
                        end
         | 
| 75 | 
            +
                      end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                      context "but the value is not within the range of values" do
         | 
| 78 | 
            +
                        let(:value) { '0' }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                        it "must return [false, \"(...) not within the range of acceptable values (...)\"]" do
         | 
| 81 | 
            +
                          expect(subject.validate(value)).to eq(
         | 
| 82 | 
            +
                            [false, "(#{value.inspect}) not within the range of acceptable values (#{range.inspect})"]
         | 
| 83 | 
            +
                          )
         | 
| 84 | 
            +
                        end
         | 
| 85 | 
            +
                      end
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    context "but the String contains a newline" do
         | 
| 23 89 | 
             
                      let(:value) { "01234\n56789" }
         | 
| 24 90 |  | 
| 25 91 | 
             
                      it "must return [false, \"contains non-numeric characters (...)\"]" do
         | 
| @@ -30,7 +96,7 @@ describe CommandMapper::Types::Num do | |
| 30 96 | 
             
                    end
         | 
| 31 97 | 
             
                  end
         | 
| 32 98 |  | 
| 33 | 
            -
                  context " | 
| 99 | 
            +
                  context "but it contains non-digits" do
         | 
| 34 100 | 
             
                    let(:value) { "12abc34" }
         | 
| 35 101 |  | 
| 36 102 | 
             
                    it "must return [false, \"contains non-numeric characters (...)\"]" do
         | 
| @@ -42,7 +108,7 @@ describe CommandMapper::Types::Num do | |
| 42 108 | 
             
                end
         | 
| 43 109 |  | 
| 44 110 | 
             
                context "when given another type of Object" do
         | 
| 45 | 
            -
                  context " | 
| 111 | 
            +
                  context "and it defines a #to_i method" do
         | 
| 46 112 | 
             
                    let(:value) { 1.0 }
         | 
| 47 113 |  | 
| 48 114 | 
             
                    it "must return true" do
         | 
| @@ -50,6 +116,30 @@ describe CommandMapper::Types::Num do | |
| 50 116 | 
             
                    end
         | 
| 51 117 | 
             
                  end
         | 
| 52 118 |  | 
| 119 | 
            +
                  context "when initialized with range: ..." do
         | 
| 120 | 
            +
                    let(:range) { 2..10 }
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                    subject { described_class.new(range: range) }
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    context "and the value is within the range of values" do
         | 
| 125 | 
            +
                      let(:value) { 4.0 }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                      it "must return true" do
         | 
| 128 | 
            +
                        expect(subject.validate(value)).to be(true)
         | 
| 129 | 
            +
                      end
         | 
| 130 | 
            +
                    end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    context "but the value is not within the range of values" do
         | 
| 133 | 
            +
                      let(:value) { 0.0 }
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                      it "must return [false, \"(...) not within the range of acceptable values (...)\"]" do
         | 
| 136 | 
            +
                        expect(subject.validate(value)).to eq(
         | 
| 137 | 
            +
                          [false, "(#{value.inspect}) not within the range of acceptable values (#{range.inspect})"]
         | 
| 138 | 
            +
                        )
         | 
| 139 | 
            +
                      end
         | 
| 140 | 
            +
                    end
         | 
| 141 | 
            +
                  end
         | 
| 142 | 
            +
             | 
| 53 143 | 
             
                  context "but it does not define a #to_i method" do
         | 
| 54 144 | 
             
                    let(:value) { Object.new }
         | 
| 55 145 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: command_mapper
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Postmodern
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2022-04-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -34,6 +34,7 @@ extra_rdoc_files: | |
| 34 34 | 
             
            - LICENSE.txt
         | 
| 35 35 | 
             
            - README.md
         | 
| 36 36 | 
             
            files:
         | 
| 37 | 
            +
            - ".document"
         | 
| 37 38 | 
             
            - ".github/workflows/ruby.yml"
         | 
| 38 39 | 
             
            - ".gitignore"
         | 
| 39 40 | 
             
            - ".rspec"
         | 
| @@ -44,6 +45,7 @@ files: | |
| 44 45 | 
             
            - README.md
         | 
| 45 46 | 
             
            - Rakefile
         | 
| 46 47 | 
             
            - commnad_mapper.gemspec
         | 
| 48 | 
            +
            - examples/grep.rb
         | 
| 47 49 | 
             
            - gemspec.yml
         | 
| 48 50 | 
             
            - lib/command_mapper.rb
         | 
| 49 51 | 
             
            - lib/command_mapper/arg.rb
         |