droxi 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|