duras 1.0.0__tar.gz
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.
- duras-1.0.0/LICENSE +16 -0
- duras-1.0.0/PKG-INFO +229 -0
- duras-1.0.0/README.md +218 -0
- duras-1.0.0/duras/__init__.py +1 -0
- duras-1.0.0/duras/cli.py +310 -0
- duras-1.0.0/duras/core.py +813 -0
- duras-1.0.0/duras.egg-info/PKG-INFO +229 -0
- duras-1.0.0/duras.egg-info/SOURCES.txt +11 -0
- duras-1.0.0/duras.egg-info/dependency_links.txt +1 -0
- duras-1.0.0/duras.egg-info/entry_points.txt +2 -0
- duras-1.0.0/duras.egg-info/top_level.txt +1 -0
- duras-1.0.0/pyproject.toml +31 -0
- duras-1.0.0/setup.cfg +4 -0
duras-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ISC License:
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 by Sergiy Duras https://codeberg.org/duras/duras
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for
|
|
6
|
+
any purpose with or without fee is hereby granted, provided that the
|
|
7
|
+
above copyright notice and this permission notice appear in all
|
|
8
|
+
copies.
|
|
9
|
+
|
|
10
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
11
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
12
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY
|
|
13
|
+
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
14
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
15
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
|
16
|
+
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
duras-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: duras
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: plain-text daily notes with optional encryption
|
|
5
|
+
Author: Sergiy Duras
|
|
6
|
+
License-Expression: ISC
|
|
7
|
+
Requires-Python: >=3.13
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Dynamic: license-file
|
|
11
|
+
|
|
12
|
+
# duras
|
|
13
|
+
|
|
14
|
+
[](https://opensource.org/licenses/ISC)
|
|
15
|
+
|
|
16
|
+
**Daily notes as plain text files, with search and optional encryption**.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Model
|
|
21
|
+
|
|
22
|
+
One note per day:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
YYYY/MM/YYYY-MM-DD.dn
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Properties:
|
|
31
|
+
|
|
32
|
+
- plain UTF-8 text
|
|
33
|
+
- filesystem is the index
|
|
34
|
+
- no database, no hidden state
|
|
35
|
+
- atomic writes
|
|
36
|
+
|
|
37
|
+
Encrypted note:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
YYYY/MM/YYYY-MM-DD.dn.gpg
|
|
42
|
+
|
|
43
|
+
````
|
|
44
|
+
|
|
45
|
+
via the [GNU Privacy Guard](https://gnupg.org/).
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Scope
|
|
50
|
+
|
|
51
|
+
Fits:
|
|
52
|
+
|
|
53
|
+
- terminal-based workflows
|
|
54
|
+
- grep-based retrieval
|
|
55
|
+
- long-lived plain text notes
|
|
56
|
+
- optional encryption
|
|
57
|
+
|
|
58
|
+
Not a fit:
|
|
59
|
+
|
|
60
|
+
- sync system
|
|
61
|
+
- GUI / rich text editor
|
|
62
|
+
- query engine or database
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Variants
|
|
67
|
+
|
|
68
|
+
### duras
|
|
69
|
+
|
|
70
|
+
- system `gpg`
|
|
71
|
+
- no dependencies
|
|
72
|
+
- Unix-like systems
|
|
73
|
+
|
|
74
|
+
### duras_ashell
|
|
75
|
+
|
|
76
|
+
- iOS [a-Shell mini](https://holzschu.github.io/a-Shell_iOS/)
|
|
77
|
+
- [PGPy](https://github.com/SecurityInnovation/PGPy) (pure Python)
|
|
78
|
+
- no external binaries
|
|
79
|
+
- `.asc` key handling (no keyring)
|
|
80
|
+
- compatible encrypted format
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Usage
|
|
85
|
+
|
|
86
|
+
```sh
|
|
87
|
+
duras
|
|
88
|
+
duras append "note"
|
|
89
|
+
duras search term
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Commands
|
|
95
|
+
|
|
96
|
+
### open
|
|
97
|
+
|
|
98
|
+
```sh
|
|
99
|
+
duras open
|
|
100
|
+
duras open -1
|
|
101
|
+
duras open 2026-04-19
|
|
102
|
+
duras open -- +7
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### append
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
duras append "text"
|
|
109
|
+
duras append -d -1 "yesterday"
|
|
110
|
+
cat file | duras append -
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`-` = stdin
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Encryption
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
duras -c open
|
|
121
|
+
duras -c append "secret"
|
|
122
|
+
duras -c show
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Notes:
|
|
126
|
+
|
|
127
|
+
* uses system `gpg`
|
|
128
|
+
* append is memory-only
|
|
129
|
+
* editor uses temp file
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Search / tags
|
|
134
|
+
|
|
135
|
+
```sh
|
|
136
|
+
duras search error
|
|
137
|
+
duras search todo -i
|
|
138
|
+
duras tags
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
* literal match (not regex)
|
|
142
|
+
* encrypted notes excluded
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Listing
|
|
147
|
+
|
|
148
|
+
```sh
|
|
149
|
+
duras list
|
|
150
|
+
duras list -n 0
|
|
151
|
+
duras stats
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Order: filename (date), not mtime.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Export
|
|
159
|
+
|
|
160
|
+
```sh
|
|
161
|
+
duras export ~/backup
|
|
162
|
+
duras export ~/backup --encrypt
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Creates archive; optional encryption avoids plaintext export.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Dates
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
YYYY-MM-DD absolute
|
|
173
|
+
0 today
|
|
174
|
+
-1 yesterday
|
|
175
|
+
+7 future
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Future dates are rejected**.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Environment
|
|
183
|
+
|
|
184
|
+
| var | meaning |
|
|
185
|
+
| ------------ | -------------------------------------- |
|
|
186
|
+
| DURAS_DIR | notes dir (default: ~/Documents/Notes) |
|
|
187
|
+
| EDITOR | editor fallback: nano / vi / ed |
|
|
188
|
+
| DURAS_GPG_KEY | encryption recipient |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Behavior
|
|
193
|
+
|
|
194
|
+
* one file per day
|
|
195
|
+
* plain + encrypted may coexist
|
|
196
|
+
* atomic writes
|
|
197
|
+
* no index layer
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Exit codes
|
|
202
|
+
|
|
203
|
+
| code | meaning |
|
|
204
|
+
| ---- | ---------------- |
|
|
205
|
+
| 0 | ok |
|
|
206
|
+
| 1 | error |
|
|
207
|
+
| 2 | not found |
|
|
208
|
+
| 3 | invalid input |
|
|
209
|
+
| 4 | external failure |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Limits
|
|
214
|
+
|
|
215
|
+
* encrypted notes not searchable
|
|
216
|
+
* depends on `gpg`
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Docs
|
|
221
|
+
|
|
222
|
+
* **`man duras`**
|
|
223
|
+
* [https://codeberg.org/duras/duras](https://codeberg.org/duras/duras)
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## License
|
|
228
|
+
|
|
229
|
+
ISC
|
duras-1.0.0/README.md
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# duras
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/ISC)
|
|
4
|
+
|
|
5
|
+
**Daily notes as plain text files, with search and optional encryption**.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Model
|
|
10
|
+
|
|
11
|
+
One note per day:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
YYYY/MM/YYYY-MM-DD.dn
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Properties:
|
|
20
|
+
|
|
21
|
+
- plain UTF-8 text
|
|
22
|
+
- filesystem is the index
|
|
23
|
+
- no database, no hidden state
|
|
24
|
+
- atomic writes
|
|
25
|
+
|
|
26
|
+
Encrypted note:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
YYYY/MM/YYYY-MM-DD.dn.gpg
|
|
31
|
+
|
|
32
|
+
````
|
|
33
|
+
|
|
34
|
+
via the [GNU Privacy Guard](https://gnupg.org/).
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Scope
|
|
39
|
+
|
|
40
|
+
Fits:
|
|
41
|
+
|
|
42
|
+
- terminal-based workflows
|
|
43
|
+
- grep-based retrieval
|
|
44
|
+
- long-lived plain text notes
|
|
45
|
+
- optional encryption
|
|
46
|
+
|
|
47
|
+
Not a fit:
|
|
48
|
+
|
|
49
|
+
- sync system
|
|
50
|
+
- GUI / rich text editor
|
|
51
|
+
- query engine or database
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Variants
|
|
56
|
+
|
|
57
|
+
### duras
|
|
58
|
+
|
|
59
|
+
- system `gpg`
|
|
60
|
+
- no dependencies
|
|
61
|
+
- Unix-like systems
|
|
62
|
+
|
|
63
|
+
### duras_ashell
|
|
64
|
+
|
|
65
|
+
- iOS [a-Shell mini](https://holzschu.github.io/a-Shell_iOS/)
|
|
66
|
+
- [PGPy](https://github.com/SecurityInnovation/PGPy) (pure Python)
|
|
67
|
+
- no external binaries
|
|
68
|
+
- `.asc` key handling (no keyring)
|
|
69
|
+
- compatible encrypted format
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Usage
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
duras
|
|
77
|
+
duras append "note"
|
|
78
|
+
duras search term
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Commands
|
|
84
|
+
|
|
85
|
+
### open
|
|
86
|
+
|
|
87
|
+
```sh
|
|
88
|
+
duras open
|
|
89
|
+
duras open -1
|
|
90
|
+
duras open 2026-04-19
|
|
91
|
+
duras open -- +7
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### append
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
duras append "text"
|
|
98
|
+
duras append -d -1 "yesterday"
|
|
99
|
+
cat file | duras append -
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`-` = stdin
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Encryption
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
duras -c open
|
|
110
|
+
duras -c append "secret"
|
|
111
|
+
duras -c show
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Notes:
|
|
115
|
+
|
|
116
|
+
* uses system `gpg`
|
|
117
|
+
* append is memory-only
|
|
118
|
+
* editor uses temp file
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Search / tags
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
duras search error
|
|
126
|
+
duras search todo -i
|
|
127
|
+
duras tags
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
* literal match (not regex)
|
|
131
|
+
* encrypted notes excluded
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Listing
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
duras list
|
|
139
|
+
duras list -n 0
|
|
140
|
+
duras stats
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Order: filename (date), not mtime.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Export
|
|
148
|
+
|
|
149
|
+
```sh
|
|
150
|
+
duras export ~/backup
|
|
151
|
+
duras export ~/backup --encrypt
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Creates archive; optional encryption avoids plaintext export.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Dates
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
YYYY-MM-DD absolute
|
|
162
|
+
0 today
|
|
163
|
+
-1 yesterday
|
|
164
|
+
+7 future
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Future dates are rejected**.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Environment
|
|
172
|
+
|
|
173
|
+
| var | meaning |
|
|
174
|
+
| ------------ | -------------------------------------- |
|
|
175
|
+
| DURAS_DIR | notes dir (default: ~/Documents/Notes) |
|
|
176
|
+
| EDITOR | editor fallback: nano / vi / ed |
|
|
177
|
+
| DURAS_GPG_KEY | encryption recipient |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Behavior
|
|
182
|
+
|
|
183
|
+
* one file per day
|
|
184
|
+
* plain + encrypted may coexist
|
|
185
|
+
* atomic writes
|
|
186
|
+
* no index layer
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Exit codes
|
|
191
|
+
|
|
192
|
+
| code | meaning |
|
|
193
|
+
| ---- | ---------------- |
|
|
194
|
+
| 0 | ok |
|
|
195
|
+
| 1 | error |
|
|
196
|
+
| 2 | not found |
|
|
197
|
+
| 3 | invalid input |
|
|
198
|
+
| 4 | external failure |
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Limits
|
|
203
|
+
|
|
204
|
+
* encrypted notes not searchable
|
|
205
|
+
* depends on `gpg`
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Docs
|
|
210
|
+
|
|
211
|
+
* **`man duras`**
|
|
212
|
+
* [https://codeberg.org/duras/duras](https://codeberg.org/duras/duras)
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## License
|
|
217
|
+
|
|
218
|
+
ISC
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .core import VERSION
|