dsap-cli 1.1.3__tar.gz → 1.1.4__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.
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/PKG-INFO +1 -1
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/_version.py +2 -2
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/database.py +9 -9
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/sm2.py +1 -2
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/ui.py +5 -5
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/.github/workflows/ci.yml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/.gitignore +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/.pre-commit-config.yaml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/CHANGELOG.md +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/LICENSE +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/README.md +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/USER_GUIDE.md +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/assets/dsap-cli.gif +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/pyproject.toml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/__init__.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/__main__.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/cli.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/config.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/data/blind75.yaml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/data/grind75.yaml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/data/neetcode150.yaml +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/models.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/problem_sets.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/src/dsap/py.typed +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/__init__.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_cli.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_config.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_database.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_models.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_problem_sets.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/tests/test_sm2.py +0 -0
- {dsap_cli-1.1.3 → dsap_cli-1.1.4}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dsap-cli
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.4
|
|
4
4
|
Summary: CLI tool for practicing data structures and algorithms using spaced repetition.
|
|
5
5
|
Project-URL: Repository, https://github.com/juma-paul/dsap-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/juma-paul/dsap-cli/issues
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 1,
|
|
21
|
+
__version__ = version = '1.1.4'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 1, 4)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -12,7 +12,7 @@ import os
|
|
|
12
12
|
import sqlite3
|
|
13
13
|
from collections.abc import Iterator
|
|
14
14
|
from contextlib import contextmanager
|
|
15
|
-
from datetime import datetime, timedelta
|
|
15
|
+
from datetime import date, datetime, timedelta
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
from typing import Any
|
|
18
18
|
|
|
@@ -251,9 +251,9 @@ class Database:
|
|
|
251
251
|
params.append(problem_set)
|
|
252
252
|
|
|
253
253
|
if due_only:
|
|
254
|
-
|
|
255
|
-
conditions.append("(pr.next_review <= ? OR pr.next_review IS NULL)")
|
|
256
|
-
params.append(
|
|
254
|
+
today = datetime.now().date().isoformat()
|
|
255
|
+
conditions.append("(DATE(pr.next_review) <= ? OR pr.next_review IS NULL)")
|
|
256
|
+
params.append(today)
|
|
257
257
|
|
|
258
258
|
where_clause = "WHERE " + " AND ".join(conditions) if conditions else ""
|
|
259
259
|
params.append(limit)
|
|
@@ -577,21 +577,21 @@ class Database:
|
|
|
577
577
|
""").fetchone()
|
|
578
578
|
|
|
579
579
|
# Due counts
|
|
580
|
-
|
|
581
|
-
week_later = (
|
|
580
|
+
today = date.today().isoformat()
|
|
581
|
+
week_later = (date.today() + timedelta(days=7)).isoformat()
|
|
582
582
|
|
|
583
583
|
due_today = conn.execute(
|
|
584
584
|
"""
|
|
585
585
|
SELECT COUNT(*) FROM progress
|
|
586
|
-
WHERE next_review <= ? OR next_review IS NULL
|
|
586
|
+
WHERE DATE(next_review) <= ? OR next_review IS NULL
|
|
587
587
|
""",
|
|
588
|
-
(
|
|
588
|
+
(today,),
|
|
589
589
|
).fetchone()[0]
|
|
590
590
|
|
|
591
591
|
due_week = conn.execute(
|
|
592
592
|
"""
|
|
593
593
|
SELECT COUNT(*) FROM progress
|
|
594
|
-
WHERE next_review <= ?
|
|
594
|
+
WHERE DATE(next_review) <= ? OR next_review IS NULL
|
|
595
595
|
""",
|
|
596
596
|
(week_later,),
|
|
597
597
|
).fetchone()[0]
|
|
@@ -252,8 +252,7 @@ class SM2State:
|
|
|
252
252
|
now = datetime.now()
|
|
253
253
|
if self.next_review is None:
|
|
254
254
|
return 0
|
|
255
|
-
|
|
256
|
-
return delta.days
|
|
255
|
+
return (self.next_review.date() - now.date()).days
|
|
257
256
|
|
|
258
257
|
|
|
259
258
|
def calculate_easiness_factor(current_ef: float, quality: int) -> float:
|
|
@@ -8,7 +8,7 @@ Provides beautiful terminal output using Rich library:
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import webbrowser
|
|
11
|
-
from datetime import
|
|
11
|
+
from datetime import date
|
|
12
12
|
|
|
13
13
|
from rich import box
|
|
14
14
|
from rich.console import Console
|
|
@@ -137,8 +137,7 @@ def display_problem(
|
|
|
137
137
|
f" EF: {progress.easiness_factor:.2f} | Interval: {progress.interval} days"
|
|
138
138
|
)
|
|
139
139
|
if progress.next_review:
|
|
140
|
-
|
|
141
|
-
delta = (progress.next_review - now).days
|
|
140
|
+
delta = (progress.next_review.date() - date.today()).days
|
|
142
141
|
if delta < 0:
|
|
143
142
|
due_str = f"Overdue by {abs(delta)} day{'s' if abs(delta) != 1 else ''}"
|
|
144
143
|
elif delta == 0:
|
|
@@ -372,12 +371,13 @@ def display_problem_list(
|
|
|
372
371
|
ef = "-"
|
|
373
372
|
|
|
374
373
|
if progress and progress.next_review:
|
|
375
|
-
|
|
376
|
-
delta = (progress.next_review - now).days
|
|
374
|
+
delta = (progress.next_review.date() - date.today()).days
|
|
377
375
|
if delta < 0:
|
|
378
376
|
due_text = f"[red]{abs(delta)}d late[/red]"
|
|
379
377
|
elif delta == 0:
|
|
380
378
|
due_text = "[yellow]today[/yellow]"
|
|
379
|
+
elif delta == 1:
|
|
380
|
+
due_text = "[dim]tomorrow[/dim]"
|
|
381
381
|
else:
|
|
382
382
|
due_text = f"[dim]in {delta}d[/dim]"
|
|
383
383
|
else:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|