Skip to content

Commit

Permalink
Fix multiple schedulers edge case (#90)
Browse files Browse the repository at this point in the history
* fix edge case handling for card with multiple schedulers

* fix multiple schedulers unit test

* bump patch 5.1.0 -> 5.1.1
  • Loading branch information
joshdavham authored Feb 6, 2025
1 parent ed19dc1 commit e8b498d
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 22 deletions.
8 changes: 4 additions & 4 deletions fsrs/fsrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -447,9 +447,9 @@ def review_card(

# calculate the card's next interval
# len(self.learning_steps) == 0: no learning steps defined so move card to Review state
# card.step > len(self.learning_steps): handles the edge-case when a card was originally scheduled with a scheduler with more
# card.step >= len(self.learning_steps): handles the edge-case when a card was originally scheduled with a scheduler with more
# learning steps than the current scheduler
if len(self.learning_steps) == 0 or card.step > len(self.learning_steps):
if len(self.learning_steps) == 0 or card.step >= len(self.learning_steps):
card.state = State.Review
card.step = None

Expand Down Expand Up @@ -559,9 +559,9 @@ def review_card(

# calculate the card's next interval
# len(self.relearning_steps) == 0: no relearning steps defined so move card to Review state
# card.step > len(self.relearning_steps): handles the edge-case when a card was originally scheduled with a scheduler with more
# card.step >= len(self.relearning_steps): handles the edge-case when a card was originally scheduled with a scheduler with more
# relearning steps than the current scheduler
if len(self.relearning_steps) == 0 or card.step > len(
if len(self.relearning_steps) == 0 or card.step >= len(
self.relearning_steps
):
card.state = State.Review
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "fsrs"
version = "5.1.0"
version = "5.1.1"
description = "Free Spaced Repetition Scheduler"
readme = "README.md"
authors = [
Expand Down
38 changes: 21 additions & 17 deletions tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,20 @@ def test_one_card_multiple_schedulers(self):
scheduler_with_two_learning_steps = Scheduler(
learning_steps=(timedelta(minutes=1), timedelta(minutes=10))
)
scheduler_with_no_learning_steps = Scheduler(learning_steps=())
scheduler_with_one_learning_step = Scheduler(
learning_steps=(timedelta(minutes=1),)
)

scheduler_with_two_relearning_steps = Scheduler(
relearning_steps=(
timedelta(minutes=1),
timedelta(minutes=10),
)
)
scheduler_with_one_relearning_step = Scheduler(
relearning_steps=(timedelta(minutes=1),)
)
scheduler_with_no_relearning_steps = Scheduler(relearning_steps=())

card = Card()

Expand All @@ -614,23 +627,14 @@ def test_one_card_multiple_schedulers(self):
assert card.state == State.Learning
assert card.step == 1

assert len(scheduler_with_no_learning_steps.learning_steps) == 0
card, _ = scheduler_with_no_learning_steps.review_card(
assert len(scheduler_with_one_learning_step.learning_steps) == 1
card, _ = scheduler_with_one_learning_step.review_card(
card=card, rating=Rating.Again, review_datetime=datetime.now(timezone.utc)
)
assert card.state == State.Review
assert card.step is None

scheduler_with_two_relearning_steps = Scheduler(
relearning_steps=(
timedelta(minutes=1),
timedelta(minutes=10),
timedelta(minutes=15),
)
)
scheduler_with_no_relearning_steps = Scheduler(relearning_steps=())

assert len(scheduler_with_two_relearning_steps.relearning_steps) == 3
assert len(scheduler_with_two_relearning_steps.relearning_steps) == 2
card, _ = scheduler_with_two_relearning_steps.review_card(
card=card, rating=Rating.Again, review_datetime=datetime.now(timezone.utc)
)
Expand All @@ -643,11 +647,11 @@ def test_one_card_multiple_schedulers(self):
assert card.state == State.Relearning
assert card.step == 1

card, _ = scheduler_with_two_relearning_steps.review_card(
card=card, rating=Rating.Good, review_datetime=datetime.now(timezone.utc)
card, _ = scheduler_with_one_relearning_step.review_card(
card=card, rating=Rating.Again, review_datetime=datetime.now(timezone.utc)
)
assert card.state == State.Relearning
assert card.step == 2
assert card.state == State.Review
assert card.step is None

card, _ = scheduler_with_no_relearning_steps.review_card(
card=card, rating=Rating.Again, review_datetime=datetime.now(timezone.utc)
Expand Down

0 comments on commit e8b498d

Please sign in to comment.