Compare commits

...
Author SHA1 Message Date
chrisgarrity 38aa76fae8 Merge pull request #5239 from chrisgarrity/update-blocks
Update blocks for swahili
2019-10-10 14:48:35 -04:00
Chris Garrity 18c7b58a16 Update blocks for swahili 2019-10-10 14:29:56 -04:00
DD Liu d7d38109a8 Merge pull request #5237 from fsih/updatePaint
Update paint to add swahili to overflow languages
2019-10-10 12:58:46 -04:00
DD Liu 2317758df8 update paint to add swahili to overflow languages 2019-10-10 12:15:29 -04:00
DD Liu 25c8253138 Merge pull request #5234 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20191001200908
Greenkeeper/scratch render 0.1.0 prerelease.20191001200908
2019-10-09 15:32:57 -04:00
chrisgarrity 75f9da9f22 Merge pull request #5233 from chrisgarrity/add-swahili
change l10n version to get swahili
2019-10-09 10:05:19 -04:00
Chris Garrity 8c3ab1df78 change l10n version to get swahili 2019-10-09 09:50:39 -04:00
chrisgarrity e04c290587 Merge pull request #5232 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1570622534
Update scratch-blocks to the latest version 🚀
2019-10-09 08:36:46 -04:00
greenkeeper[bot] 527f8dd3e7 chore(package): update lockfile package-lock.json 2019-10-09 12:17:56 +00:00
greenkeeper[bot] 251db0108d chore(package): update scratch-blocks to version 0.1.0-prerelease.1570622534 2019-10-09 12:17:51 +00:00
chrisgarrity 5100a1bd8a Merge pull request #5231 from LLK/greenkeeper/scratch-l10n-3.6.20191008224547
Greenkeeper/scratch l10n 3.6.20191008224547
2019-10-09 08:17:43 -04:00
greenkeeper[bot] ee5e2324a8 chore(package): update lockfile package-lock.json 2019-10-09 01:00:21 +00:00
greenkeeper[bot] 624bf7c965 chore(package): update scratch-l10n to version 3.6.20191008224547
Closes #5230
2019-10-09 01:00:17 +00:00
zoebentley 3089503ab1 Merge pull request #5228 from zoebentley/imagine-a-world
Changed title of Imagine If tutorial to Imagine a World
2019-10-08 08:44:07 -05:00
Zoë Bentley 8cac1b1bb7 Changed title of Imagine If tutorial to Imagine a World 2019-10-07 09:49:52 -04:00
Eric Rosenbaum 67fe5185fb Merge pull request #5218 from ericrosenbaum/feature/limit-loud-rms-no-waveshaper
Limit louder effect with a max RMS (w/o waveshaper)
2019-10-02 12:13:57 -04:00
greenkeeper[bot] 9122b26d1a chore(package): update lockfile package-lock.json 2019-10-01 20:12:23 +00:00
greenkeeper[bot] efcd2c9ebc chore(package): update scratch-render to version 0.1.0-prerelease.20191001200908
Closes #5217
2019-10-01 20:12:19 +00:00
Karishma Chadha 181c7ea93f Merge pull request #5222 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20191001145300
Greenkeeper/scratch vm 0.2.0 prerelease.20191001145300
2019-10-01 10:54:32 -05:00
greenkeeper[bot] a8a0bc437a chore(package): update lockfile package-lock.json 2019-10-01 14:55:57 +00:00
greenkeeper[bot] c6bc1c3450 chore(package): update scratch-vm to version 0.2.0-prerelease.20191001145300
Closes #5191
2019-10-01 14:55:53 +00:00
Ray Schamp 1ad0f43d23 Merge pull request #5220 from rschamp/ci/circle
Add config for CircleCI
2019-09-30 15:04:18 -04:00
rschamp a3400b3b0f Disable publishing
While CircleCI is running in parallel with Travis, let Travis continue to handle the deployments.
2019-09-30 14:22:58 -04:00
Eric Rosenbaum 523667dfaf Remove waveshaper from volume effect
the waveshaper node is implemented incorrectly on Mac Safari (https://bugs.webkit.org/show_bug.cgi?id=129333) and causes extreme distortion of the sound
2019-09-27 14:26:14 -04:00
Eric Rosenbaum 5599626405 Revert "Revert "Limit louder effect with a max RMS""
This reverts commit 45cb96f2d4.
2019-09-27 14:20:34 -04:00
Paul Kaplan d31d42cf3c Merge pull request #5216 from LLK/revert-5212-greenkeeper/scratch-render-0.1.0-prerelease.20190925202615
Revert "Update scratch-render to the latest version 🚀"
2019-09-26 10:05:56 -04:00
Paul Kaplan 11646d4877 Revert "Update scratch-render to the latest version 🚀" 2019-09-26 10:03:54 -04:00
Paul Kaplan e53c8ddd85 Merge pull request #5214 from LLK/revert-5149-feature/limit-louder-rms
Revert "Limit louder effect with a max RMS"
2019-09-26 09:49:33 -04:00
Paul Kaplan 45cb96f2d4 Revert "Limit louder effect with a max RMS" 2019-09-26 09:48:15 -04:00
Chris Willis-Ford ab0d58ed6c Merge pull request #5212 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20190925202615
Update scratch-render to the latest version 🚀
2019-09-25 13:59:22 -07:00
greenkeeper[bot] bdcddf5655 chore(package): update lockfile package-lock.json 2019-09-25 20:33:27 +00:00
greenkeeper[bot] 0f0219a4b1 chore(package): update scratch-render to version 0.1.0-prerelease.20190925202615 2019-09-25 20:32:57 +00:00
Eric Rosenbaum aa2890a2ca Merge pull request #5211 from LLK/greenkeeper/scratch-audio-0.1.0-prerelease.20190925183642
Update scratch-audio to the latest version 🚀
2019-09-25 15:49:01 -04:00
greenkeeper[bot] 43bddbba14 chore(package): update lockfile package-lock.json 2019-09-25 18:38:19 +00:00
greenkeeper[bot] e4af27cd40 chore(package): update scratch-audio to version 0.1.0-prerelease.20190925183642 2019-09-25 18:38:15 +00:00
chrisgarrity d390e67542 Merge pull request #5210 from LLK/greenkeeper/scratch-blocks-0.1.0-prerelease.1569422127
Update scratch-blocks to the latest version 🚀
2019-09-25 15:54:21 +01:00
greenkeeper[bot] a8b7be6197 chore(package): update lockfile package-lock.json 2019-09-25 14:38:29 +00:00
greenkeeper[bot] 35da6ace36 chore(package): update scratch-blocks to version 0.1.0-prerelease.1569422127 2019-09-25 14:38:25 +00:00
chrisgarrity 8590ceb4ce Merge pull request #5209 from LLK/greenkeeper/scratch-l10n-3.5.20190924223720
Update scratch-l10n to the latest version 🚀
2019-09-25 15:06:51 +01:00
greenkeeper[bot] 96e637cfc0 chore(package): update lockfile package-lock.json 2019-09-25 00:52:57 +00:00
greenkeeper[bot] f1470feb0a chore(package): update scratch-l10n to version 3.5.20190924223720 2019-09-25 00:52:53 +00:00
rschamp 7070b19562 Fix npm cache order in setup 2019-09-24 09:44:19 -04:00
rschamp 931a17462a Add build to build deploy step 2019-09-23 22:19:22 -04:00
rschamp 859e636d1a Moar parallel 2019-09-23 21:55:05 -04:00
rschamp 7ccf9f5bef FIx cache ordering 2019-09-23 21:35:26 -04:00
rschamp 0f589004a1 Use npm install to get better cache benefits 2019-09-23 21:31:42 -04:00
rschamp 2df4df0791 Use granular caching 2019-09-23 21:26:06 -04:00
rschamp 41296a9624 Optimize 2019-09-23 17:31:40 -04:00
rschamp 3dbfebe923 Parallelize 2019-09-23 16:27:30 -04:00
rschamp 5e0fc58f27 De-alias workflow
The requirements for npm publishing and gh-pages are different anyway.
2019-09-23 15:29:33 -04:00
rschamp 5eb8438782 Aliasify
The equivalent config for Travis is only 87 lines long, and easy to read. Can CircleCI be similarly easy to read? Is this easy? Are you still reading this?
2019-09-23 14:43:06 -04:00
rschamp 4f0bf3c5aa Add config for gh-pages deploy 2019-09-23 13:59:22 -04:00
DD Liu abe79b30ff Merge pull request #5203 from LLK/greenkeeper/scratch-paint-0.2.0-prerelease.20190923154429
Greenkeeper/scratch paint 0.2.0 prerelease.20190923154429
2019-09-23 12:38:24 -04:00
greenkeeper[bot] 5d1b1fb4c0 chore(package): update lockfile package-lock.json 2019-09-23 15:57:57 +00:00
greenkeeper[bot] 9265ee6323 chore(package): update scratch-paint to version 0.2.0-prerelease.20190923154429
Closes #5201
2019-09-23 15:57:51 +00:00
Ray Schamp 519256c50c Merge pull request #5194 from rschamp/dont-build-tags
Don’t push tags to gh-pages
2019-09-23 11:14:50 -04:00
Eric Rosenbaum 17324e5340 Merge pull request #5149 from ericrosenbaum/feature/limit-louder-rms
Limit louder effect with a max RMS
2019-09-23 10:52:17 -04:00
Ray Schamp 7d01844371 Merge pull request #5196 from rschamp/max-old-space-size
Allow Node to use more memory for old space
2019-09-20 14:35:40 -04:00
rschamp 745fa360c3 Actually use the tag for npm publish 2019-09-20 14:31:55 -04:00
rschamp 51fbae655e Use circle prefix in default NPM dist channel 2019-09-20 13:59:45 -04:00
rschamp c3119aae2c Set max-old-space-size for NPM publishing 2019-09-20 13:58:54 -04:00
rschamp bc1b787974 Allow Node to use more memory for old space
This flag essentially configures how much memory Node can use. If it’s too low, then Node processes may hang as Node spends time garbage collecting. Increasing it allows more memory to be used before garbage collection is necessary.  Travis VMs have 7.5GB of memory, so set the limit to just below that to avoid running out of memory completely.
2019-09-20 13:41:34 -04:00
rschamp e3cc730cd7 Make npm publishing do the thing 2019-09-20 13:12:12 -04:00
rschamp 46743c9bf8 Make git tagging do the thing 2019-09-20 13:12:12 -04:00
rschamp d573e34501 Add NPM tagging configuration 2019-09-20 13:12:12 -04:00
rschamp fac69fbcf4 Tag after publishing 2019-09-20 13:12:12 -04:00
rschamp 99f2ac586d Try out yaml inheritance in preparation for parallelization 2019-09-20 13:12:12 -04:00
rschamp 33dc1f7095 Remove circle branch from deploy list 2019-09-20 13:12:12 -04:00
rschamp 0707527800 Cache builds by commit not build number 2019-09-20 13:12:12 -04:00
rschamp f71e117e3a Cache git checkouts 2019-09-20 13:12:12 -04:00
rschamp d011aca301 Add NPM publish step 2019-09-20 13:12:12 -04:00
rschamp 2c3f3349b5 Add coverage report 2019-09-20 13:12:12 -04:00
rschamp 10eef7234f Add build artifact 2019-09-20 13:12:12 -04:00
rschamp 17154cefec Add back jest and build steps with reporting 2019-09-20 13:12:12 -04:00
rschamp e3d4d6e9d7 Circle doesn’t know about eslint warnings
They show up as errors
2019-09-20 13:12:12 -04:00
rschamp 89918a304f Try uploading lint results 2019-09-20 13:12:12 -04:00
rschamp 74b795ada8 Reformat 2019-09-20 13:12:12 -04:00
rschamp 40a3b857da Keep config-dependent environment vars in the config
NODE_ENV isn’t one we’d want to change dynamically, so keep it checked in to the config
2019-09-20 13:12:12 -04:00
rschamp 615927f3f2 Add initial CircleCI config 2019-09-20 13:12:12 -04:00
rschamp 3d1ad740dd Don’t push tags to gh-pages
These builds make our gh-pages branch too large for GitHub to handle.
2019-09-20 10:18:15 -04:00
DD Liu 4c76f654b7 Merge pull request #5189 from fsih/reupdateAssets
Reupdate watermelon a and basketball background with asset exported from sketch
2019-09-19 16:31:57 -04:00
DD Liu bd835adcd4 Reupdate watermelon a and basketball background with asset exported from sketch 2019-09-19 15:21:17 -04:00
Karishma Chadha 78e4cfce68 Merge pull request #5183 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20190918022946
Update scratch-vm to the latest version 🚀
2019-09-18 09:34:28 -07:00
Eric Rosenbaum deb5889a2c Merge pull request #5182 from LLK/greenkeeper/scratch-l10n-3.5.20190917223712
Update scratch-l10n to the latest version 🚀
2019-09-18 11:10:26 -04:00
greenkeeper[bot] 2030ad54bc chore(package): update lockfile package-lock.json 2019-09-18 02:32:41 +00:00
greenkeeper[bot] a95604008d chore(package): update scratch-vm to version 0.2.0-prerelease.20190918022946 2019-09-18 02:32:37 +00:00
greenkeeper[bot] bb21288cff chore(package): update lockfile package-lock.json 2019-09-17 22:39:32 +00:00
greenkeeper[bot] f31977489f chore(package): update scratch-l10n to version 3.5.20190917223712 2019-09-17 22:39:28 +00:00
Paul Kaplan f179587c2e Merge pull request #5180 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20190917163837
Update scratch-vm to the latest version 🚀
2019-09-17 14:07:04 -04:00
greenkeeper[bot] fa3d9c9e1e chore(package): update lockfile package-lock.json 2019-09-17 16:41:32 +00:00
greenkeeper[bot] 459eb2b767 chore(package): update scratch-vm to version 0.2.0-prerelease.20190917163837 2019-09-17 16:41:29 +00:00
Paul Kaplan 4e1c6afe02 Merge pull request #5178 from paulkaplan/skip-flakey
Skip flakey test
2019-09-17 12:35:56 -04:00
Paul Kaplan dc69ccea64 Skip flakey test 2019-09-17 12:18:03 -04:00
Paul Kaplan 03d9f8f2c6 Merge pull request #5169 from LLK/recording-glitch
Use a larger buffer size for recording to prevent glitching
2019-09-17 11:10:20 -04:00
Paul Kaplan 5d006cf677 Merge pull request #5175 from LLK/greenkeeper/chromedriver-77.0.0
Update chromedriver to the latest version 🚀
2019-09-17 10:54:50 -04:00
DD Liu 6c9657e453 Merge pull request #5172 from fsih/fixAndroidAssets
Fix assets that aren't working correctly in Android libraries
2019-09-17 10:24:24 -04:00
greenkeeper[bot] e82ec50e7b chore(package): update lockfile package-lock.json 2019-09-17 00:00:43 +00:00
greenkeeper[bot] 09ccbb4c01 chore(package): update chromedriver to version 77.0.0 2019-09-17 00:00:38 +00:00
Karishma Chadha e3b2ab22a6 Merge pull request #5170 from LLK/greenkeeper/scratch-vm-0.2.0-prerelease.20190916185023
Update scratch-vm to the latest version 🚀
2019-09-16 18:56:29 -04:00
DD Liu a2bc04e5d4 Fix assets that aren't working correctly in Android libraries 2019-09-16 16:27:55 -04:00
greenkeeper[bot] a4c81e55c0 chore(package): update lockfile package-lock.json 2019-09-16 18:57:52 +00:00
greenkeeper[bot] 2b571d9d83 chore(package): update scratch-vm to version 0.2.0-prerelease.20190916185023 2019-09-16 18:57:47 +00:00
Ray Schamp 6caaaf6f36 Merge pull request #5166 from rschamp/debug-chromedriver
Use not broken Travis VM distribution
2019-09-16 10:53:12 -04:00
Paul Kaplan 2b9550f3d9 Use single setState call instead of two 2019-09-13 14:05:07 -04:00
Paul Kaplan 94bb677fd8 Force meter and waveform to separate paint layer 2019-09-13 14:04:54 -04:00
Paul Kaplan 5b6f33e1a4 Use a larger buffer size for recording to prevent glitching 2019-09-13 12:46:25 -04:00
Paul Kaplan 32723a8876 Merge pull request #5114 from LLK/default-last-asset
Default blocks to last asset instead of first
2019-09-13 09:51:54 -04:00
rschamp a1fc068dd1 Un-hack 2019-09-12 14:50:32 -04:00
rschamp 225fc772f6 Bump travis dist version 2019-09-12 14:42:20 -04:00
Karishma Chadha 2a167ba775 Merge pull request #5165 from LLK/greenkeeper/scratch-render-0.1.0-prerelease.20190912174749
Update scratch-render to the latest version 🚀
2019-09-12 13:59:54 -04:00
greenkeeper[bot] 193717a1a9 chore(package): update lockfile package-lock.json 2019-09-12 17:49:51 +00:00
greenkeeper[bot] 4fc140ec2c chore(package): update scratch-render to version 0.1.0-prerelease.20190912174749 2019-09-12 17:49:47 +00:00
Ray Schamp 2ffac96579 Merge pull request #5163 from rschamp/bump-chromedriver
Ugly hack to keep being able to publish
2019-09-12 11:50:41 -04:00
rschamp bc57adc12c Ugly hack to keep being able to publish 2019-09-12 11:32:02 -04:00
Eric Rosenbaum 2df0c80b30 Simplify chunk counting logic 2019-09-10 10:35:19 -04:00
Eric Rosenbaum 6414985461 Calc tooLoud with chunkLevels, disable louder btn 2019-09-05 13:49:22 -04:00
Eric Rosenbaum 059d3f709b Use a waveshaper to hard limit samples 2019-09-04 11:01:10 -04:00
Eric Rosenbaum 26ca5da725 Limit louder effect with a max RMS 2019-09-03 18:13:45 -04:00
Paul Kaplan 7b9aed73f3 Fix multi-word matching in the blocks 2019-08-22 09:44:22 -04:00
Paul Kaplan 280f139ba2 Fix costume test 2019-08-21 16:05:29 -04:00
Paul Kaplan 79fe377f19 Update integration tests 2019-08-21 15:17:34 -04:00
Paul Kaplan b2dd3ed421 Default blocks to last asset instead of first 2019-08-21 14:56:46 -04:00
18 changed files with 897 additions and 605 deletions

No files matched your search

+207
View File
@@ -0,0 +1,207 @@
version: 2.1
aliases:
- &save_git_cache
save_cache:
paths:
- .git
key: v1-git-{{ .Revision }}
- &restore_git_cache
restore_cache:
keys:
- v1-git-{{ .Revision }}
- v1-git-
- &save_build_cache
save_cache:
paths:
- build
key: v1-build-{{ .Revision }}
- &restore_build_cache
restore_cache:
keys:
- v1-build-{{ .Revision }}
- &save_dist_cache
save_cache:
paths:
- dist
key: v1-dist-{{ .Revision }}
- &restore_dist_cache
restore_cache:
keys:
- v1-dist-{{ .Revision }}
- &save_npm_cache
save_cache:
paths:
- node_modules
key: v1-npm-{{ checksum "package-lock.json" }}
- &restore_npm_cache
restore_cache:
keys:
- v1-npm-{{ checksum "package-lock.json" }}
- v1-npm-
- &defaults
docker:
- image: circleci/node:8.16-browsers
working_directory: ~/repo
jobs:
setup:
<<: *defaults
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- run: npm install
- *save_git_cache
- *save_npm_cache
lint:
<<: *defaults
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- run:
name: Lint
command: npm run test:lint -- --quiet --output-file test-results/eslint/results.xml --format junit
- store_test_results:
path: test-results
unit:
<<: *defaults
environment:
JEST_JUNIT_OUTPUT_NAME: results.xml
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- run:
name: Unit
environment:
JEST_JUNIT_OUTPUT_DIR: test-results/unit
command: npm run test:unit -- --reporters="default" --reporters="jest-junit" --coverage --coverageReporters=text --coverageReporters=lcov
- store_artifacts:
path: coverage
- store_test_results:
path: test-results
build:
<<: *defaults
environment:
NODE_ENV: production
NODE_OPTIONS: --max-old-space-size=4000
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- run:
name: Build
command: npm run build
- *save_build_cache
- *save_dist_cache
store_build:
<<: *defaults
steps:
- *restore_build_cache
- store_artifacts:
path: build
store_dist:
<<: *defaults
steps:
- *restore_dist_cache
- store_artifacts:
path: dist
integration:
<<: *defaults
parallelism: 2
environment:
JEST_JUNIT_OUTPUT_NAME: results.txt
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- *restore_build_cache
- run:
name: Integration
environment:
JEST_JUNIT_OUTPUT_DIR: test-results/integration
command: |
export TESTFILES=$(circleci tests glob "test/integration/*.test.js" | circleci tests split --split-by=timings)
$(npm bin)/jest ${TESTFILES} --reporters="default" --reporters="jest-junit"
- store_test_results:
path: test-results
deploy-npm:
<<: *defaults
environment:
NODE_OPTIONS: --max-old-space-size=4000
steps:
- *restore_git_cache
- *restore_dist_cache
- checkout
- run: |
echo export RELEASE_VERSION="0.1.0-prerelease.$(date +'%Y%m%d%H%M%S')" >> $BASH_ENV
echo export NPM_TAG=circlelatest >> $BASH_ENV
if [ "$CIRCLE_BRANCH" == "master" ]
then echo export NPM_TAG=circlestable >> $BASH_ENV
fi
if [[ "$CIRCLE_BRANCH" == hotfix/* ]] # double brackets are important for matching the wildcard
then echo export NPM_TAG=circlehotfix >> $BASH_ENV
fi
- run: npm version --no-git-tag-version $RELEASE_VERSION
- run: |
npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN
npm publish --tag $NPM_TAG
- run: git tag $RELEASE_VERSION
- run: git push $CIRCLE_REPOSITORY_URL $RELEASE_VERSION
deploy-gh-pages:
<<: *defaults
steps:
- *restore_git_cache
- checkout
- *restore_npm_cache
- *restore_build_cache
- run: |
git config --global user.email $(git log --pretty=format:"%ae" -n1)
git config --global user.name $(git log --pretty=format:"%an" -n1)
- run: npm run deploy -- -e $CIRCLE_BRANCH
workflows:
version: 2
build-test-deploy:
jobs:
- setup
- lint:
requires:
- setup
- unit:
requires:
- setup
- build:
requires:
- setup
- integration:
requires:
- build
- store_build:
requires:
- build
- store_dist:
requires:
- build
# Disable deployment while running in parallel with Travis
# - deploy-npm:
# requires:
# - lint
# - unit
# - integration
# - build
# filters:
# branches:
# only:
# - master
# - develop
# - /^hotfix\/.*/
# - deploy-gh-pages:
# requires:
# - lint
# - unit
# - integration
# - build
+5 -2
View File
@@ -1,16 +1,18 @@
language: node_js
sudo: required
dist: trusty
dist: xenial
addons:
chrome: stable
node_js:
- 8
env:
global:
- CHROMEDRIVER_VERSION=LATEST
- NODE_ENV=production
- SMOKE_URL=https://llk.github.io/scratch-gui/$TRAVIS_PULL_REQUEST_BRANCH
- NODE_OPTIONS=--max-old-space-size=7250
- NPM_TAG=latest
- RELEASE_VERSION="0.1.0-prerelease.$(date +'%Y%m%d%H%M%S')"
- SMOKE_URL=https://llk.github.io/scratch-gui/$TRAVIS_PULL_REQUEST_BRANCH
cache:
directories:
- node_modules
@@ -74,6 +76,7 @@ deploy:
on:
all_branches: true
condition: $TRAVIS_EVENT_TYPE != cron && ! $TRAVIS_BRANCH =~ ^greenkeeper/
tags: false # Don't push tags to gh-pages
skip_cleanup: true
script: npm run deploy -- -x -e $TRAVIS_BRANCH -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git
- provider: script
+588 -522
View File
File diff suppressed because it is too large. Load diff
+8 -7
View File
@@ -44,7 +44,7 @@
"babel-loader": "^8.0.4",
"base64-loader": "1.0.0",
"bowser": "1.9.4",
"chromedriver": "76.0.0",
"chromedriver": "77.0.0",
"classnames": "2.2.6",
"computed-style-to-inline-style": "3.0.0",
"copy-webpack-plugin": "^4.5.1",
@@ -67,6 +67,7 @@
"immutable": "3.8.2",
"intl": "1.2.5",
"jest": "^21.0.0",
"jest-junit": "^7.0.0",
"js-base64": "2.4.9",
"keymirror": "0.1.1",
"lodash.bindall": "4.4.0",
@@ -106,14 +107,14 @@
"redux-mock-store": "^1.2.3",
"redux-throttle": "0.1.1",
"rimraf": "^2.6.1",
"scratch-audio": "0.1.0-prerelease.20190114210212",
"scratch-l10n": "3.5.20190910223701",
"scratch-blocks": "0.1.0-prerelease.1568071968",
"scratch-paint": "0.2.0-prerelease.20190822205009",
"scratch-render": "0.1.0-prerelease.20190905011937",
"scratch-audio": "0.1.0-prerelease.20190925183642",
"scratch-l10n": "3.6.20191008224547",
"scratch-blocks": "0.1.0-prerelease.1570730963",
"scratch-paint": "0.2.0-prerelease.20191010161144",
"scratch-render": "0.1.0-prerelease.20191001200908",
"scratch-storage": "1.3.2",
"scratch-svg-renderer": "0.2.0-prerelease.20190822202608",
"scratch-vm": "0.2.0-prerelease.20190904154449",
"scratch-vm": "0.2.0-prerelease.20191001145300",
"selenium-webdriver": "3.6.0",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
+3 -1
View File
@@ -20,8 +20,10 @@
border: 1px solid $ui-black-transparent;
border-radius: 5px;
padding: 3px;
/* Force these to be on their own render layer because they update often */
transform: translateZ(0);
}
.meter-container {
margin-right: 5px;
height: 180px;
@@ -265,6 +265,7 @@ const SoundEditor = props => (
onClick={props.onSlower}
/>
<IconButton
disabled={props.tooLoud}
className={classNames(styles.effectButton, styles.flipInRtl)}
img={louderIcon}
title={<FormattedMessage {...messages.louder} />}
@@ -340,6 +341,7 @@ SoundEditor.propTypes = {
onUndo: PropTypes.func.isRequired,
playhead: PropTypes.number,
setRef: PropTypes.func,
tooLoud: PropTypes.bool.isRequired,
trimEnd: PropTypes.number,
trimStart: PropTypes.number
};
+3 -3
View File
@@ -340,9 +340,9 @@ class Blocks extends React.Component {
const targetSounds = target.getSounds();
const dynamicBlocksXML = this.props.vm.runtime.getBlocksXML();
return makeToolboxXML(target.isStage, target.id, dynamicBlocksXML,
targetCostumes[0].name,
stageCostumes[0].name,
targetSounds.length > 0 ? targetSounds[0].name : ''
targetCostumes[targetCostumes.length - 1].name,
stageCostumes[stageCostumes.length - 1].name,
targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : ''
);
} catch {
return null;
+4 -4
View File
@@ -44,10 +44,10 @@ class RecordingStep extends React.Component {
alert(this.props.intl.formatMessage(messages.alertMsg)); // eslint-disable-line no-alert
}
handleLevelUpdate (level) {
this.setState({level});
if (this.props.recording) {
this.setState({levels: (this.state.levels || []).concat([level])});
}
this.setState({
level: level,
levels: this.props.recording ? (this.state.levels || []).concat([level]) : this.state.levels
});
}
handleRecord () {
this.audioRecorder.startRecording();
+12
View File
@@ -14,6 +14,8 @@ import log from '../lib/log.js';
const UNDO_STACK_SIZE = 99;
const MAX_RMS = 1.2;
class SoundEditor extends React.Component {
constructor (props) {
super(props);
@@ -265,6 +267,15 @@ class SoundEditor extends React.Component {
}
});
}
tooLoud () {
const numChunks = this.state.chunkLevels.length;
const startIndex = this.state.trimStart === null ?
0 : Math.floor(this.state.trimStart * numChunks);
const endIndex = this.state.trimEnd === null ?
numChunks - 1 : Math.ceil(this.state.trimEnd * numChunks);
const trimChunks = this.state.chunkLevels.slice(startIndex, endIndex);
return Math.max(...trimChunks) > MAX_RMS;
}
getUndoItem () {
return {
...this.copyCurrentBuffer(),
@@ -399,6 +410,7 @@ class SoundEditor extends React.Component {
name={this.props.name}
playhead={this.state.playhead}
setRef={this.setRef}
tooLoud={this.tooLoud()}
trimEnd={this.state.trimEnd}
trimStart={this.state.trimStart}
onChangeName={this.handleChangeName}
+14 -14
View File
@@ -1,12 +1,12 @@
import 'get-float-time-domain-data';
import getUserMedia from 'get-user-media-promise';
import SharedAudioContext from './shared-audio-context.js';
import {computeRMS} from './audio-util.js';
import {computeRMS, computeChunkedRMS} from './audio-util.js';
class AudioRecorder {
constructor () {
this.audioContext = new SharedAudioContext();
this.bufferLength = 1024;
this.bufferLength = 8192;
this.userMediaStream = null;
this.mediaStreamSource = null;
@@ -51,7 +51,7 @@ class AudioRecorder {
this.userMediaStream = userMediaStream;
this.mediaStreamSource = this.audioContext.createMediaStreamSource(userMediaStream);
this.sourceNode = this.audioContext.createGain();
this.scriptProcessorNode = this.audioContext.createScriptProcessor(this.bufferLength, 2, 2);
this.scriptProcessorNode = this.audioContext.createScriptProcessor(this.bufferLength, 1, 1);
this.scriptProcessorNode.onaudioprocess = processEvent => {
if (this.recording && !this.disposed) {
@@ -68,9 +68,9 @@ class AudioRecorder {
const update = () => {
if (this.disposed) return;
requestAnimationFrame(update);
this.analyserNode.getFloatTimeDomainData(dataArray);
onUpdate(computeRMS(dataArray));
requestAnimationFrame(update);
};
requestAnimationFrame(update);
@@ -83,7 +83,16 @@ class AudioRecorder {
}
stop () {
const chunkLevels = this.buffers.map(buffer => computeRMS(buffer));
const buffer = new Float32Array(this.buffers.length * this.bufferLength);
let offset = 0;
for (let i = 0; i < this.buffers.length; i++) {
const bufferChunk = this.buffers[i];
buffer.set(bufferChunk, offset);
offset += bufferChunk.length;
}
const chunkLevels = computeChunkedRMS(buffer);
const maxRMS = Math.max.apply(null, chunkLevels);
const threshold = maxRMS / 8;
@@ -105,15 +114,6 @@ class AudioRecorder {
trimEnd = 1;
}
const buffer = new Float32Array(this.buffers.length * this.bufferLength);
let offset = 0;
for (let i = 0; i < this.buffers.length; i++) {
const bufferChunk = this.buffers[i];
buffer.set(bufferChunk, offset);
offset += bufferChunk.length;
}
return {
levels: chunkLevels,
samples: buffer,
+1 -1
View File
@@ -52,7 +52,7 @@
},
{
"name": "Basketball 1",
"md5": "e494c4f44897d94e0541f7036a302449.svg",
"md5": "ae21eac3d1814aee1d37ae82ea287816.svg",
"type": "backdrop",
"tags": [
"sports",
+4 -4
View File
@@ -2563,7 +2563,7 @@
},
{
"name": "Dinosaur1-c",
"md5": "a2bb28d5ba55ba997bec63772437cecf.svg",
"md5": "78f7e20f0e187fdca81195e4cc134175.svg",
"type": "costume",
"tags": [
"animals",
@@ -10493,7 +10493,7 @@
},
{
"name": "Watermelon-a",
"md5": "26fecef75cf3b6e0d98bff5c06475036.svg",
"md5": "8736ecc2524895733534c888cd91fa1f.svg",
"type": "costume",
"tags": [
"food",
@@ -10511,7 +10511,7 @@
},
{
"name": "Watermelon-b",
"md5": "fbdaf4d1d349edd3ddf3a1c4528aa9ec.svg",
"md5": "1ed1c8b78eae2ee7422074d7f883031d.svg",
"type": "costume",
"tags": [
"food",
@@ -10528,7 +10528,7 @@
},
{
"name": "Watermelon-c",
"md5": "5976c10412306fc093c1d1930fa05119.svg",
"md5": "677738282686d2dcce35d731c3ddc043.svg",
"type": "costume",
"tags": [
"food",
+2 -2
View File
@@ -119,7 +119,7 @@ import pongResetScore from './steps/pong-reset-score.en.png';
import pongAddLineSprite from './steps/pong-add-line.en.gif';
import pongGameOver from './steps/pong-game-over.en.png';
// Imagine If
// Imagine a World
import imagineTypeWhatYouWant from './steps/imagine-type-what-you-want.en.png';
import imagineClickGreenFlag from './steps/imagine-click-green-flag.en.png';
import imagineChooseBackdrop from './steps/imagine-choose-backdrop.en.png';
@@ -292,7 +292,7 @@ const enImages = {
pongAddLineSprite: pongAddLineSprite,
pongGameOver: pongGameOver,
// Imagine If
// Imagine a World
imagineTypeWhatYouWant: imagineTypeWhatYouWant,
imagineClickGreenFlag: imagineClickGreenFlag,
imagineChooseBackdrop: imagineChooseBackdrop,
+25 -25
View File
@@ -42,8 +42,8 @@ import libraryMakeFly from './thumbnails/make-it-fly.jpg';
// Pong
import libraryPong from './thumbnails/pong.jpg';
// Imagine If
import libraryImagineIf from './thumbnails/imagine-if.jpg';
// Imagine a World
import libraryImagine from './thumbnails/imagine.jpg';
// Videos
import recordASound from './thumbnails/record-a-sound.jpg';
@@ -174,24 +174,24 @@ export default {
urlId: 'name'
},
'imagine-if': {
'imagine': {
name: (
<FormattedMessage
defaultMessage="Imagine If"
description="Name for the 'Imagine If' how-to"
id="gui.howtos.imagine-if"
defaultMessage="Imagine a World"
description="Name for the 'Imagine a World' how-to"
id="gui.howtos.imagine"
/>
),
tags: ['imagine-if'],
img: libraryImagineIf,
tags: ['imagine'],
img: libraryImagine,
steps: [{
video: 'imagine-if'
video: 'imagine'
}, {
title: (
<FormattedMessage
defaultMessage="Type What You Want to Say"
description="Step name for 'Type What You Want to Say' step"
id="gui.howtos.imagine-if.step_imagineTypeWhatYouWant"
id="gui.howtos.imagine.step_imagineTypeWhatYouWant"
/>
),
image: 'imagineTypeWhatYouWant'
@@ -200,7 +200,7 @@ export default {
<FormattedMessage
defaultMessage="Click the Green Flag to Start"
description="Step name for 'Click the Green Flag to Start' step"
id="gui.howtos.imagine-if.step_imagineClickGreenFlag"
id="gui.howtos.imagine.step_imagineClickGreenFlag"
/>
),
image: 'imagineClickGreenFlag'
@@ -209,7 +209,7 @@ export default {
<FormattedMessage
defaultMessage="Choose Any Backdrop"
description="Step name for 'Choose Any Backdrop' step"
id="gui.howtos.imagine-if.step_imagineChooseBackdrop"
id="gui.howtos.imagine.step_imagineChooseBackdrop"
/>
),
image: 'imagineChooseBackdrop'
@@ -218,7 +218,7 @@ export default {
<FormattedMessage
defaultMessage="Choose Any Sprite"
description="Step name for 'Choose Any Sprite' step"
id="gui.howtos.imagine-if.step_imagineChooseSprite"
id="gui.howtos.imagine.step_imagineChooseSprite"
/>
),
image: 'imagineChooseSprite'
@@ -227,7 +227,7 @@ export default {
<FormattedMessage
defaultMessage="Press the Space Key to Glide"
description="Step name for 'Press the Space Key to Glide' step"
id="gui.howtos.imagine-if.step_imagineFlyAround"
id="gui.howtos.imagine.step_imagineFlyAround"
/>
),
image: 'imagineFlyAround'
@@ -236,7 +236,7 @@ export default {
<FormattedMessage
defaultMessage="Choose Another Sprite"
description="Step name for 'Choose Another Sprite' step"
id="gui.howtos.imagine-if.step_imagineChooseAnotherSprite"
id="gui.howtos.imagine.step_imagineChooseAnotherSprite"
/>
),
image: 'imagineChooseAnotherSprite'
@@ -245,7 +245,7 @@ export default {
<FormattedMessage
defaultMessage="Move Left-Right"
description="Step name for 'Move Left-Right' step"
id="gui.howtos.imagine-if.step_imagineLeftRight"
id="gui.howtos.imagine.step_imagineLeftRight"
/>
),
image: 'imagineLeftRight'
@@ -254,7 +254,7 @@ export default {
<FormattedMessage
defaultMessage="Move Up-Down"
description="Step name for 'Move Up-Down' step"
id="gui.howtos.imagine-if.step_imagineUpDown"
id="gui.howtos.imagine.step_imagineUpDown"
/>
),
image: 'imagineUpDown'
@@ -263,7 +263,7 @@ export default {
<FormattedMessage
defaultMessage="Change Costumes"
description="Step name for 'Change Costumes' step"
id="gui.howtos.imagine-if.step_imagineChangeCostumes"
id="gui.howtos.imagine.step_imagineChangeCostumes"
/>
),
image: 'imagineChangeCostumes'
@@ -272,7 +272,7 @@ export default {
<FormattedMessage
defaultMessage="Glide to a Point"
description="Step name for 'Glide to a Point' step"
id="gui.howtos.imagine-if.step_imagineGlideToPoint"
id="gui.howtos.imagine.step_imagineGlideToPoint"
/>
),
image: 'imagineGlideToPoint'
@@ -281,7 +281,7 @@ export default {
<FormattedMessage
defaultMessage="Grow and Shrink"
description="Step name for 'Grow and Shrink' step"
id="gui.howtos.imagine-if.step_imagineGrowShrink"
id="gui.howtos.imagine.step_imagineGrowShrink"
/>
),
image: 'imagineGrowShrink'
@@ -290,7 +290,7 @@ export default {
<FormattedMessage
defaultMessage="Choose Another Backdrop"
description="Step name for 'Choose Another Backdrop' step"
id="gui.howtos.imagine-if.step_imagineChooseAnotherBackdrop"
id="gui.howtos.imagine.step_imagineChooseAnotherBackdrop"
/>
),
image: 'imagineChooseAnotherBackdrop'
@@ -299,7 +299,7 @@ export default {
<FormattedMessage
defaultMessage="Switch Backdrops"
description="Step name for 'Switch Backdrops' step"
id="gui.howtos.imagine-if.step_imagineSwitchBackdrops"
id="gui.howtos.imagine.step_imagineSwitchBackdrops"
/>
),
image: 'imagineSwitchBackdrops'
@@ -308,7 +308,7 @@ export default {
<FormattedMessage
defaultMessage="Add a Sound"
description="Step name for 'Add a Sound' step"
id="gui.howtos.imagine-if.step_imagineRecordASound"
id="gui.howtos.imagine.step_imagineRecordASound"
/>
),
image: 'imagineRecordASound'
@@ -317,7 +317,7 @@ export default {
<FormattedMessage
defaultMessage="Choose Your Sound"
description="Step name for 'Choose Your Sound' step"
id="gui.howtos.imagine-if.step_imagineChooseSound"
id="gui.howtos.imagine.step_imagineChooseSound"
/>
),
image: 'imagineChooseSound'
@@ -328,7 +328,7 @@ export default {
]
}
],
urlId: 'imagine-if'
urlId: 'imagine'
},
'Make-Music': {
+1 -1
View File
@@ -121,7 +121,7 @@ const videos = {
'pong-game': {
en: '8m48dv0ens'
},
'imagine-if': {
'imagine': {
en: '1ndh08yiso'
}
};
+5 -5
View File
@@ -3845,7 +3845,7 @@
{
"costumeName": "dinosaur1-c",
"baseLayerID": -1,
"baseLayerMD5": "a2bb28d5ba55ba997bec63772437cecf.svg",
"baseLayerMD5": "78f7e20f0e187fdca81195e4cc134175.svg",
"bitmapResolution": 1,
"rotationCenterX": 81,
"rotationCenterY": 91
@@ -15612,7 +15612,7 @@
},
{
"name": "Watermelon",
"md5": "26fecef75cf3b6e0d98bff5c06475036.svg",
"md5": "8736ecc2524895733534c888cd91fa1f.svg",
"type": "sprite",
"tags": [
"food",
@@ -15643,7 +15643,7 @@
{
"costumeName": "watermelon-a",
"baseLayerID": -1,
"baseLayerMD5": "26fecef75cf3b6e0d98bff5c06475036.svg",
"baseLayerMD5": "8736ecc2524895733534c888cd91fa1f.svg",
"bitmapResolution": 1,
"rotationCenterX": 40,
"rotationCenterY": 27
@@ -15651,7 +15651,7 @@
{
"costumeName": "watermelon-b",
"baseLayerID": -1,
"baseLayerMD5": "fbdaf4d1d349edd3ddf3a1c4528aa9ec.svg",
"baseLayerMD5": "1ed1c8b78eae2ee7422074d7f883031d.svg",
"bitmapResolution": 1,
"rotationCenterX": 22,
"rotationCenterY": 27
@@ -15659,7 +15659,7 @@
{
"costumeName": "watermelon-c",
"baseLayerID": -1,
"baseLayerMD5": "5976c10412306fc093c1d1930fa05119.svg",
"baseLayerMD5": "677738282686d2dcce35d731c3ddc043.svg",
"bitmapResolution": 1,
"rotationCenterX": 21,
"rotationCenterY": 15
+13 -14
View File
@@ -182,7 +182,8 @@ describe('Working with the blocks', () => {
// Rename the costume
await clickText('Costumes');
const el = await findByXpath("//input[@value='costume1']");
await clickText('costume2', scope.costumesTab);
const el = await findByXpath("//input[@value='costume2']");
await el.sendKeys('newname');
// Make sure it is updated in the block menu
@@ -197,7 +198,8 @@ describe('Working with the blocks', () => {
// Rename the costume
await clickText('Costumes');
const el = await findByXpath("//input[@value='costume1']");
await clickText('costume2', scope.costumesTab);
const el = await findByXpath("//input[@value='costume2']");
await el.sendKeys('<NewCostume>');
// Make sure it is updated in the block menu
@@ -209,17 +211,15 @@ describe('Working with the blocks', () => {
await clickText('Sound', scope.blocksTab);
});
// NOTE: This test describes the current behavior so that changes are not
// introduced inadvertly, but I know this is not the desired behavior
test('Adding costumes DOES NOT update the default costume name in the toolbox', async () => {
test('Adding costumes DOES update the default costume name in the toolbox', async () => {
await loadUri(uri);
// By default, costume1 is in the costume tab
// By default, costume2 is in the costume tab
await clickText('Looks', scope.blocksTab);
await driver.sleep(500); // Wait for scroll to finish
await clickText('costume1', scope.blocksTab);
await clickText('costume2', scope.blocksTab);
// Also check that adding a new costume does not update the list
// Also check that adding a new costume does update the list
await clickText('Costumes');
const el = await findByXpath('//button[@aria-label="Choose a Costume"]');
await driver.actions().mouseMove(el)
@@ -227,14 +227,13 @@ describe('Working with the blocks', () => {
await driver.sleep(500); // Wait for thermometer menu to come up
await clickXpath('//button[@aria-label="Paint"]');
await clickText('costume3', scope.costumesTab);
// Check that the menu has not been updated
// Check that the menu has been updated
await clickText('Code');
await clickText('costume1', scope.blocksTab);
await clickText('costume3', scope.blocksTab);
});
// NOTE: This test describes the current behavior so that changes are not
// introduced inadvertly, but I know this is not the desired behavior
test('Adding a sound DOES NOT update the default sound name in the toolbox', async () => {
// Skipped because it was flakey on travis, but seems to run locally ok
test.skip('Adding a sound DOES update the default sound name in the toolbox', async () => {
await loadUri(uri);
await clickText('Sounds');
await clickXpath('//button[@aria-label="Choose a Sound"]');
@@ -242,7 +241,7 @@ describe('Working with the blocks', () => {
await clickText('Code');
await clickText('Sound', scope.blocksTab);
await driver.sleep(500); // Wait for scroll to finish
await clickText('Meow', scope.blocksTab); // Meow, not A Bass
await clickText('A\u00A0Bass', scope.blocksTab); // Need &nbsp; for block text
});
// Regression test for switching between editor/player causing toolbox to stop updating