omlish 0.0.0.dev234__py3-none-any.whl → 0.0.0.dev235__py3-none-any.whl
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.
- omlish/__about__.py +2 -2
- omlish/os/filemodes.py +127 -0
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/RECORD +8 -7
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev234.dist-info → omlish-0.0.0.dev235.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/os/filemodes.py
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
3
|
+
import dataclasses as dc
|
4
|
+
import os
|
5
|
+
import typing as ta
|
6
|
+
|
7
|
+
from ..lite.check import check
|
8
|
+
|
9
|
+
|
10
|
+
@dc.dataclass(frozen=True)
|
11
|
+
class FileMode:
|
12
|
+
"""
|
13
|
+
https://docs.python.org/3/library/functions.html#open
|
14
|
+
|
15
|
+
'r' open for reading (default)
|
16
|
+
'w' open for writing, truncating the file first
|
17
|
+
'x' open for exclusive creation, failing if the file already exists
|
18
|
+
'a' open for writing, appending to the end of file if it exists
|
19
|
+
'b' binary mode
|
20
|
+
't' text mode (default)
|
21
|
+
'+' open for updating (reading and writing)
|
22
|
+
|
23
|
+
==
|
24
|
+
|
25
|
+
https://en.cppreference.com/w/cpp/io/c/fopen
|
26
|
+
|
27
|
+
"r" read Open a file for reading read from start return NULL and set error
|
28
|
+
"w" write Create a file for writing destroy contents create new
|
29
|
+
"a" append Append to a file write to end create new
|
30
|
+
"r+" read extended Open a file for read/write read from start return NULL and set error
|
31
|
+
"w+" write extended Create a file for read/write destroy contents create new
|
32
|
+
"a+" append extended Open a file for read/write write to end create new
|
33
|
+
|
34
|
+
==
|
35
|
+
|
36
|
+
a (prs): w a
|
37
|
+
a (new): w
|
38
|
+
a+ (prs): r w a
|
39
|
+
a+ (new): r w
|
40
|
+
|
41
|
+
x (new): w
|
42
|
+
x+ (new): r w
|
43
|
+
|
44
|
+
w (prs): w
|
45
|
+
w (new): w
|
46
|
+
w+ (prs): r w
|
47
|
+
w+ (new): r w
|
48
|
+
|
49
|
+
r (prs): r
|
50
|
+
r+ (prs): r w
|
51
|
+
"""
|
52
|
+
|
53
|
+
read: bool
|
54
|
+
write: bool
|
55
|
+
|
56
|
+
create: bool
|
57
|
+
exists: ta.Literal['beginning', 'truncate', 'fail', 'append']
|
58
|
+
|
59
|
+
binary: bool
|
60
|
+
|
61
|
+
#
|
62
|
+
|
63
|
+
def flags(self) -> int:
|
64
|
+
return (
|
65
|
+
(
|
66
|
+
os.O_RDWR if self.read and self.write else
|
67
|
+
os.O_WRONLY if self.write else
|
68
|
+
os.O_RDONLY if self.read else
|
69
|
+
0
|
70
|
+
) |
|
71
|
+
(os.O_CREAT if self.create else 0) |
|
72
|
+
(
|
73
|
+
os.O_APPEND if self.exists == 'append' else
|
74
|
+
os.O_EXCL if self.exists == 'fail' else
|
75
|
+
os.O_TRUNC if self.exists == 'truncate' else
|
76
|
+
0
|
77
|
+
)
|
78
|
+
)
|
79
|
+
|
80
|
+
#
|
81
|
+
|
82
|
+
def render(self) -> str:
|
83
|
+
return ''.join([
|
84
|
+
(
|
85
|
+
'a' if self.exists == 'append' else
|
86
|
+
'x' if self.exists == 'fail' else
|
87
|
+
'w' if self.exists == 'truncate' else
|
88
|
+
'r'
|
89
|
+
),
|
90
|
+
'+' if self.read and self.write else '',
|
91
|
+
'b' if self.binary else '',
|
92
|
+
])
|
93
|
+
|
94
|
+
@classmethod
|
95
|
+
def parse(cls, s: str) -> 'FileMode':
|
96
|
+
rwxa: ta.Literal['r', 'w', 'x', 'a', None] = None
|
97
|
+
tb: ta.Literal['t', 'b', None] = None
|
98
|
+
p: bool | None = None
|
99
|
+
|
100
|
+
for c in s:
|
101
|
+
if c in 'rwxa':
|
102
|
+
rwxa = check.replacing_none(rwxa, c) # type: ignore[arg-type]
|
103
|
+
elif c in 'tb':
|
104
|
+
tb = check.replacing_none(tb, c) # type: ignore[arg-type]
|
105
|
+
elif c == '+':
|
106
|
+
p = check.replacing_none(p, True)
|
107
|
+
else:
|
108
|
+
raise ValueError(c)
|
109
|
+
|
110
|
+
if rwxa is None:
|
111
|
+
rwxa = 'r'
|
112
|
+
if tb is None:
|
113
|
+
tb = 't'
|
114
|
+
p = bool(p)
|
115
|
+
|
116
|
+
return FileMode(
|
117
|
+
read=rwxa == 'r' or p,
|
118
|
+
write=rwxa != 'r' or p,
|
119
|
+
create=rwxa != 'r',
|
120
|
+
exists=( # noqa
|
121
|
+
'append' if rwxa == 'a' else
|
122
|
+
'fail' if rwxa == 'x' else
|
123
|
+
'truncate' if rwxa == 'w' else
|
124
|
+
'beginning'
|
125
|
+
),
|
126
|
+
binary=tb == 'b',
|
127
|
+
)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=vQTAIvR8OblSq-uP2GUfnbei0RnmAnM5j0T1-OToh9E,8253
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=mOMhMeHgYWv96pndE14EVx-D5bReVhtSMXcqy2QLvnE,3380
|
3
3
|
omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
|
4
4
|
omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
|
5
5
|
omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
|
@@ -514,6 +514,7 @@ omlish/os/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
514
514
|
omlish/os/atomics.py,sha256=KhWNeh4mzU3M-TF0v8uR6hUqMfZJW42MeyIK9Jl6R0k,5246
|
515
515
|
omlish/os/deathsig.py,sha256=hk9Yq2kyDdI-cI7OQH7mOfpRbOKzY_TfPKEqgrjVYbA,641
|
516
516
|
omlish/os/fcntl.py,sha256=riQf9iEEEIC28lJp8ud06MU56w2XJHJ9nBFtck_hdhc,1501
|
517
|
+
omlish/os/filemodes.py,sha256=njxd9cQChKSi_5-oiAG9OJOzj8CvnyedWWheOWM0uHA,3476
|
517
518
|
omlish/os/files.py,sha256=WJ_42vsZIZukQURN3TTccp-n74ZNhbux_ps3TLbHj18,1106
|
518
519
|
omlish/os/forkhooks.py,sha256=yjodOvs90ClXskv5oBIJbHn0Y7dzajLmZmOpRMKbyxM,5656
|
519
520
|
omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
|
@@ -705,9 +706,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
|
|
705
706
|
omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
|
706
707
|
omlish/text/parts.py,sha256=JkNZpyR2tv2CNcTaWJJhpQ9E4F0yPR8P_YfDbZfMtwQ,6182
|
707
708
|
omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
|
708
|
-
omlish-0.0.0.
|
709
|
-
omlish-0.0.0.
|
710
|
-
omlish-0.0.0.
|
711
|
-
omlish-0.0.0.
|
712
|
-
omlish-0.0.0.
|
713
|
-
omlish-0.0.0.
|
709
|
+
omlish-0.0.0.dev235.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
710
|
+
omlish-0.0.0.dev235.dist-info/METADATA,sha256=kGZm_s1Kmw1dsPChxxw0LPa1lbSL07NPMdgVyf8AnUs,4176
|
711
|
+
omlish-0.0.0.dev235.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
712
|
+
omlish-0.0.0.dev235.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
713
|
+
omlish-0.0.0.dev235.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
714
|
+
omlish-0.0.0.dev235.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|