
Product
Introducing Webhook Events for Alert Changes
Add real-time Socket webhook events to your workflows to automatically receive software supply chain alert changes in real time.
easel-cli
Advanced tools
A Canvas course management tool.
pip install easel-cli
To install from the root of the repository:
pip install -e .
When connected to a Canvas course, easel will read in a yaml file and create the
corresponding component in Canvas on that course. Currently, easel requires you
to run its commands from the root of your course directory (where the component
subdirectories are located). This is where easel will initialize its database:
.easeldb.
For each of these operations, refer to their detailed description and usage below.
easel login <canvas_base_url> <api_token>easel initeasel course add <canvas_course_url>easel push [component_filepath ...]Easel makes it easy to not have to start from scratch by first pulling the material from a previous course and pushing it to a new course:
easel login <canvas_base_url> <api_token>easel initeasel course add <previous_canvas_course_url>easel pulleasel course add <new_canvas_course_url>easel --course <new_course_id> pusheasel course remove <old_course_id>These are the components currently managed by easel. For configuration, see the linked documentation.
easel login <canvas_base_url> <api_token>
E.g.,
easel login https://school.instructure.com yourT0kenH3re
Only needs to be run once per client machine. Records the Canvas url and token to be used later. Canvas tokens can be generated in "Account->Settings->+New Access Token".
easel init
Run this one time per course directory. It will initialize the easel database in the current directory. It will also create subdirectories for each Canvas component type that easel supports.
At this time, easel requires components to be organized by directory but this is hopefully a temporary restriction.
easel course add <canvas_course_url>
E.g.,
easel course add https://school.instructure.com/courses/615446
Hooks up the database to a Canvas course. Run this one time per Canvas course (once per section taught per semester).
easel course list
List all Canvas courses that are tracked in the database.
Reads in and pushes a specific component (or multiple components) to the configured courses. A push reads the information of each component stored locally and for each one, makes a POST or PUT request to Canvas, depending on whether you are creating or updating the component in the Canvas course.
easel push
or to push to a specific course:
easel --course <course_id> push
To push a specific component or components:
easel push [component_filepath ...]
E.g.,
easel push pages/lesson-1.yaml
Notes on pushing files:
files directory will be pushed as they are (ignoring
the files parent directory).--hidden flag to unpublish the file(s) as hidden when pushed (by
default canvas publishes files when you upload them).easel will push all of its child files.Course filtering:
Use the --course flag (alternatively -c) to specify a subset of your
courses. I prefer to use the section number to identify a course. For example,
to push a page to only sections 01 and 02, I would use this command:
easel push -c 01 -c 02 pages/lesson-1.yaml
Remove a given component(s) from the canvas course. This does not delete the yaml file or the local database entry for the component. But it will remove the database record which tracks that component in Canvas (i.e., it's Canvas ID).
easel remove [component_filepath ...]
E.g.,
easel remove pages/lesson-1.yaml
Note for files:
easel will remove all of its child files (however
the empty directory will remain in Canvas).For now it is required to store component files in separate directories, named
for their component type (e.g., store definition files for pages in a directory
called pages). This requirement may be removed in the future.
Each individual component is defined by a single file using yaml. When a
component has some associated body/description content, it should be included in
markdown as part of the component's yaml configuration using a multiline string
(see the examples directory for examples).
When specifying dates (e.g., due_at, unlock_at, lock_at), ISO 8601 format should be used. This is temporary until I can build out an internal date management system.
I'll try to keep this list in order, with the items I'm prioritizing to get done sooner listed first.
__iter__ from quiz_question.py- question_name: g1
question_type: group
questions:
- quiz_questions/functions.yaml
- quiz_questions/functions.yaml
- quiz_questions/functions.yaml
The preprocessor would intercept the question_type (it's invalid anyway) and
make the api call to create the group, passing in the questions. So remember
that in case they open up question groups to work by specifying a question
directly.FAQs
A Canvas course management tool
We found that easel-cli demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Add real-time Socket webhook events to your workflows to automatically receive software supply chain alert changes in real time.

Security News
ENISA has become a CVE Program Root, giving the EU a central authority for coordinating vulnerability reporting, disclosure, and cross-border response.

Product
Socket now scans OpenVSX extensions, giving teams early detection of risky behaviors, hidden capabilities, and supply chain threats in developer tools.