Completed
Push — 0.5.3 ( 26aff3...12d39c )
by Felipe A.
01:00
created

GlobTransform.transform_range_close()   A

Complexity

Conditions 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 6
rs 9.4285
cc 2
1
2
import os
3
import warnings
4
5
import regex
6
7
from . import StateMachine
8
9
10
class GlobTransform(StateMachine):
11
    jumps = {
12
        'start': {
13
            '': 'text',  # edit on __init__
14
            },
15
        'text': {
16
            '*': 'wildcard',
17
            '**': 'wildcard',
18
            '?': 'wildcard',
19
            '[': 'range',
20
            '[!': 'range',
21
            '[]': 'range',
22
            '{': 'group',
23
            '\\': 'literal',
24
            },
25
        'literal': {
26
            c: 'text' for c in '\\*?[{'
27
            },
28
        'wildcard': {
29
            '': 'text',
30
            },
31
        'range': {
32
            ']': 'range_close',
33
            '[.': 'posix_collating_symbol',
34
            '[:': 'posix_character_class',
35
            '[=': 'posix_equivalence_class',
36
            },
37
        'range_ignore': {
38
            '': 'range',
39
            },
40
        'range_close': {
41
            '': 'text',
42
            },
43
        'posix_collating_symbol': {
44
            '.]': 'range_ignore',
45
            },
46
        'posix_character_class': {
47
            ':]': 'range',
48
            },
49
        'posix_equivalence_class': {
50
            '=]': 'range_ignore',
51
            },
52
        'group': {
53
            '}': 'group_close',
54
            },
55
        'group_close': {
56
            '': 'text',
57
            }
58
        }
59
    current = 'start'
60
    deferred = False
61
62
    def __init__(self, data, sep=os.sep):
63
        self.sep = sep
64
        self.deferred_data = []
65
        self.jumps = dict(self.jumps)
66
        self.jumps['start'] = dict(self.jumps['start'])
67
        self.jumps['start'][sep] = 'text'
68
        super(GlobTransform, self).__init__(data)
69
70
    def flush(self):
71
        return '%s$' % super(GlobTransform, self).flush()
72
73
    def transform(self, data, mark, next):
74
        data = super(GlobTransform, self).transform(data, mark, next)
75
        if self.deferred:
76
            self.deferred_data.append(data)
77
            data = ''
78
        elif self.deferred_data:
79
            data = ''.join(self.deferred_data) + data
80
            self.deferred_data[:] = ()
81
        return data
82
83
    def transform_posix_collating_symbol(self, data, mark, next):
84
        warnings.warn(
85
            'Posix collating symbols (like %s%s) are not supported.'
86
            % (data, mark))
87
        return None
88
89
    def transform_posix_equivalence_class(self, data, mark, next):
90
        warnings.warn(
91
            'Posix equivalence class expresions (like %s%s) are not supported.'
92
            % (data, mark))
93
        return None
94
95
    def transform_start(self, data, mark, next):
96
        if mark == self.sep:
97
            return '^'
98
        return self.transform_text(self.sep, mark, next)
99
100
    def transform_wildcard(self, data, mark, next):
101
        if self.start == '**':
102
            return '.*'
103
        if self.start == '*':
104
            return '[^%s]*' % self.sep
105
        return '.'
106
107
    def transform_text(self, data, mark, next):
108
        return regex.escape(data, special_only=True)
109
110
    def transform_literal(self, data, mark, next):
111
        return data[len(self.start):]
112
113
    def transform_range(self, data, mark, next):
114
        self.deferred = True
115
        if self.start == '[!':
116
            return '[^%s' % data[2:]
117
        if self.start == '[]':
118
            return '[\\]%s' % data[2:]
119
        return data
120
121
    def transform_range_close(self, data, mark, next):
122
        self.deferred = False
123
        if None in self.deferred_data:
124
            self.deferred_data[:] = ()
125
            return '.'
126
        return data
127
128
    def transform_range_ignore(self, data, mark, next):
129
        return ''
130
131
    def transform_group(self, data, mark, next):
132
        return '(%s' % ('|'.join(data[len(self.start):].split(',')))
133
134
    def transform_group_close(self, data, mark, next):
135
        return ')'
136
137
138
def translate(data, sep=os.sep):
139
    self = GlobTransform(data)
140
    return ''.join(self)
141