From 0c67096b46d1bc1954542bb1db23a5f8c66d6f2b Mon Sep 17 00:00:00 2001 From: Mike Kazantsev Date: Sat, 9 Mar 2013 20:33:08 +0600 Subject: [PATCH] cli: allow to specify dirname+basename path to mkdir --- setup.py | 2 +- skydrive/cli_tool.py | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index 0313695..a01c042 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ setup( name='python-skydrive', - version='13.03.16', + version='13.03.17', author='Mike Kazantsev, Antonio Chen', author_email='mk.fraggod@gmail.com', license='WTFPL', diff --git a/skydrive/cli_tool.py b/skydrive/cli_tool.py index 47eeb99..7e2be61 100755 --- a/skydrive/cli_tool.py +++ b/skydrive/cli_tool.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals, print_function import itertools as it, operator as op, functools as ft -from os.path import dirname, exists, isdir, join +from os.path import dirname, basename, exists, isdir, join, abspath from collections import defaultdict import os, sys, io, re, types, json @@ -69,7 +69,7 @@ def size_units(size, def id_match( s, _re_id=re.compile(r'^(file|folder)\.[0-9a-f]{16}\.[0-9A-F]{16}!\d+|folder\.[0-9a-f]{16}$') ): - return s if _re_id.search(s) else None + return s if s and _re_id.search(s) else None def main(): @@ -141,10 +141,11 @@ def add_command(name, **kwz): help='Folder to list contents of (default: %(default)s).') cmd = add_command('mkdir', help='Create a folder.') - cmd.add_argument('name', help='Name of a folder to create.') + cmd.add_argument('name', + help='Name (or a path consisting of dirname + basename) of a folder to create.') cmd.add_argument('folder', - nargs='?', default='me/skydrive', - help='Parent folder (default: %(default)s).') + nargs='?', default=None, + help='Parent folder (default: me/skydrive).') cmd.add_argument('-m', '--metadata', help='JSON mappings of metadata to set for the created folder.' ' Optonal. Example: {"description": "Photos from last trip to Mordor"}') @@ -222,8 +223,9 @@ def add_command(name, **kwz): api = api_v5.PersistentSkyDriveAPI.from_conf(optz.config) res = xres = None - resolve_path = ( (lambda s: id_match(s) or api.resolve_path(s)) \ - if not optz.path else api.resolve_path ) if not optz.id else lambda obj_id: obj_id + resolve_path_wrap = lambda s: api.resolve_path(s and s.replace('\\', '/').strip('/')) + resolve_path = ( (lambda s: id_match(s) or resolve_path_wrap(s)) \ + if not optz.path else resolve_path_wrap ) if not optz.id else lambda obj_id: obj_id # Make best-effort to decode all CLI options to unicode for k, v in vars(optz).viewitems(): @@ -272,14 +274,19 @@ def add_command(name, **kwz): res = api.comment_delete(optz.comment_id) elif optz.call == 'mkdir': - xres = api.mkdir(name=optz.name, folder_id=resolve_path(optz.folder), + name, path = optz.name, optz.folder + if '/' in name.replace('\\', '/'): + name = optz.name.replace('\\', '/') + name, path_ext = basename(name), dirname(name) + path = join(path, path_ext.strip('/')) if path else path_ext + xres = api.mkdir(name=name, folder_id=resolve_path(path), metadata=optz.metadata and json.loads(optz.metadata) or dict()) elif optz.call == 'get': contents = api.get(resolve_path(optz.file), byte_range=optz.byte_range) if optz.file_dst: - dst_dir = os.path.dirname(os.path.abspath(optz.file_dst)) - if not os.path.isdir(dst_dir): + dst_dir = dirname(abspath(optz.file_dst)) + if not isdir(dst_dir): os.makedirs(dst_dir) with open(optz.file_dst, "wb") as dst: dst.write(contents)