diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000000..2231ae1755
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+open_collective: julialang
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 92cdf08c5d..cbc026e816 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -9,9 +9,10 @@ assignees: ''
Thank you for reporting an issue about Pluto! Let's get it fixed!
-# To report an issue, you need two things:
+# To report an issue, you need three things:
1. 📹 A video recording demonstrating the problem. (You can drag a video file into this box)
2. 📝 A short Pluto notebook file. (Upload the notebook file to https://gist.github.com/ and include the link.)
+3. 🤕 Try to clearly explain what the problem is, it might not be obvious to others! Instead of saying: "This does not work.", try to say: "I expected ..., but instead I am seeing ..."
🙋 But my issue is really simple, I don't want to make a screen recording / notebook!
diff --git a/.github/workflows/Bundle.yml b/.github/workflows/Bundle.yml
index ef89e2bd0e..ff2c46bcec 100644
--- a/.github/workflows/Bundle.yml
+++ b/.github/workflows/Bundle.yml
@@ -5,45 +5,74 @@ on:
branches:
- main
workflow_dispatch:
+ pull_request:
+ paths-ignore:
+ - "**.md"
+ - "**.jl"
+ branches-ignore:
+ - release
+
+concurrency:
+ group: bundle-${{ github.ref }}
+ cancel-in-progress: false
jobs:
trigger:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
# We use that PAT token instead of GITHUB_TOKEN because we are triggering another github action on the 'release' event.
# Triggering a workflow from a workflow is only allowed if the relaying event is signed with a PAT.
# See https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token
with:
token: ${{ secrets.PAT_TOKEN }}
+ if: github.event_name != 'pull_request'
+
- uses: fregante/setup-git-user@v1
-
+ if: github.event_name != 'pull_request'
+
# Ignore the build changes from previous run.
# This "just" hard resets to the latest commit on main.
# The previous bundle commit will still exist, but will be "dangling", unless we made a tag for it.
# Github will eventually clean dangling commits, which is fine because again, the ones with a tag will stay around.
- name: Make Sure Release Is Reset To Main
+ if: github.event_name != 'pull_request'
run: |
git checkout -b release
git reset --hard $GITHUB_SHA
+ # if this is a PR. then just checkout without fanciness
+ - uses: actions/checkout@v3
+ if: github.event_name == 'pull_request'
+
# Do the actual bundling
- - uses: actions/setup-node@v2
+ - uses: actions/setup-node@v3
with:
node-version: 17.x
cache: "npm"
cache-dependency-path: frontend-bundler/package-lock.json
+
- run: npm install
working-directory: frontend-bundler
- - name: The Actual Build
+
+ - name: The Actual Build (try 3 times)
working-directory: frontend-bundler
- run: npm run build
+ run: |
+ (npm run build) || (npm run build) || (npm run build)
+
+ - name: Check for corrupt files
+ working-directory: frontend-dist
+ run: |
+ if [[ $(find . -empty) ]]; then
+ exit 1
+ fi
# Push the rebuild frontend-dist to the release branch.
# Needs to be `add --force` because frontend-dist is normally gitignored.
# Also needs `push --force` because we reset to main (which doesn't contain the previous frontend-dist)
- name: Force push frontend-dist changes
+ if: github.event_name != 'pull_request'
run: |
git add frontend-dist --force
- git commit -m "$GITHUB_WORKFLOW"
+ git commit -m "$GITHUB_WORKFLOW" -m "Built from hash $GITHUB_SHA"
git push origin release --force
diff --git a/.github/workflows/FrontendTest.yml b/.github/workflows/FrontendTest.yml
index 6f72114274..99db72eeee 100644
--- a/.github/workflows/FrontendTest.yml
+++ b/.github/workflows/FrontendTest.yml
@@ -19,23 +19,24 @@ on:
jobs:
frontend-test:
runs-on: "ubuntu-latest"
+ timeout-minutes: 30
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
# Makes thes `julia` command available
- uses: julia-actions/setup-julia@v1
with:
- version: "1.5"
+ version: "1.6" # our lowest supported version
- name: Install Pluto.jl packages
run: |
julia --project=$GITHUB_WORKSPACE -e "using Pkg; Pkg.instantiate()"
- - uses: actions/setup-node@v1
+ - uses: actions/setup-node@v3
with:
- node-version: "12.x"
+ node-version: "18.x"
- name: Install Chrome dependencies
run: |
@@ -62,24 +63,27 @@ jobs:
- name: Run tests
working-directory: ./test/frontend
run: |
- julia -e "import Pkg; Pkg.add(path=\"$GITHUB_WORKSPACE\"); Pkg.instantiate(); import Pluto; Pluto.run(port=$PLUTO_PORT, require_secret_for_access=false)" & # Run Pluto.jl server in the background
+ julia --project=$GITHUB_WORKSPACE -e 'import Pluto
+ # Run Pluto.jl server in the background
+ options = Pluto.Configuration.from_flat_kwargs(;
+ port=parse(Int, ENV["PLUTO_PORT"]),
+ require_secret_for_access=false,
+ workspace_use_distributed_stdlib=false,
+ )
+ 🍭 = Pluto.ServerSession(; options)
+ server = Pluto.run!(🍭)
- # Wait for Pluto to initialize
- TIMES_TRIED=0
- until [ $TIMES_TRIED -eq 60 ] || $(curl --output /dev/null --silent --fail "http://localhost:$PLUTO_PORT/"); do
- printf '.'
- TIMES_TRIED=$((TIMES_TRIED+1))
- sleep 1
- done
+ run(`npm run test`)
+
+ close(server)'
- npm run test
env:
PLUTO_PORT: 1235
PLUTO_TEST_OFFLINE: ${{ github.ref_name == 'release' }}
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable"
- - uses: actions/upload-artifact@v2
+ - uses: actions/upload-artifact@v3
if: failure()
with:
name: test-screenshot-artifacts
diff --git a/.github/workflows/IntegrationTest.yml b/.github/workflows/IntegrationTest.yml
new file mode 100644
index 0000000000..69e7d8b5a5
--- /dev/null
+++ b/.github/workflows/IntegrationTest.yml
@@ -0,0 +1,69 @@
+name: Test dependent packages
+
+# based on https://github.com/SciML/SciMLBase.jl/blob/master/.github/workflows/Downstream.yml, thanks!
+
+# this is the same as Test.yml
+on:
+ workflow_dispatch:
+ push:
+ paths-ignore:
+ - 'frontend/**'
+ - 'frontend-bundler/**'
+ - 'frontend-dist/**'
+ - 'test/frontend/**'
+ - '**.md'
+ branches:
+ - main
+ pull_request:
+ paths-ignore:
+ - 'frontend/**'
+ - 'frontend-bundler/**'
+ - 'frontend-dist/**'
+ - 'test/frontend/**'
+ - '**.md'
+ branches-ignore:
+ - release
+
+
+jobs:
+ test:
+ name: ${{ matrix.package.repo }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ julia-version: [1]
+ os: [ubuntu-latest]
+ package:
+ - { user: JuliaPluto, repo: PlutoSliderServer.jl }
+
+ steps:
+ - uses: actions/checkout@v3
+ - uses: julia-actions/setup-julia@v1
+ with:
+ version: ${{ matrix.julia-version }}
+ arch: x64
+ - uses: julia-actions/julia-buildpkg@v1
+ - name: Clone Downstream
+ uses: actions/checkout@v3
+ with:
+ repository: ${{ matrix.package.user }}/${{ matrix.package.repo }}
+ path: downstream
+ - name: Load this and run the downstream tests
+ shell: julia --project=downstream {0}
+ run: |
+ using Pkg
+ try
+ # force it to use this PR's version of the package
+ Pkg.develop(PackageSpec(path=".")) # resolver may fail with main deps
+ Pkg.update()
+ Pkg.test() # resolver may fail with test time deps
+ catch err
+ err isa Pkg.Resolve.ResolverError || rethrow()
+ # If we can't resolve that means this is incompatible by SemVer and this is fine
+ # It means we marked this as a breaking change, so we don't need to worry about
+ # Mistakenly introducing a breaking change, as we have intentionally made one
+
+ @info "Not compatible with this release. No problem." exception=err
+ exit(0) # Exit immediately, as a success
+ end
diff --git a/.github/workflows/LaunchTest.yml b/.github/workflows/LaunchTest.yml
index c7538be8b2..7bac5abb94 100644
--- a/.github/workflows/LaunchTest.yml
+++ b/.github/workflows/LaunchTest.yml
@@ -13,12 +13,12 @@ jobs:
strategy:
matrix:
# We test quite a lot of versions because we do some OS and version specific things unfortunately
- julia-version: ["1.0", "1.5", "1.7"]
+ julia-version: ["1.6", "1.7"]
os: [windows-latest, ubuntu-latest]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
# Makes thes `julia` command available
- uses: julia-actions/setup-julia@v1
diff --git a/.github/workflows/ReleaseTriggers.yml b/.github/workflows/ReleaseTriggers.yml
index b149a530bd..cad0e668c3 100644
--- a/.github/workflows/ReleaseTriggers.yml
+++ b/.github/workflows/ReleaseTriggers.yml
@@ -14,7 +14,7 @@ jobs:
matrix:
repository: ['fonsp/pluto-on-binder', 'JuliaPluto/sample-notebook-previews']
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- run: |
curl \
-X POST \
diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml
index ae92fce49f..d0c5b86382 100644
--- a/.github/workflows/TagBot.yml
+++ b/.github/workflows/TagBot.yml
@@ -23,17 +23,11 @@ jobs:
# See https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token
token: ${{ secrets.PAT_TOKEN }}
changelog: |
- ## {{ package }} {{ version }}
-
- > Try this release in your browser! _(Available 30 minutes after the release)_
+ > **Try this release in your browser!** _(Available 30 minutes after the release)_
>
>
-
- **Generate your own binder links using [pluto-on-binder.glitch.me](https://pluto-on-binder.glitch.me/)!**
-
- {% if previous_release %}
- [Diff since {{ previous_release }}]({{ compare_url }})
- {% endif %}
+ >
+ > Generate your own binder links using [pluto-on-binder.glitch.me](https://pluto-on-binder.glitch.me/)!
{% if custom %}
{{ custom }}
@@ -52,3 +46,19 @@ jobs:
- {{ issue.title }} (#{{ issue.number }})
{% endfor %}
{% endif %}
+
+ # New features
+ *(TODO)*
+
+ # Performance improvements
+ *(TODO)*
+
+ # Fixes
+ *(TODO)*
+
+ # Internal changes
+ *(TODO)*
+
+ {% if previous_release %}
+ [Diff since {{ previous_release }}]({{ compare_url }})
+ {% endif %}
diff --git a/.github/workflows/Test.yml b/.github/workflows/Test.yml
index eaa6a1ff72..359a6a6149 100644
--- a/.github/workflows/Test.yml
+++ b/.github/workflows/Test.yml
@@ -9,12 +9,16 @@ on:
- "frontend/**"
- "frontend-bundler/**"
- "frontend-dist/**"
+ - "test/frontend/**"
- "**.md"
branches:
- main
pull_request:
paths-ignore:
- "frontend/**"
+ - "frontend-bundler/**"
+ - "frontend-dist/**"
+ - "test/frontend/**"
- "**.md"
branches-ignore:
- release
@@ -23,24 +27,27 @@ on:
jobs:
test:
runs-on: ${{ matrix.os }}
- timeout-minutes: 40
- # Uncomment if you want to see all results for all OSses. Otherwise, the first failed test cancels all others
- # continue-on-error: true
+ timeout-minutes: 50
+
strategy:
+ # Without setting this, a failing test cancels all others
+ fail-fast: false
matrix:
# We test quite a lot of versions because we do some OS and version specific things unfortunately
- julia-version: ["1.5", "1.6", "1.7"] #, "nightly"]
+ julia-version: ["1.6", "1.8", "1.10", "nightly"] # "~1.11.0-0"]
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- # Makes thes `julia` command available
+ # Makes the `julia` command available
- uses: julia-actions/setup-julia@v1
with:
version: ${{ matrix.julia-version }}
+ - uses: julia-actions/cache@v1
# 🚗
- uses: julia-actions/julia-runtest@v1
- continue-on-error: ${{ matrix.julia-version == 'nightly' }}
+ with:
+ coverage: false
diff --git a/.github/workflows/TestBundledExport.yml b/.github/workflows/TestBundledExport.yml
new file mode 100644
index 0000000000..6cc8a31339
--- /dev/null
+++ b/.github/workflows/TestBundledExport.yml
@@ -0,0 +1,31 @@
+name: Test bundled HTML export
+
+on:
+ push:
+ branches:
+ - release
+
+jobs:
+ frontend-test:
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - uses: julia-actions/setup-julia@v1
+ with:
+ version: "1.8"
+
+ - name: Generate exports and check for warnings
+ run: |
+ julia --project=$GITHUB_WORKSPACE -e '
+ import Pkg
+ Pkg.activate(".")
+ Pkg.instantiate()
+ import Pluto
+ using Test
+
+ @test_logs Pluto.generate_html()
+ @test_logs Pluto.generate_index_html()
+ '
+
diff --git a/.github/workflows/TypeScriptCheck.yml b/.github/workflows/TypeScriptCheck.yml
new file mode 100644
index 0000000000..bf8b115bc2
--- /dev/null
+++ b/.github/workflows/TypeScriptCheck.yml
@@ -0,0 +1,35 @@
+name: Run TypeScript checks
+
+on:
+ push:
+ paths:
+ - "**.js"
+ - "**.ts"
+ branches:
+ - main
+ - release
+ pull_request:
+ paths:
+ - "**.js"
+ - "**.ts"
+ branches-ignore:
+ - release
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - uses: actions/setup-node@v3
+ with:
+ node-version: "18.x"
+
+ - run: npm install typescript@5.0.4 -g
+
+ - run: npm install
+ working-directory: frontend
+
+ - name: Run TypeScript checks on frontend/
+ run: tsc --noEmit --strictNullChecks false
diff --git a/.gitignore b/.gitignore
index 41be10eda5..a2b07a1d8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,8 @@ node_modules
.parcel-cache
frontend/dist
.net
-net
\ No newline at end of file
+net
+frontend/package-lock.json
+
+# PProf
+profile.pb.gz
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 800e828e01..3c537d6a8f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,21 +4,18 @@
"prettier.semi": false,
"prettier.quoteProps": "consistent",
"prettier.singleQuote": false,
- "julia.format.calls": false,
- "julia.format.comments": false,
- "julia.format.curly": false,
- "julia.format.docs": false,
- "julia.format.indents": false,
- "julia.format.iterOps": false,
- "julia.format.ops": false,
- "julia.format.tuples": false,
- "julia.format.kwarg": "off",
"editor.formatOnSave": false,
"[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[css]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true
+ },
+ "[html]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..1ef57e407d
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+fons@plutojl.org.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/Project.toml b/Project.toml
index 099f5c55c9..5c2ed3a340 100644
--- a/Project.toml
+++ b/Project.toml
@@ -2,39 +2,77 @@ name = "Pluto"
uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781"
license = "MIT"
authors = ["Fons van der Plas "]
-version = "0.17.5"
+version = "0.19.36"
[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
Configurations = "5218b696-f38b-4ac9-8b61-a12ec717816d"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
-Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
+ExpressionExplorer = "21656369-7473-754a-2065-74616d696c43"
FileWatching = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
FuzzyCompletions = "fb4132e2-a121-4a70-b8a1-d5b831dcdcc2"
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
+HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
+LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36"
+MIMEs = "6c6e2e6c-3030-632d-7369-2d6c69616d65"
+Malt = "36869731-bdee-424d-aa32-cab38c994e3b"
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
MsgPack = "99f44e22-a591-53d1-9472-aa23ef4bd671"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+PrecompileSignatures = "91cefc8d-f054-46dc-8f8c-26e11d7c5411"
+PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+RegistryInstances = "2792f1a3-b283-48e8-9a74-f99dce5104f3"
+RelocatableFolders = "05181044-ff0b-4ac5-8273-598c1e38db00"
+Scratch = "6c6a2e73-6563-6170-7368-637461726353"
Sockets = "6462fe0b-24de-5631-8697-dd941f90decc"
+TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
[compat]
+Base64 = "1"
Configurations = "0.15, 0.16, 0.17"
-FuzzyCompletions = "0.3,0.4"
-HTTP = "^0.9.1"
+Dates = "1"
+Downloads = "1"
+ExpressionExplorer = "0.5, 0.6, 1"
+FileWatching = "1"
+FuzzyCompletions = "0.3, 0.4, 0.5"
+HTTP = "^1.5.2"
+HypertextLiteral = "0.7, 0.8, 0.9"
+InteractiveUtils = "1"
+Logging = "1"
+LoggingExtras = "0.4, 1"
+MIMEs = "0.1"
+Malt = "1.1"
+Markdown = "1"
MsgPack = "1.1"
+Pkg = "1"
+PrecompileSignatures = "3"
+PrecompileTools = "1"
+REPL = "1"
+RegistryInstances = "0.1"
+RelocatableFolders = "0.1, 0.2, 0.3, 1"
+Scratch = "1.1"
+Sockets = "1"
+TOML = "1"
Tables = "1"
-julia = "^1.5"
+URIs = "1.3"
+UUIDs = "1"
+julia = "^1.6"
[extras]
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+Memoize = "c03570c3-d221-55d1-a50c-7939bbd78826"
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+Sockets = "6462fe0b-24de-5631-8697-dd941f90decc"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
[targets]
-test = ["Test", "Random", "DataFrames", "OffsetArrays"]
+test = ["DataFrames", "OffsetArrays", "Random", "Sockets", "Test", "TimerOutputs", "Memoize"]
diff --git a/README.md b/README.md
index 80577ea210..b76d99f931 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,12 @@