Completed
Push — file-actions ( b2ad98...ca0603 )
by Felipe A.
29s
created

paste_clipboard()   B

Complexity

Conditions 5

Size

Total Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
c 1
b 0
f 0
dl 0
loc 27
rs 8.0894
1
#!/usr/bin/env python
2
# -*- coding: UTF-8 -*-
3
4
import os
5
import os.path
6
import shutil
7
import functools
8
9
from browsepy.file import Node
10
from browsepy.compat import map
11
12
from .exceptions import InvalidClipboardModeError
13
14
15
def copy(target, node, join_fnc=os.path.join):
16
    if node.is_excluded:
17
        raise OSError(2, os.strerror(2))
18
    dest = join_fnc(
19
        target.path,
20
        target.choose_filename(node.name)
21
        )
22
    if node.is_directory:
23
        shutil.copytree(node.path, dest)
24
    else:
25
        shutil.copy2(node.path, dest)
26
    return dest
27
28
29
def move(target, node, join_fnc=os.path.join):
30
    if node.is_excluded or not node.can_remove:
31
        code = 2 if node.is_excluded else 1
32
        raise OSError(code, os.strerror(code))
33
    if node.parent.path != target.path:
34
        dest = join_fnc(
35
            target.path,
36
            target.choose_filename(node.name)
37
            )
38
        shutil.move(node.path, dest)
39
        return dest
40
    return node.path
41
42
43
def paste_clipboard(target, clipboard):
44
    '''
45
    Get pasting function for given directory and keyboard.
46
    '''
47
    mode = clipboard.mode
48
    if mode == 'cut':
49
        paste_fnc = functools.partial(move, target)
50
    elif mode == 'copy':
51
        paste_fnc = functools.partial(copy, target)
52
    else:
53
        raise InvalidClipboardModeError(
54
            path=target.path,
55
            clipboard=clipboard,
56
            mode=mode
57
            )
58
    success = []
59
    issues = []
60
    try:
61
        clipboard.mode = 'paste'  # deactivates excluded_clipboard fnc
62
        for node in map(Node.from_urlpath, clipboard):
63
            try:
64
                success.append(paste_fnc(node))
65
            except BaseException as e:
66
                issues.append((node, e))
67
    finally:
68
        clipboard.mode = mode
69
    return success, issues
70