droxi 0.2.0 → 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/droxi.gemspec +1 -1
- data/lib/droxi/commands.rb +78 -34
- data/lib/droxi.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: 6e2082eebfa7309caf39ae23503dacebd697b296
         | 
| 4 | 
            +
              data.tar.gz: df6667fdb18de0438a79c11f990589412a67dae5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 58ac779ee0ded7200528cc15301da40c6485f3c63fc2cf98ae7282743d31d7e27cbe9c3fedaaabbff5ae6e466f965521ff3a85f506ba1a55c36810ea95da1837
         | 
| 7 | 
            +
              data.tar.gz: c4c44cb264cd3e9ccc046b50535c93e2451f0363fab1ec7beef8947bf6dc4f910d64f330d871edb2f7be8d355ff58a37c42819b6b78a71d838d0b141cafaade8
         | 
    
        data/droxi.gemspec
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.name        = 'droxi'
         | 
| 3 3 | 
             
              s.version     = IO.read('lib/droxi.rb')[/VERSION = '(.+)'/, 1]
         | 
| 4 | 
            -
              s.date        = '2014- | 
| 4 | 
            +
              s.date        = '2014-09-01'
         | 
| 5 5 | 
             
              s.summary     = 'ftp-like command-line interface to Dropbox'
         | 
| 6 6 | 
             
              s.description = "A command-line Dropbox interface inspired by GNU \
         | 
| 7 7 | 
             
                               coreutils, GNU ftp, and lftp. Features include smart tab \
         | 
    
        data/lib/droxi/commands.rb
    CHANGED
    
    | @@ -39,7 +39,7 @@ module Commands | |
| 39 39 | 
             
                # If the index is out of range, return the type of the final argument. If
         | 
| 40 40 | 
             
                # the +Command+ takes no arguments, return +nil+.
         | 
| 41 41 | 
             
                def type_of_arg(index)
         | 
| 42 | 
            -
                  args = @usage.split.drop(1) | 
| 42 | 
            +
                  args = @usage.gsub(/\[-.+?\]/, '').split.drop(1)
         | 
| 43 43 | 
             
                  return nil if args.empty?
         | 
| 44 44 | 
             
                  index = [index, args.size - 1].min
         | 
| 45 45 | 
             
                  args[index].tr('[].', '')
         | 
| @@ -51,7 +51,7 @@ module Commands | |
| 51 51 | 
             
                # command, +false+ otherwise.
         | 
| 52 52 | 
             
                def num_args_ok?(num_args)
         | 
| 53 53 | 
             
                  args = @usage.split.drop(1)
         | 
| 54 | 
            -
                  min_args = args.reject { |arg| arg | 
| 54 | 
            +
                  min_args = args.reject { |arg| arg[/[\[\]]/] }.size
         | 
| 55 55 | 
             
                  max_args = if args.any? { |arg| arg.end_with?('...') }
         | 
| 56 56 | 
             
                               num_args
         | 
| 57 57 | 
             
                             else
         | 
| @@ -66,7 +66,7 @@ module Commands | |
| 66 66 | 
             
                'cat REMOTE_FILE...',
         | 
| 67 67 | 
             
                'Print the concatenated contents of remote files.',
         | 
| 68 68 | 
             
                lambda do |client, state, args|
         | 
| 69 | 
            -
                  extract_flags( | 
| 69 | 
            +
                  extract_flags(CAT.usage, args, {})
         | 
| 70 70 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 71 71 | 
             
                    if path.is_a?(GlobError)
         | 
| 72 72 | 
             
                      warn "cat: #{path}: no such file or directory"
         | 
| @@ -85,7 +85,7 @@ module Commands | |
| 85 85 | 
             
                 that directory. With - as the argument, changes to the previous working \
         | 
| 86 86 | 
             
                 directory.",
         | 
| 87 87 | 
             
                lambda do |_client, state, args|
         | 
| 88 | 
            -
                  extract_flags( | 
| 88 | 
            +
                  extract_flags(CD.usage, args, {})
         | 
| 89 89 | 
             
                  case
         | 
| 90 90 | 
             
                  when args.empty? then state.pwd = '/'
         | 
| 91 91 | 
             
                  when args.first == '-' then state.pwd = state.oldpwd
         | 
| @@ -109,7 +109,7 @@ module Commands | |
| 109 109 | 
             
                 that directory. Will refuse to overwrite existing files unless invoked \
         | 
| 110 110 | 
             
                 with the -f option.",
         | 
| 111 111 | 
             
                lambda do |client, state, args|
         | 
| 112 | 
            -
                  cp_mv(client, state, args, 'cp')
         | 
| 112 | 
            +
                  cp_mv(client, state, args, 'cp', CP.usage)
         | 
| 113 113 | 
             
                end
         | 
| 114 114 | 
             
              )
         | 
| 115 115 |  | 
| @@ -140,7 +140,7 @@ module Commands | |
| 140 140 | 
             
                'exit',
         | 
| 141 141 | 
             
                'Exit the program.',
         | 
| 142 142 | 
             
                lambda do |_client, state, args|
         | 
| 143 | 
            -
                  extract_flags( | 
| 143 | 
            +
                  extract_flags(EXIT.usage, args, {})
         | 
| 144 144 | 
             
                  state.exit_requested = true
         | 
| 145 145 | 
             
                end
         | 
| 146 146 | 
             
              )
         | 
| @@ -152,7 +152,7 @@ module Commands | |
| 152 152 | 
             
                 arguments, clear the entire cache. If given directories as arguments, \
         | 
| 153 153 | 
             
                 (recursively) clear the cache of those directories only.",
         | 
| 154 154 | 
             
                lambda do |_client, state, args|
         | 
| 155 | 
            -
                  extract_flags( | 
| 155 | 
            +
                  extract_flags(FORGET.usage, args, {})
         | 
| 156 156 | 
             
                  if args.empty?
         | 
| 157 157 | 
             
                    state.cache.clear
         | 
| 158 158 | 
             
                  else
         | 
| @@ -170,7 +170,8 @@ module Commands | |
| 170 170 | 
             
                 local working directory. Will refuse to overwrite existing files unless \
         | 
| 171 171 | 
             
                 invoked with the -f option.",
         | 
| 172 172 | 
             
                lambda do |client, state, args|
         | 
| 173 | 
            -
                  flags = extract_flags( | 
| 173 | 
            +
                  flags = extract_flags(GET.usage, args, '-f' => 0)
         | 
| 174 | 
            +
             | 
| 174 175 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 175 176 | 
             
                    if path.is_a?(GlobError)
         | 
| 176 177 | 
             
                      warn "get: #{path}: no such file or directory"
         | 
| @@ -196,7 +197,7 @@ module Commands | |
| 196 197 | 
             
                "Print usage and help information about a command. If no command is \
         | 
| 197 198 | 
             
                 given, print a list of commands instead.",
         | 
| 198 199 | 
             
                lambda do |_client, _state, args|
         | 
| 199 | 
            -
                  extract_flags( | 
| 200 | 
            +
                  extract_flags(HELP.usage, args, {})
         | 
| 200 201 | 
             
                  if args.empty?
         | 
| 201 202 | 
             
                    Text.table(NAMES).each { |line| puts line }
         | 
| 202 203 | 
             
                  else
         | 
| @@ -219,7 +220,7 @@ module Commands | |
| 219 220 | 
             
                 a previous revision using the 'restore' command and a revision ID given \
         | 
| 220 221 | 
             
                 by this command.",
         | 
| 221 222 | 
             
                lambda do |client, state, args|
         | 
| 222 | 
            -
                  extract_flags( | 
| 223 | 
            +
                  extract_flags(HISTORY.usage, args, {})
         | 
| 223 224 | 
             
                  path = state.resolve_path(args.first)
         | 
| 224 225 | 
             
                  if !state.metadata(path) || state.directory?(path)
         | 
| 225 226 | 
             
                    warn "history: #{args.first}: no such file"
         | 
| @@ -246,7 +247,7 @@ module Commands | |
| 246 247 | 
             
                 that directory. With - as the argument, changes to the previous working \
         | 
| 247 248 | 
             
                 directory.",
         | 
| 248 249 | 
             
                lambda do |_client, state, args|
         | 
| 249 | 
            -
                  extract_flags( | 
| 250 | 
            +
                  extract_flags(LCD.usage, args, {})
         | 
| 250 251 | 
             
                  path = case
         | 
| 251 252 | 
             
                         when args.empty? then File.expand_path('~')
         | 
| 252 253 | 
             
                         when args.first == '-' then state.local_oldpwd
         | 
| @@ -276,7 +277,7 @@ module Commands | |
| 276 277 | 
             
                 as arguments, list the files. If the -l option is given, display \
         | 
| 277 278 | 
             
                 information about the files.",
         | 
| 278 279 | 
             
                lambda do |_client, state, args|
         | 
| 279 | 
            -
                  long = extract_flags( | 
| 280 | 
            +
                  long = extract_flags(LS.usage, args, '-l' => 0).include?('-l')
         | 
| 280 281 |  | 
| 281 282 | 
             
                  files, dirs = [], []
         | 
| 282 283 | 
             
                  state.expand_patterns(args, true).each do |path|
         | 
| @@ -311,7 +312,7 @@ module Commands | |
| 311 312 | 
             
                "Create Dropbox links to publicly share remote files. The links are \
         | 
| 312 313 | 
             
                 time-limited and link directly to the files themselves.",
         | 
| 313 314 | 
             
                lambda do |client, state, args|
         | 
| 314 | 
            -
                  extract_flags( | 
| 315 | 
            +
                  extract_flags(MEDIA.usage, args, {})
         | 
| 315 316 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 316 317 | 
             
                    if path.is_a?(GlobError)
         | 
| 317 318 | 
             
                      warn "media: #{path}: no such file or directory"
         | 
| @@ -330,7 +331,7 @@ module Commands | |
| 330 331 | 
             
                'mkdir REMOTE_DIR...',
         | 
| 331 332 | 
             
                'Create remote directories.',
         | 
| 332 333 | 
             
                lambda do |client, state, args|
         | 
| 333 | 
            -
                  extract_flags( | 
| 334 | 
            +
                  extract_flags(MKDIR.usage, args, {})
         | 
| 334 335 | 
             
                  args.each do |arg|
         | 
| 335 336 | 
             
                    try_and_handle(DropboxError) do
         | 
| 336 337 | 
             
                      path = state.resolve_path(arg)
         | 
| @@ -350,19 +351,33 @@ module Commands | |
| 350 351 | 
             
                 that directory. Will refuse to overwrite existing files unless invoked \
         | 
| 351 352 | 
             
                 with the -f option.",
         | 
| 352 353 | 
             
                lambda do |client, state, args|
         | 
| 353 | 
            -
                  cp_mv(client, state, args, 'mv')
         | 
| 354 | 
            +
                  cp_mv(client, state, args, 'mv', MV.usage)
         | 
| 354 355 | 
             
                end
         | 
| 355 356 | 
             
              )
         | 
| 356 357 |  | 
| 357 358 | 
             
              # Upload a local file.
         | 
| 358 359 | 
             
              PUT = Command.new(
         | 
| 359 | 
            -
                'put [-f] LOCAL_FILE...',
         | 
| 360 | 
            +
                'put [-f] [-O REMOTE_DIR] LOCAL_FILE...',
         | 
| 360 361 | 
             
                "Upload local files to the remote working directory. If a remote file of \
         | 
| 361 362 | 
             
                 the same name already exists, Dropbox will rename the upload unless the \
         | 
| 362 363 | 
             
                 the -f option is given, in which case the remote file will be \
         | 
| 363 | 
            -
                 overwritten. | 
| 364 | 
            +
                 overwritten. If the -O option is given, the files will be uploaded to \
         | 
| 365 | 
            +
                 the given directory instead of the current directory.",
         | 
| 364 366 | 
             
                lambda do |client, state, args|
         | 
| 365 | 
            -
                  flags = extract_flags( | 
| 367 | 
            +
                  flags = extract_flags(PUT.usage, args, '-f' => 0, '-O' => 1)
         | 
| 368 | 
            +
             | 
| 369 | 
            +
                  dest_index = flags.find_index('-O')
         | 
| 370 | 
            +
                  dest_path = nil
         | 
| 371 | 
            +
                  unless dest_index.nil?
         | 
| 372 | 
            +
                    dest_path = flags[dest_index + 1]
         | 
| 373 | 
            +
                    if state.directory?(dest_path)
         | 
| 374 | 
            +
                      state.pwd = state.resolve_path(dest_path)
         | 
| 375 | 
            +
                    else
         | 
| 376 | 
            +
                      warn "put: #{dest_path}: no such directory"
         | 
| 377 | 
            +
                      return
         | 
| 378 | 
            +
                    end
         | 
| 379 | 
            +
                  end
         | 
| 380 | 
            +
             | 
| 366 381 | 
             
                  args.each do |arg|
         | 
| 367 382 | 
             
                    to_path = state.resolve_path(File.basename(arg))
         | 
| 368 383 |  | 
| @@ -378,6 +393,8 @@ module Commands | |
| 378 393 | 
             
                      end
         | 
| 379 394 | 
             
                    end
         | 
| 380 395 | 
             
                  end
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                  state.pwd = state.oldpwd unless dest_path.nil?
         | 
| 381 398 | 
             
                end
         | 
| 382 399 | 
             
              )
         | 
| 383 400 |  | 
| @@ -387,7 +404,7 @@ module Commands | |
| 387 404 | 
             
                "Restore a remote file to a previous version. Use the 'history' command \
         | 
| 388 405 | 
             
                 to get a list of IDs for previous revisions of the file.",
         | 
| 389 406 | 
             
                lambda do |client, state, args|
         | 
| 390 | 
            -
                  extract_flags( | 
| 407 | 
            +
                  extract_flags(RESTORE.usage, args, {})
         | 
| 391 408 | 
             
                  path = state.resolve_path(args.first)
         | 
| 392 409 | 
             
                  if !state.metadata(path) || state.directory?(path)
         | 
| 393 410 | 
             
                    warn "restore: #{args.first}: no such file"
         | 
| @@ -405,7 +422,7 @@ module Commands | |
| 405 422 | 
             
                "Remove each specified remote file. If the -r option is given, will \
         | 
| 406 423 | 
             
                 also remove directories recursively.",
         | 
| 407 424 | 
             
                lambda do |client, state, args|
         | 
| 408 | 
            -
                  flags = extract_flags( | 
| 425 | 
            +
                  flags = extract_flags(RM.usage, args, '-r' => 0)
         | 
| 409 426 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 410 427 | 
             
                    if path.is_a?(GlobError)
         | 
| 411 428 | 
             
                      warn "rm: #{path}: no such file or directory"
         | 
| @@ -429,7 +446,7 @@ module Commands | |
| 429 446 | 
             
                'rmdir REMOTE_DIR...',
         | 
| 430 447 | 
             
                'Remove each specified empty remote directory.',
         | 
| 431 448 | 
             
                lambda do |client, state, args|
         | 
| 432 | 
            -
                  extract_flags( | 
| 449 | 
            +
                  extract_flags(RMDIR.usage, args, {})
         | 
| 433 450 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 434 451 | 
             
                    if path.is_a?(GlobError)
         | 
| 435 452 | 
             
                      warn "rmdir: #{path}: no such file or directory"
         | 
| @@ -459,7 +476,7 @@ module Commands | |
| 459 476 | 
             
                "List remote files in a directory or its subdirectories with names that \
         | 
| 460 477 | 
             
                 contain all given substrings.",
         | 
| 461 478 | 
             
                lambda do |client, state, args|
         | 
| 462 | 
            -
                  extract_flags( | 
| 479 | 
            +
                  extract_flags(SEARCH.usage, args, {})
         | 
| 463 480 | 
             
                  path = state.resolve_path(args.first)
         | 
| 464 481 | 
             
                  unless state.directory?(path)
         | 
| 465 482 | 
             
                    warn "search: #{args.first}: no such directory"
         | 
| @@ -480,7 +497,7 @@ module Commands | |
| 480 497 | 
             
                 this method are set to expire far enough in the future so that \
         | 
| 481 498 | 
             
                 expiration is effectively not an issue.",
         | 
| 482 499 | 
             
                lambda do |client, state, args|
         | 
| 483 | 
            -
                  extract_flags( | 
| 500 | 
            +
                  extract_flags(SHARE.usage, args, {})
         | 
| 484 501 | 
             
                  state.expand_patterns(args).each do |path|
         | 
| 485 502 | 
             
                    if path.is_a?(GlobError)
         | 
| 486 503 | 
             
                      warn "share: #{path}: no such file or directory"
         | 
| @@ -602,8 +619,8 @@ module Commands | |
| 602 619 | 
             
              end
         | 
| 603 620 |  | 
| 604 621 | 
             
              # Execute a 'mv' or 'cp' operation depending on arguments given.
         | 
| 605 | 
            -
              def self.cp_mv(client, state, args, cmd)
         | 
| 606 | 
            -
                flags = extract_flags( | 
| 622 | 
            +
              def self.cp_mv(client, state, args, cmd, usage)
         | 
| 623 | 
            +
                flags = extract_flags(usage, args, '-f' => 0)
         | 
| 607 624 | 
             
                sources = expand(state, args.take(args.size - 1), true, true, cmd)
         | 
| 608 625 | 
             
                method = (cmd == 'cp') ? :file_copy : :file_move
         | 
| 609 626 | 
             
                dest = state.resolve_path(args.last)
         | 
| @@ -635,17 +652,44 @@ module Commands | |
| 635 652 | 
             
                (state.pwd = File.dirname(state.pwd)) until state.metadata(state.pwd)
         | 
| 636 653 | 
             
              end
         | 
| 637 654 |  | 
| 655 | 
            +
              # def self.extract_flags(@usage, cmd, args, valid_flags)
         | 
| 656 | 
            +
              #   tokens = args.take_while { |s| s[/^-\w+$/] }
         | 
| 657 | 
            +
              #   args.shift(tokens.size)
         | 
| 658 | 
            +
             | 
| 659 | 
            +
              #   # Process compound flags like -rf into -r, -f.
         | 
| 660 | 
            +
              #   flags = tokens.join.chars.uniq.drop(1).map { |c| "-#{c}" }
         | 
| 661 | 
            +
              #   invalid_flags = flags.reject { |f| valid_flags[f[1]] }
         | 
| 662 | 
            +
              #   invalid_flags.each { |f| warn "#{cmd}: #{f}: invalid option" }
         | 
| 663 | 
            +
              #   flags
         | 
| 664 | 
            +
              # end
         | 
| 665 | 
            +
             | 
| 638 666 | 
             
              # Removes flags (e.g. -f) from the +Array+ and returns an +Array+ of the
         | 
| 639 667 | 
             
              # removed flags. Prints warnings if the flags are not in the given +String+
         | 
| 640 668 | 
             
              # of valid flags (e.g. '-rf').
         | 
| 641 | 
            -
              def self.extract_flags( | 
| 642 | 
            -
                 | 
| 643 | 
            -
                args. | 
| 644 | 
            -
             | 
| 645 | 
            -
             | 
| 646 | 
            -
             | 
| 647 | 
            -
             | 
| 648 | 
            -
             | 
| 649 | 
            -
                 | 
| 669 | 
            +
              def self.extract_flags(usage, args, flags)
         | 
| 670 | 
            +
                extracted, index = [], 0
         | 
| 671 | 
            +
                while index < args.size
         | 
| 672 | 
            +
                  arg = args[index]
         | 
| 673 | 
            +
                  extracted_flags =
         | 
| 674 | 
            +
                    arg[/^-\w/] ? extract_flag(usage, args, flags, arg, index) : nil
         | 
| 675 | 
            +
                  extracted += extracted_flags unless extracted_flags.nil?
         | 
| 676 | 
            +
                  index += 1 if extracted_flags.nil? || extracted_flags.empty?
         | 
| 677 | 
            +
                end
         | 
| 678 | 
            +
                args.delete_if { |a| a[/^-\w/] }
         | 
| 679 | 
            +
                extracted
         | 
| 680 | 
            +
              end
         | 
| 681 | 
            +
             | 
| 682 | 
            +
              # Removes a flag and its arugments from the +Array+ and returns an +Array+ of
         | 
| 683 | 
            +
              # the flag and its arguments. Prints warnings if the given flag is invalid.
         | 
| 684 | 
            +
              def self.extract_flag(usage, args, flags, arg, index)
         | 
| 685 | 
            +
                num_args = flags[arg]
         | 
| 686 | 
            +
                if num_args.nil?
         | 
| 687 | 
            +
                  fail UsageError, usage
         | 
| 688 | 
            +
                else
         | 
| 689 | 
            +
                  if index + num_args < args.size
         | 
| 690 | 
            +
                    return (num_args + 1).times.map { args.delete_at(index) }
         | 
| 691 | 
            +
                  end
         | 
| 692 | 
            +
                  fail UsageError, usage
         | 
| 693 | 
            +
                end
         | 
| 650 694 | 
             
              end
         | 
| 651 695 | 
             
            end
         | 
    
        data/lib/droxi.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: droxi
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Brandon Mulcahy
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014- | 
| 11 | 
            +
            date: 2014-09-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: dropbox-sdk
         |