hotdog 0.6.0 → 0.6.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/lib/hotdog/application.rb +11 -0
- data/lib/hotdog/commands/pssh.rb +7 -8
- data/lib/hotdog/commands/search.rb +86 -26
- data/lib/hotdog/commands/ssh.rb +1 -0
- data/lib/hotdog/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1b087123acdf59f344d374145bdf0915f57757f6
         | 
| 4 | 
            +
              data.tar.gz: 0f22b57543b9b6d83e904d9f643eac3ccc3a6a52
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 51f9b047b0bc2cf02ae5abb013d02e1c0c52e5e7530ec7b27e313663a5e2022214d578a7bb58531e1f8c6e7833de1f2b4205e8c78bd319659c4499b67eb5edf1
         | 
| 7 | 
            +
              data.tar.gz: f6017f78210111e9bc19492b0a2b0724c15cfebe568e68d2902d71f5b2861428a3665caff8c25794d1ce07cbe057eb2ca05338a02a598b32b39611fd03514d9d
         | 
    
        data/lib/hotdog/application.rb
    CHANGED
    
    | @@ -80,6 +80,17 @@ module Hotdog | |
| 80 80 |  | 
| 81 81 | 
             
                      cmd.run(args, @options)
         | 
| 82 82 | 
             
                    end
         | 
| 83 | 
            +
                  rescue OptionParser::ParseError => error
         | 
| 84 | 
            +
                    STDERR.puts("hotdog: #{error.message}")
         | 
| 85 | 
            +
                    require "hotdog/commands/help"
         | 
| 86 | 
            +
                    get_command(command).tap do |cmd|
         | 
| 87 | 
            +
                      if Hotdog::Commands::Help === cmd
         | 
| 88 | 
            +
                        STDERR.puts("hotdog: '#{command}' is not a hotdog command.")
         | 
| 89 | 
            +
                      else
         | 
| 90 | 
            +
                        cmd.parse_options(@optparse, ["--help"])
         | 
| 91 | 
            +
                      end
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
                    exit(1)
         | 
| 83 94 | 
             
                  rescue Errno::EPIPE
         | 
| 84 95 | 
             
                    # nop
         | 
| 85 96 | 
             
                  end
         | 
    
        data/lib/hotdog/commands/pssh.rb
    CHANGED
    
    | @@ -78,21 +78,21 @@ module Hotdog | |
| 78 78 | 
             
                    end
         | 
| 79 79 | 
             
                  end
         | 
| 80 80 |  | 
| 81 | 
            +
                  private
         | 
| 81 82 | 
             
                  def exec_command(result0, options={})
         | 
| 82 83 | 
             
                    result, fields = get_hosts(result0)
         | 
| 83 84 | 
             
                    hosts = result.flatten
         | 
| 84 85 | 
             
                    threads = options[:max_parallelism] || hosts.size
         | 
| 86 | 
            +
                    use_color_p = use_color?
         | 
| 85 87 | 
             
                    stats = Parallel.map(hosts.zip(hosts), in_threads: threads) { |host, name|
         | 
| 86 | 
            -
                      if use_color?
         | 
| 87 | 
            -
                        header = "\e[0;36m#{name}\e[00m"
         | 
| 88 | 
            -
                      else
         | 
| 89 | 
            -
                        header = name
         | 
| 90 | 
            -
                      end
         | 
| 91 88 | 
             
                      cmdline = build_command_string(host, options)
         | 
| 92 89 | 
             
                      logger.debug("execute: #{cmdline}")
         | 
| 93 90 | 
             
                      IO.popen(cmdline, in: :close, err: [:child, :out]) do |io|
         | 
| 94 | 
            -
                        io. | 
| 95 | 
            -
                          STDOUT.write(" | 
| 91 | 
            +
                        io.each_with_index do |s, i|
         | 
| 92 | 
            +
                          STDOUT.write("\e[0;36m") if use_color_p
         | 
| 93 | 
            +
                          STDOUT.write("#{name}:#{i}:")
         | 
| 94 | 
            +
                          STDOUT.write("\e[0m") if use_color_p
         | 
| 95 | 
            +
                          STDOUT.write(s)
         | 
| 96 96 | 
             
                        end
         | 
| 97 97 | 
             
                      end
         | 
| 98 98 | 
             
                      $?.success? # $? is thread-local variable
         | 
| @@ -128,7 +128,6 @@ module Hotdog | |
| 128 128 | 
             
                    Shellwords.join(cmdline)
         | 
| 129 129 | 
             
                  end
         | 
| 130 130 |  | 
| 131 | 
            -
                  private
         | 
| 132 131 | 
             
                  def use_color?
         | 
| 133 132 | 
             
                    case options[:color]
         | 
| 134 133 | 
             
                    when :always
         | 
| @@ -213,10 +213,18 @@ module Hotdog | |
| 213 213 | 
             
                      end
         | 
| 214 214 | 
             
                    }
         | 
| 215 215 | 
             
                    rule(identifier_regexp: simple(:identifier_regexp), separator: simple(:separator)) {
         | 
| 216 | 
            -
                       | 
| 216 | 
            +
                      if "host" == identifier_regexp
         | 
| 217 | 
            +
                        AnyHostNode.new(separator)
         | 
| 218 | 
            +
                      else
         | 
| 219 | 
            +
                        RegexpTagNameNode.new(identifier_regexp.to_s, separator)
         | 
| 220 | 
            +
                      end
         | 
| 217 221 | 
             
                    }
         | 
| 218 222 | 
             
                    rule(identifier_regexp: simple(:identifier_regexp)) {
         | 
| 219 | 
            -
                       | 
| 223 | 
            +
                      if "host" == identifier_regexp
         | 
| 224 | 
            +
                        AnyHostNode.new(separator)
         | 
| 225 | 
            +
                      else
         | 
| 226 | 
            +
                        RegexpNode.new(identifier_regexp.to_s)
         | 
| 227 | 
            +
                      end
         | 
| 220 228 | 
             
                    }
         | 
| 221 229 | 
             
                    rule(identifier_glob: simple(:identifier_glob), separator: simple(:separator), attribute_glob: simple(:attribute_glob)) {
         | 
| 222 230 | 
             
                      if "host" == identifier_glob
         | 
| @@ -233,10 +241,18 @@ module Hotdog | |
| 233 241 | 
             
                      end
         | 
| 234 242 | 
             
                    }
         | 
| 235 243 | 
             
                    rule(identifier_glob: simple(:identifier_glob), separator: simple(:separator)) {
         | 
| 236 | 
            -
                       | 
| 244 | 
            +
                      if "host" == identifier_glob
         | 
| 245 | 
            +
                        AnyHostNode.new(separator)
         | 
| 246 | 
            +
                      else
         | 
| 247 | 
            +
                        GlobTagNameNode.new(identifier_glob.to_s, separator)
         | 
| 248 | 
            +
                      end
         | 
| 237 249 | 
             
                    }
         | 
| 238 250 | 
             
                    rule(identifier_glob: simple(:identifier_glob)) {
         | 
| 239 | 
            -
                       | 
| 251 | 
            +
                      if "host" == identifier_glob
         | 
| 252 | 
            +
                        AnyHostNode.new(separator)
         | 
| 253 | 
            +
                      else
         | 
| 254 | 
            +
                        GlobNode.new(identifier_glob.to_s)
         | 
| 255 | 
            +
                      end
         | 
| 240 256 | 
             
                    }
         | 
| 241 257 | 
             
                    rule(identifier: simple(:identifier), separator: simple(:separator), attribute_glob: simple(:attribute_glob)) {
         | 
| 242 258 | 
             
                      if "host" == identifier
         | 
| @@ -253,10 +269,18 @@ module Hotdog | |
| 253 269 | 
             
                      end
         | 
| 254 270 | 
             
                    }
         | 
| 255 271 | 
             
                    rule(identifier: simple(:identifier), separator: simple(:separator)) {
         | 
| 256 | 
            -
                       | 
| 272 | 
            +
                      if "host" == identifier
         | 
| 273 | 
            +
                        AnyHostNode.new(separator)
         | 
| 274 | 
            +
                      else
         | 
| 275 | 
            +
                        StringTagNameNode.new(identifier.to_s, separator)
         | 
| 276 | 
            +
                      end
         | 
| 257 277 | 
             
                    }
         | 
| 258 278 | 
             
                    rule(identifier: simple(:identifier)) {
         | 
| 259 | 
            -
                       | 
| 279 | 
            +
                      if "host" == identifier
         | 
| 280 | 
            +
                        AnyHostNode.new(separator)
         | 
| 281 | 
            +
                      else
         | 
| 282 | 
            +
                        StringNode.new(identifier.to_s)
         | 
| 283 | 
            +
                      end
         | 
| 260 284 | 
             
                    }
         | 
| 261 285 | 
             
                    rule(separator: simple(:separator), attribute_regexp: simple(:attribute_regexp)) {
         | 
| 262 286 | 
             
                      RegexpTagValueNode.new(attribute_regexp.to_s, separator)
         | 
| @@ -622,7 +646,7 @@ module Hotdog | |
| 622 646 | 
             
                        if expressions.all? { |expression| TagExpressionNode === expression }
         | 
| 623 647 | 
             
                          values = expressions.group_by { |expression| expression.class }.values.flat_map { |expressions|
         | 
| 624 648 | 
             
                            if query_without_condition = expressions.first.maybe_query_without_condition(options)
         | 
| 625 | 
            -
                              condition_length = expressions. | 
| 649 | 
            +
                              condition_length = expressions.map { |expression| expression.condition_values(options).length }.max
         | 
| 626 650 | 
             
                              expressions.each_slice(SQLITE_LIMIT_COMPOUND_SELECT / condition_length).flat_map { |expressions|
         | 
| 627 651 | 
             
                                q = query_without_condition.sub(/\s*;\s*\z/, "") + " WHERE " + expressions.map { |expression| "( %s )" % expression.condition(options) }.join(" OR ") + ";"
         | 
| 628 652 | 
             
                                environment.execute(q, expressions.flat_map { |expression| expression.condition_values(options) }).map { |row| row.first }
         | 
| @@ -836,6 +860,42 @@ module Hotdog | |
| 836 860 | 
             
                    end
         | 
| 837 861 | 
             
                  end
         | 
| 838 862 |  | 
| 863 | 
            +
                  class AnyHostNode < TagExpressionNode
         | 
| 864 | 
            +
                    def initialize(separator=nil)
         | 
| 865 | 
            +
                      super("host", nil, separator)
         | 
| 866 | 
            +
                    end
         | 
| 867 | 
            +
             | 
| 868 | 
            +
                    def condition(options={})
         | 
| 869 | 
            +
                      "1"
         | 
| 870 | 
            +
                    end
         | 
| 871 | 
            +
             | 
| 872 | 
            +
                    def condition_tables(options={})
         | 
| 873 | 
            +
                      [:hosts]
         | 
| 874 | 
            +
                    end
         | 
| 875 | 
            +
             | 
| 876 | 
            +
                    def condition_values(options={})
         | 
| 877 | 
            +
                      []
         | 
| 878 | 
            +
                    end
         | 
| 879 | 
            +
                  end
         | 
| 880 | 
            +
             | 
| 881 | 
            +
                  class AnyTagNode < TagExpressionNode
         | 
| 882 | 
            +
                    def initialize(separator=nil)
         | 
| 883 | 
            +
                      super(nil, nil, separator)
         | 
| 884 | 
            +
                    end
         | 
| 885 | 
            +
             | 
| 886 | 
            +
                    def condition(options={})
         | 
| 887 | 
            +
                      "1"
         | 
| 888 | 
            +
                    end
         | 
| 889 | 
            +
             | 
| 890 | 
            +
                    def condition_tables(options={})
         | 
| 891 | 
            +
                      [:tags]
         | 
| 892 | 
            +
                    end
         | 
| 893 | 
            +
             | 
| 894 | 
            +
                    def condition_values(options={})
         | 
| 895 | 
            +
                      []
         | 
| 896 | 
            +
                    end
         | 
| 897 | 
            +
                  end
         | 
| 898 | 
            +
             | 
| 839 899 | 
             
                  class StringExpressionNode < TagExpressionNode
         | 
| 840 900 | 
             
                  end
         | 
| 841 901 |  | 
| @@ -857,7 +917,7 @@ module Hotdog | |
| 857 917 | 
             
                    end
         | 
| 858 918 |  | 
| 859 919 | 
             
                    def maybe_fallback(options={})
         | 
| 860 | 
            -
                      fallback = GlobHostNode.new( | 
| 920 | 
            +
                      fallback = GlobHostNode.new(to_glob(attribute), separator)
         | 
| 861 921 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 862 922 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 863 923 | 
             
                      else
         | 
| @@ -884,7 +944,7 @@ module Hotdog | |
| 884 944 | 
             
                    end
         | 
| 885 945 |  | 
| 886 946 | 
             
                    def maybe_fallback(options={})
         | 
| 887 | 
            -
                      fallback = GlobTagNode.new( | 
| 947 | 
            +
                      fallback = GlobTagNode.new(to_glob(identifier), to_glob(attribute), separator)
         | 
| 888 948 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 889 949 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 890 950 | 
             
                      else
         | 
| @@ -911,7 +971,7 @@ module Hotdog | |
| 911 971 | 
             
                    end
         | 
| 912 972 |  | 
| 913 973 | 
             
                    def maybe_fallback(options={})
         | 
| 914 | 
            -
                      fallback = GlobTagNameNode.new( | 
| 974 | 
            +
                      fallback = GlobTagNameNode.new(to_glob(identifier), separator)
         | 
| 915 975 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 916 976 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 917 977 | 
             
                      else
         | 
| @@ -926,19 +986,19 @@ module Hotdog | |
| 926 986 | 
             
                    end
         | 
| 927 987 |  | 
| 928 988 | 
             
                    def condition(options={})
         | 
| 929 | 
            -
                      "tags.value = ?"
         | 
| 989 | 
            +
                      "hosts.name = ? OR tags.value = ?"
         | 
| 930 990 | 
             
                    end
         | 
| 931 991 |  | 
| 932 992 | 
             
                    def condition_tables(options={})
         | 
| 933 | 
            -
                      [:tags]
         | 
| 993 | 
            +
                      [:hosts, :tags]
         | 
| 934 994 | 
             
                    end
         | 
| 935 995 |  | 
| 936 996 | 
             
                    def condition_values(options={})
         | 
| 937 | 
            -
                      [attribute]
         | 
| 997 | 
            +
                      [attribute, attribute]
         | 
| 938 998 | 
             
                    end
         | 
| 939 999 |  | 
| 940 1000 | 
             
                    def maybe_fallback(options={})
         | 
| 941 | 
            -
                      fallback = GlobTagValueNode.new( | 
| 1001 | 
            +
                      fallback = GlobTagValueNode.new(to_glob(attribute), separator)
         | 
| 942 1002 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 943 1003 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 944 1004 | 
             
                      else
         | 
| @@ -965,7 +1025,7 @@ module Hotdog | |
| 965 1025 | 
             
                    end
         | 
| 966 1026 |  | 
| 967 1027 | 
             
                    def maybe_fallback(options={})
         | 
| 968 | 
            -
                      fallback = GlobNode.new( | 
| 1028 | 
            +
                      fallback = GlobNode.new(to_glob(identifier), separator)
         | 
| 969 1029 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 970 1030 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 971 1031 | 
             
                      else
         | 
| @@ -1003,7 +1063,7 @@ module Hotdog | |
| 1003 1063 | 
             
                    end
         | 
| 1004 1064 |  | 
| 1005 1065 | 
             
                    def maybe_fallback(options={})
         | 
| 1006 | 
            -
                      fallback = GlobHostNode.new( | 
| 1066 | 
            +
                      fallback = GlobHostNode.new(to_glob(attribute), separator)
         | 
| 1007 1067 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 1008 1068 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 1009 1069 | 
             
                      else
         | 
| @@ -1030,7 +1090,7 @@ module Hotdog | |
| 1030 1090 | 
             
                    end
         | 
| 1031 1091 |  | 
| 1032 1092 | 
             
                    def maybe_fallback(options={})
         | 
| 1033 | 
            -
                      fallback = GlobTagNode.new( | 
| 1093 | 
            +
                      fallback = GlobTagNode.new(to_glob(identifier), to_glob(attribute), separator)
         | 
| 1034 1094 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 1035 1095 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 1036 1096 | 
             
                      else
         | 
| @@ -1057,7 +1117,7 @@ module Hotdog | |
| 1057 1117 | 
             
                    end
         | 
| 1058 1118 |  | 
| 1059 1119 | 
             
                    def maybe_fallback(options={})
         | 
| 1060 | 
            -
                      fallback = GlobTagNameNode.new( | 
| 1120 | 
            +
                      fallback = GlobTagNameNode.new(to_glob(identifier), separator)
         | 
| 1061 1121 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 1062 1122 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 1063 1123 | 
             
                      else
         | 
| @@ -1072,19 +1132,19 @@ module Hotdog | |
| 1072 1132 | 
             
                    end
         | 
| 1073 1133 |  | 
| 1074 1134 | 
             
                    def condition(options={})
         | 
| 1075 | 
            -
                      "LOWER(tags.value) GLOB LOWER(?)"
         | 
| 1135 | 
            +
                      "LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?)"
         | 
| 1076 1136 | 
             
                    end
         | 
| 1077 1137 |  | 
| 1078 1138 | 
             
                    def condition_tables(options={})
         | 
| 1079 | 
            -
                      [:tags]
         | 
| 1139 | 
            +
                      [:hosts, :tags]
         | 
| 1080 1140 | 
             
                    end
         | 
| 1081 1141 |  | 
| 1082 1142 | 
             
                    def condition_values(options={})
         | 
| 1083 | 
            -
                      [attribute]
         | 
| 1143 | 
            +
                      [attribute, attribute]
         | 
| 1084 1144 | 
             
                    end
         | 
| 1085 1145 |  | 
| 1086 1146 | 
             
                    def maybe_fallback(options={})
         | 
| 1087 | 
            -
                      fallback = GlobTagValueNode.new( | 
| 1147 | 
            +
                      fallback = GlobTagValueNode.new(to_glob(attribute), separator)
         | 
| 1088 1148 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 1089 1149 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 1090 1150 | 
             
                      else
         | 
| @@ -1111,7 +1171,7 @@ module Hotdog | |
| 1111 1171 | 
             
                    end
         | 
| 1112 1172 |  | 
| 1113 1173 | 
             
                    def maybe_fallback(options={})
         | 
| 1114 | 
            -
                      fallback = GlobNode.new( | 
| 1174 | 
            +
                      fallback = GlobNode.new(to_glob(identifier), separator)
         | 
| 1115 1175 | 
             
                      if query = fallback.maybe_query(options)
         | 
| 1116 1176 | 
             
                        QueryExpressionNode.new(query, fallback.condition_values(options))
         | 
| 1117 1177 | 
             
                      else
         | 
| @@ -1191,15 +1251,15 @@ module Hotdog | |
| 1191 1251 | 
             
                    end
         | 
| 1192 1252 |  | 
| 1193 1253 | 
             
                    def condition(options={})
         | 
| 1194 | 
            -
                      "tags.value REGEXP ?"
         | 
| 1254 | 
            +
                      "hosts.name REGEXP ? OR tags.value REGEXP ?"
         | 
| 1195 1255 | 
             
                    end
         | 
| 1196 1256 |  | 
| 1197 1257 | 
             
                    def condition_tables(options={})
         | 
| 1198 | 
            -
                      [:tags]
         | 
| 1258 | 
            +
                      [:hosts, :tags]
         | 
| 1199 1259 | 
             
                    end
         | 
| 1200 1260 |  | 
| 1201 1261 | 
             
                    def condition_values(options={})
         | 
| 1202 | 
            -
                      [attribute]
         | 
| 1262 | 
            +
                      [attribute, attribute]
         | 
| 1203 1263 | 
             
                    end
         | 
| 1204 1264 | 
             
                  end
         | 
| 1205 1265 |  | 
    
        data/lib/hotdog/commands/ssh.rb
    CHANGED
    
    
    
        data/lib/hotdog/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hotdog
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.6. | 
| 4 | 
            +
              version: 0.6.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yamashita Yuu
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015-10- | 
| 11 | 
            +
            date: 2015-10-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         |