Skip to content

Latest commit

 

History

History
937 lines (500 loc) · 38.5 KB

CHANGELOG.md

File metadata and controls

937 lines (500 loc) · 38.5 KB

CHANGELOG

v3.11.0 (2024-01-16)

Chore

  • chore(deps-dev): bump gitpython from 3.1.37 to 3.1.41

Bumps gitpython from 3.1.37 to 3.1.41.


updated-dependencies:

  • dependency-name: gitpython dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (408b0fe)

  • chore(deps): bump jinja2 from 3.1.2 to 3.1.3

Bumps jinja2 from 3.1.2 to 3.1.3.


updated-dependencies:

  • dependency-name: jinja2 dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (e91b2f6)

Feature

  • feat(app): add prereq table to course page

Add a table listing prerequisite courses to the course page.

Closes #86 (7488e79)

  • feat(scraper): parse prerequisites into db objects

Add function to parse Course prerequisite string into database objects.

Closes #84 (3e6d2a8)

  • feat(model): add Prerequisite model
  • Update parsing tests to be regex based. (bae9f63)

v3.10.0 (2023-12-11)

Chore

  • chore(deps): bump werkzeug from 2.3.7 to 2.3.8

Bumps werkzeug from 2.3.7 to 2.3.8.


updated-dependencies:

  • dependency-name: werkzeug dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (b6f9ff4)

Feature

  • feat(app): filter courses by favourite programs

Resolves #64, resolves #71 (777011b)

  • feat(backend): support relation properties as links in ModelFilter (c8394ca)

  • feat(app): mark program as favourite

Add the ability for user to mark a program as favourite. Display favourite programs on account page.

Refactor session fixture to db_session, to avoid name conflict with Flask session. (cb69bc8)

  • feat(app): redirect to the requested page after login (5b38f62)

  • feat(app): add account page (61d1558)

  • feat(model): add UserPreference model (f1047b5)

  • feat(app): rebuild course route to include subject and code (0b05b44)

Test

  • test: improve test coverage (#79)

Add tests for authorization and create_db command. (182f19f)

  • test: improve test coverage (#78)

Improve coverage of scrape and db tests.


Co-authored-by: Dominik Imrich <dominik.imrich@student.tuke.sk> (fc1e2d0)

v3.9.0 (2023-11-06)

Feature

  • feat(app): paginate course index

Closes #36 (8999ee8)

  • feat(app): implement course filters as SQL

Apply course filters via SQL instead of in state. It is more efficient to filter courses at the database level. (85b62bd)

  • feat(app): add course search

Closes #61 (b844873)

Fix

  • fix(app): handle adding already included table to ModelFilter (a982e5e)

v3.8.0 (2023-10-27)

Feature

  • feat(app): add subject and campus select elements (50e1af2)

  • feat(app): add course filter interface (0675fd9)

v3.7.0 (2023-10-23)

Feature

  • feat(model): make course.set_id() generic and move to base

Make the set_id() method of Course more general and add it to the Base model, so it can be used on other models. (53565cd)

Fix

  • fix(model): add offering surrogate key

Replace Offering CRN with offering_id as the primary key. CRN is not unique beyond terms.

Fixes #60 (fcdaf9d)

  • fix(db): include all columns in unique constraint name (29c6cb0)

v3.6.0 (2023-10-23)

Chore

  • chore: drop unused db_config.py (ba2e110)

Ci

Documentation

  • docs: instruct to target dev branch (5aa5d35)

Feature

  • feat(app): add lower navbar (fc9fb65)

  • feat(app): add program index and program page (dd30eaf)

  • feat(script): add load_programs script and command (6cc397b)

  • feat(model): add Program model (15edaa7)

  • feat(db): add programs.json (5c92b84)

Fix

  • fix(scraper): undelete objects on merge

On merge of an object set deleted_at to None, so it is un-deleted. (35ba339)

Style

  • style: fix table style in light mode

Fixes #55 (5e2d1f9)

v3.5.1 (2023-10-19)

Chore

  • chore(deps): bump urllib3 from 2.0.6 to 2.0.7

Bumps urllib3 from 2.0.6 to 2.0.7.


updated-dependencies:

  • dependency-name: urllib3 dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (0920c76)

  • chore(deps-dev): bump gitpython from 3.1.36 to 3.1.37

Bumps gitpython from 3.1.36 to 3.1.37.


updated-dependencies:

  • dependency-name: gitpython dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (00fdc6a)

Fix

  • fix: price in offering info (#59)

Closes #54 (82dd4a4)

v3.5.0 (2023-10-18)

Chore

  • chore(deps): bump urllib3 from 2.0.4 to 2.0.6

Bumps urllib3 from 2.0.4 to 2.0.6.


updated-dependencies:

  • dependency-name: urllib3 dependency-type: indirect ...

Signed-off-by: dependabot[bot] <support@github.com> (960b92f)

Feature

  • feat(database): intercept delete commands and replace with a soft delete
  • Add SQL soft delete rule to tables.
  • Update load_courses() to reinstate deleted courses. (b3a284c)
  • feat(model): make soft delete SQLAlchemy

Use SQLAlchemy function with_loader_criteria() to alter select statements instead of custom rewrite function. (21660cb)

  • feat(model): add support for ORM joins to soft delete hook (2f6143d)

  • feat(model): add option to override soft delete select hook (8116aae)

  • feat(model): add soft delete fields and select hook (c7e5194)

Fix

  • fix(model): handle interface changes in flask-sqlalchemy extension (dd5d6cb)

Style

  • style: make tables easier to read (917036d)

v3.4.3 (2023-09-17)

Fix

  • fix(model): add cancelled to not available keywords (8138ab1)

v3.4.2 (2023-09-16)

Fix

  • fix(model): mark available when status contains keyword

Fixes #46 (76be36b)

v3.4.1 (2023-09-15)

Fix

  • fix: specify text color of nav bar in light mode (684dd08)

v3.4.0 (2023-09-15)

Chore

Feature

  • feat(scripts): merge in scraped courses (9b07abd)

  • feat(model): declare cascade behaviour

  • Add server side on-delete-cascade to offering.term FK constraint. (85e75c3)
  • feat(model): add set_id to course (99fffae)

  • feat(model): handle composite constraints in get_by_unique (5525c44)

  • feat(db): add unique constraint to course (377a7d8)

Test

  • test: fix script location in tests/alembic.ini (8ca9d1c)

v3.3.0 (2023-09-13)

Feature

  • feat(app): display last updated on course page (508e081)

  • feat(model): add timestamps to Course, Offering and User (ea0267f)

v3.2.1 (2023-09-11)

Documentation

  • docs: detail installation steps (664017c)

  • docs: extend roadmap (ac09299)

  • docs: remove poetry reference (ce0f7c3)

Fix

  • fix(db): specify encoding in create db stmt

Web scraped data may contain any variety of characters. To be safe, set UTF-8 as the encoding so all known encodings are supported.

Fixes #38 (413b3b8)

v3.2.0 (2023-09-10)

Feature

  • feat(scripts): add all-subjects flag to load-db cmd

Add option to load all subjects into the database to load-db command. (b9e8840)

  • feat(model): and is_active field to Subject

Add a field to indicate whether a subject should be web-scraped. (eff0a6c)

  • feat(app): add load-subjects command (25d1a56)

v3.1.4 (2023-09-09)

Fix

  • fix(app): add grant schema to create cmd (a32e96b)

v3.1.3 (2023-09-09)

Fix

  • fix(app): pass db connection to upgrade command

Since an url is not set in alembic config in a deployment environment, any alembic commands require a connection to be passed to the config. (40ad30c)

v3.1.2 (2023-09-08)

Ci

Documentation

  • docs: update installation steps (b5e46ab)

Fix

  • fix(app): handle role exists (ff81fc6)

  • fix(app): don't connect to db if uri not set

fmu (a1afd2d)

v3.1.1 (2023-09-08)

Fix

  • fix(app): resolve alembic script path (10fea34)

v3.1.0 (2023-09-08)

Feature

  • feat(app): add cli command to upgrade database (defda96)

  • feat(app): add cli command to create database (ec24183)

  • feat: refactor migrations into package

Move migration files inside of package, so they can be run by the user to set up a database. (8f6015f)

Fix

  • fix(app): add metadata to app db context (bf64aad)

Test

  • test: omit alembic files from coverage report (15df256)

v3.0.1 (2023-09-07)

Fix

  • fix(db): increase course.url allowed length (8406190)

v3.0.0 (2023-09-03)

Chore

  • chore: switch db url config variables (7cbf342)

Ci

  • ci: apply missing dbtest marker to necessary tests (c974827)

Documentation

  • docs: add the run instruction (7c581ab)

Feature

  • feat(app): add index and course page to app factory (3333f80)

  • feat(app): add stylesheet (b9f9403)

  • feat(app): add html templates for register and login (ba3ca49)

  • feat(app): add auth Blueprint (ccd9b6a)

  • feat(model): add get_by_unique method

Add method with similar signature to session.get(), but that returns an object by its unique constraint fields. (d96c04c)

  • feat(app): connect app to db

Extend Flask-SQLAlchemy to use SQLAlchemy Base class as Model. (81f65e9)

  • feat(model): add User model
  • Declare User model
  • Add migration for user table
  • Add tests (ab917ab)
  • feat(app): configure app database connection
  • Add cli command to run bcit_to_sql. (9f88652)
  • feat(app): add flask application factory (b6f0eff)

  • feat(app): add courses, course and query page (c8009cd)

  • feat(app): add filter_courses function (bc81dee)

Fix

  • fix(model): make User object subscriptable

Extend MappedAsDataclass with getitem and mixin to the User model. (506e9a2)

Refactor

  • refactor: drop interface.py (6a277ca)

  • refactor: drop test util clone function

Replace usages of the test utility clone function with the clone method on Base. (354fdaa)

Test

  • test(app): add app tests (bf736f4)

v2.3.2 (2023-09-02)

Fix

  • fix(model): change Course.credits to type REAL

Type FLOAT(2) is automatically converted to REAL by postgres. Consequently, the model and database fall out of sync, and alembic check will fail. Explicitly declare credits as datatype REAL to avoid pre-commit failing. (7c993ef)

Refactor

  • refactor: drop legacy modules (9030b10)

v2.3.1 (2023-09-01)

Fix

  • fix(model): leave primary key validation to the database

Do not validate that new object's PKs will not result in an integrity error. (2db074e)

v2.3.0 (2023-08-31)

Chore

  • chore(model): make course id seq explicit (364be1a)

Feature

  • feat(model): add clone method

Add method to clone an object and its relationships. (f8c863f)

v2.2.0 (2023-08-11)

Feature

  • feat(model): add to_string method to Offering

Use tabulate to beautify meetings as string. (e0703bb)

  • feat(model): expose Meeting attributes in Offering (020b848)

Fix

  • fix(model): add building to Meeting

Fix parse meeting_node to include building and room. (198fd4d)

v2.1.0 (2023-08-10)

Documentation

  • docs: add DB init instructions (895db50)

Feature

  • feat(scripts): add parse_meeting_node

Drop tests for bcit_to_sql as they were overcomplicated and a bit redundant. (78b6056)

  • feat(model): add Term model
  • Declare term model and add table to the databse.
  • Define relationship to term in offering model.
  • Add term parsing functions to scrape_and_load.py.
  • Update tests as necessary. (76ba22b)
  • feat(db): add meeting table

Drop server side partitioned sequence if favour of SQLAlchemy/Python default. This solution may be less performant but plays nicer with SQLAlchemy. Remove alembic migration d76. Add next_meeting_id function to increment meeting_id before objects are persisted to the database. (cf07c1b)

  • feat(db): add nssequence_nestval function (8aac743)

  • feat(model): add Meeting model (d0eb4ed)

v2.0.0 (2023-08-06)

Chore

  • chore: update poetry.lock (eb36983)

  • chore: update README.md format (6a9aa8d)

Documentation

  • docs: add pytest-cov to CONTRIBUTING.md (eb77a7d)

Feature

  • feat(gui): update simple_gui to work with database (8883bbe)

  • feat: add populate_subject.sql

Add SQL script to easily populate the subject table. (de27efd)

  • feat(model): add to_string to Course (4a1672b)

  • feat(model): add get_course to Subject (6b9b8e4)

  • feat(model): add meeting_time to Offering (c4f71ca)

  • feat(model): get CRN in parse_offering_node

Alter offering.crn to string and drop sequence. Closes #2 (55a429e)

  • feat: add bcit_to_sql

Add a webscraping and loading script with tests.

  • Add get_course_urls()
  • Add extract_models()
  • Add load_models()
  • Add bcit_to_sql() (5d3b651)
  • feat: add prep_db and scrape_course_urls
  • Add course_list_response.pkl to test data. (d8ca836)
  • feat: delete children passively

Let the database handle cascades for unloaded children. (e8e2601)

  • feat: add on delete cascade to fk constraints

Replace python types with SQLAlchemy types in models. (7342927)

  • feat: add Subject model (38a725c)

  • feat: add offering_count and is_available (caf8e0e)

  • feat: factor out course parsing logic

Abstract course parsing logic into separate function. Add CoursePage class to couple url to HTMLParser. (5e1aae5)

  • feat: add Course model

Declare, add migration and tests for the Course model. (c974126)

  • feat: add Offering model
  • Refactor MeetingTable into a separate file, at least temporarily, to maker refactoring Offering easier.
  • Declare the Offering model.
  • Add tests for Offering and remove old offering tests.
  • Add migration for Offering model.
  • Update .pre-commit-config.yaml ruff hook version to match project dependency.
  • Add RUF012 to ruff ignore, because it is violated by SQLAlchemy table_args. (ae55ebd)
  • feat: alembic init

Initialize alembic for database migrations and update dependencies. (0c13528)

Fix

  • fix(db): alter course field types

Alter course.url to VARCHAR(120) to allow for longer URLs. Alter course.prerequisites to TEXT. (80bd5f8)

  • fix: add new_offering fixture to test_course.py

The new_course fixture, of course_id 2, was assigned the conftest offering fixture of course_id 1. (87a20a7)

Refactor

  • refactor: drop modules.subject.py
  • refactor: extract_course_data.py to scrape_and_load.py (de08363)

  • refactor: chunk out course-parsing logic into smaller units

Maintaining and testing is easier if the logic is separated by object. (595471b)

Test

  • test: add dbtest decorator (f2f5357)

  • test: add string rep test (714ad56)

  • test: pre-populate test database

Populate the test database with test data during setup. This way, tests can be more independent and there's less redundancy. (356cc08)

  • test: configure test database

Tests should be self-contained. Run tests in a separate test database. Configure alembic to run setup test db with migrations. (26e3b17)

  • test: add offering db transaction tests (c72629e)

  • test: add test for parse_offering_node()

  • Add load_test_data.py script for extracting and loading test_data.
  • Add Response test data. (189e5b4)

Unknown

  • tests: clean up redundant tests (cc6fed4)

  • tests: add @dbtest mark to db dependant texts

Add @dbtest decorator for tests that connect to the database. Use non-db fixture in test_parse_offering_node. (1432850)

  • lint: add black hook to alembic.ini
  • Add alembic hook to .pre-commit-config.yaml (23ed218)

v1.0.0 (2023-08-06)

Ci

  • ci: disable upload to release for semantic-release (796c101)

  • ci: update release commit format (79a6d08)

  • ci: update sr.yml with admin permissions (45544f2)

  • ci: add auto versioning (#9) (6be6f9e)

  • ci: add ci workflow (#8)

Setup and config continuous integration. (28ede72)

Documentation

  • docs: add CONTRIBUTING.md (10c436a)

Refactor

  • refactor: separate course parsing logic into bcit_courses.py (b8407dc)

Unknown

  • v1.0.0

Manual release by Jonathan Biemond. (ea9bd12)

v0.1.1 (2023-07-23)

Fix

  • fix: update requests dependency

Since Requests v2.3.0, Requests has been vulnerable to potentially leaking Proxy-Authorization headers to destination servers, specifically during redirects to an HTTPS origin. (daec4e2)

v0.1.0 (2023-07-23)

Build

  • build: migrate to poetry

Add black, ruff and pre-commit. (ea796aa)

Unknown

  • Merge branch 'user-interface'

Conflicts:

main.py (bba2a01)

  • Drop main.py

Functionality refactored into subject.py and interface.py. (3ff8c23)

  • Add not_on_any_days() to Offering

-Refactor weekdays variable into constant. (c2f6486)

  • Update test_offering_not_on_days() to take a list of days

-Add test to check for Exception when day is not valid. (8904291)

  • Add location() to MeetingTable (466732b)

  • Add time methods to MeetingTable

Add start_time() and end_time() to MeetingTable. (83d273a)

  • Add days() to MeetingTable (f117a62)

  • Add date methods to MeetingTable

Add start_date() and end_date() to MeetingTable. (d56fdda)

  • Test: update MeetingTable date tests

Expect exceptions instead of values of None when dates are missing or invalid. (4d358be)

  • Test: add MeetingTable attribute tests

Add init.py to modules to simplify import into tests. (d98f753)

  • Update interface.py styling to support beautified meeting times (c30614f)

  • Beautify meeting times

  • Add MeetingTable class to offering.py to hold meeting data
  • Parse meeting_time row into list of elements to pass to MeetingTable
  • Display MeetingTable with tabulate
  • Update requirements.txt with tabulate (30a2b95)
  • Update main.py

Bug fix - Filtered out courses with status label "Seats Available" (b86e9b4)

  • Add icon to simple_gui() (8910ca4)

  • Update simple_gui() style

  • Add tooltip to Save button
  • Remove scroll bar from some popups
  • Add title to subject error popup (b8e1d64)
  • Handle invalid subject input
  • Update dropdown items formatting to show available offerings. (bce421f)
  • Update README.md with GUI usage

Add GUI usage steps with images. Add Contributors section. (d14a9c4)

  • Add Course.offering_count() (c5a717c)

  • Set custom theme (abce9a0)

  • Change simple_gui() layout

Change layout to be more intuitive and add input field titles. Make Combo element readonly. (313c486)

  • Add course selection dropdown to simple_gui() (dedaacf)

  • Raise exception if URL response returns an error (9189bf7)

  • Raise error if subject does not have any courses

  • Light refactoring.
  • Set ThreadPoolExecutor to default number of threads, to avoid potential inefficiencies. (dc81f04)
  • Fix multithreading in available_courses()

Rewrite ThreadPoolExecutor() context block to successfully implement multithreading. (56eac0c)

  • Update README.md (badbbac)

  • Add .gitignore file (7d44b7e)

  • Add To File button to simple_gui()

  • Store Subject objects in dictionary for multiple loops. (1e30eb8)
  • Add Offering status attribute
  • Return all offerings regardless of status.
  • Get status from status_node and pass to Offering.
  • Add feature to Course.to_string() to default to available offerings only. (e41fdf2)
  • Add simple_gui() to interface.py
  • Update requirements.txt (45ec873)
  • Fix get_valid_course() (2cc18e0)

  • Add .to_string() method to Course and Offering

-Update Subject.to_file() to use Course.to_string() -Add subject attribute to Course -Update parse_url() to pass subject and code to Course separately (7bb0a0c)

  • Copy changes to subject.py (5ecf1eb)

  • Merge remote-tracking branch 'origin/main' into user-interface (9ee5106)

  • Add interface.py

Rename main.py to interface.py. Revert main.py back to source branch to maintain merge compatibility. (5f222c2)

  • Move parse_url functions from main.py to subject.py module.
  • Create Subject class to hold Course list and methods.
  • Add get_valid_course() to main.py. (0d74008)