Skip to content

Generalized persistence #903

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Sep 16, 2019
Merged
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
7a21285
persistence initial commit
alexcjohnson Sep 1, 2019
b737a3f
flip the loop in recordUiEdit
alexcjohnson Sep 5, 2019
6509121
clarify persistence getProps usage
alexcjohnson Sep 5, 2019
42428a6
update persistence comment for nested prop IDs
alexcjohnson Sep 5, 2019
78df979
allow multiple pieces of persistence for one prop
alexcjohnson Sep 5, 2019
83b8cd3
fallback if web store isn't available, or is full from the start
alexcjohnson Sep 6, 2019
cb179c9
fix missed props propagation
alexcjohnson Sep 11, 2019
b4ebb51
clean up package.json and upgrade to babel 7
alexcjohnson Sep 11, 2019
3b56686
remove obsolete dash-renderer package test script
alexcjohnson Sep 11, 2019
5ff00cf
unit test (and fix bugs) storage & fallbacks
alexcjohnson Sep 11, 2019
690b0a3
Merge branch 'dev' into persistence
alexcjohnson Sep 11, 2019
3669df6
cleaner error when storage fills up
alexcjohnson Sep 11, 2019
15ca0e5
get rid of no-undefined eslint rule
alexcjohnson Sep 11, 2019
c9230f5
renderer persistence changelog
alexcjohnson Sep 11, 2019
abde83f
integration tests - and a fix - for persistence
alexcjohnson Sep 12, 2019
4b11f07
prevent ambiguous double-installation of the rest of core on CI
alexcjohnson Sep 12, 2019
0626ea9
linux flavor of sed?
alexcjohnson Sep 12, 2019
ba8d5ba
update build to corejs@3
alexcjohnson Sep 13, 2019
09b9393
store different persisted values for each persistence id
alexcjohnson Sep 16, 2019
5fa4d55
more "random" new column name
alexcjohnson Sep 16, 2019
53ab7c5
lint test_persistence
alexcjohnson Sep 16, 2019
118547f
fix unit tests and error handler for multi-ID persistence
alexcjohnson Sep 16, 2019
130a857
Merge branch 'dev' into persistence
alexcjohnson Sep 16, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -55,10 +55,14 @@ jobs:
pylint tests/unit tests/integration/devtools tests/integration/renderer tests/integration/dash_assets -d all -e C0410,C0411,C0412,C0413,W0109
cd dash-renderer && npm install --ignore-scripts && npm run lint:test && npm run format:test
- run:
name: 🔎 Unit Tests
name: 🐍 Python Unit Tests
command: |
. venv/bin/activate
PYTHONPATH=~/dash/tests/assets pytest tests/unit
- run:
name: ☕ JS Unit Tests
command: |
cd dash-renderer && npm run test:js

"lint-unit-36":
<<: *lint-unit
@@ -92,6 +96,7 @@ jobs:
command: |
sudo pip install --upgrade virtualenv
python -m venv venv || virtualenv venv && . venv/bin/activate
sed -i '/dash/d' requires-install.txt
pip install -e . -r requires-install.txt -r requires-dev.txt -r requires-testing.txt --quiet
- save_cache:
key: dep-{{ checksum "ver.txt" }}-{{ checksum "requires-dev.txt" }}-{{ checksum "requires-install.txt" }}-{{ checksum "requires-testing.txt" }}
@@ -152,7 +157,7 @@ jobs:
name: ️️🏗️ build misc
command: |
. venv/bin/activate && pip install --upgrade -e . --quiet && mkdir packages
git clone --depth 1 https://github.com/plotly/dash-table.git
git clone --depth 1 -b persistence https://github.com/plotly/dash-table.git
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@byronz there seems to be something funny about how these built packages get picked up by the next step. The first time I ran these tests it looked like they got the old dash-table, but then running them again everything worked.

Perhaps something funny about having the two steps build-misc and build-core both writing to the same directory packages? Maybe they should each write to a separate dir, and we have the test job either recombine them into one before installing them, or just install from the two separate dirs?

cd dash-table && npm install --ignore-scripts && npm run build && python setup.py sdist && mv dist/* ../packages/ && cd ..
git clone --depth 1 https://github.com/plotly/dash-html-components.git
cd dash-html-components && npm install --ignore-scripts && npm run build && python setup.py sdist && mv dist/* ../packages/ && cd ..
@@ -262,4 +267,4 @@ workflows:
- "test-27":
requires:
- build-core-27
- build-misc-27
- build-misc-27
15 changes: 4 additions & 11 deletions dash-renderer/.babelrc
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
{
"presets": ["es2015", "react", "stage-2"],
"env": {
"development": {
"presets": ["es2015", "react", "stage-2"],
"plugins": [
["transform-es2015-modules-commonjs-simple", {
"noMangle": true
}]
]
}
}
"presets": [["@babel/preset-env", {
"useBuiltIns": "usage",
"corejs": 3
}], "@babel/preset-react"]
}
3 changes: 1 addition & 2 deletions dash-renderer/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -110,7 +110,6 @@
"no-sequences": ["error"],
"no-shadow": ["off"],
"no-throw-literal": ["error"],
"no-undefined": ["error"],
"no-unused-expressions": ["error"],
"no-use-before-define": ["error", "nofunc"],
"no-useless-call": ["error"],
@@ -147,4 +146,4 @@
"no-underscore-dangle": ["off"],
"no-useless-escape": ["off"]
}
}
}
3 changes: 3 additions & 0 deletions dash-renderer/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).

## Unreleased

### Added
- [#903](https://github.com/plotly/dash/pull/903) enables props edited by the user to persist across recreating the component or reloading the page. Components need to define three new props: `persistence`, `persisted_props`, and `persistence_type` as described in the lead comment of `src/persistence.js`. App developers then enable this behavior by, in the simplest case, setting `persistence: true` on the component. First use case is table, see [dash-table#566](https://github.com/plotly/dash-table/pull/566)

### Fixed
- Reduced about 55% of the dash-renderer packages size on **PyPI** by removing the source maps. To do more advanced debugging, the source maps needs to be generated from source code with `npm run build:local` and pip install in editable mode, i.e. `pip install -e .` [#910](https://github.com/plotly/dash/pull/910)

181 changes: 181 additions & 0 deletions dash-renderer/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html

module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,

// Stop running tests after the first failure
// bail: false,

// Respect "browser" field in package.json when resolving modules
// browser: false,

// The directory where Jest should store its cached dependency information
// cacheDirectory: "/var/folders/8m/wrr89jfx5kg5xhp7q2127bcc0000gn/T/jest_dx",

// Automatically clear mock calls and instances between every test
clearMocks: true,

// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: false,

// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: null,

// The directory where Jest should output its coverage files
coverageDirectory: "coverage",

// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],

// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],

// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: null,

// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,

// Force coverage collection from ignored files usin a array of glob patterns
// forceCoverageMatch: [],

// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: null,

// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: null,

// A set of global variables that need to be available in all test environments
// globals: {},

// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],

// An array of file extensions your modules use
// moduleFileExtensions: [
// "js",
// "json",
// "jsx",
// "node"
// ],

// A map from regular expressions to module names that allow to stub out resources with a single module
moduleNameMapper: {
"\\.(css|less)$": "identity-obj-proxy"
},

// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],

// Activates notifications for test results
// notify: false,

// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "always",

// A preset that is used as a base for Jest's configuration
// preset: null,

// Run tests from one or more projects
// projects: null,

// Use this configuration option to add custom reporters to Jest
// reporters: undefined,

// Automatically reset mock state between every test
// resetMocks: false,

// Reset the module registry before running each individual test
// resetModules: false,

// A path to a custom resolver
// resolver: null,

// Automatically restore mock state between every test
// restoreMocks: false,

// The root directory that Jest should scan for tests and modules within
// rootDir: null,

// A list of paths to directories that Jest should use to search for files in
roots: [
"<rootDir>/tests"
],

// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",

// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: ['<rootDir>/tests/setupTests.js'],

// The path to a module that runs some code to configure or set up the testing framework before each test
// setupTestFrameworkScriptFile: null,

// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],

// The test environment that will be used for testing
testEnvironment: "jsdom",

// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},

// Adds a location field to test results
// testLocationInResults: false,

// The glob patterns Jest uses to detect test files
testMatch: [
"**/?(*.)+(spec|test).js?(x)"
],

// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "/node_modules/"
// ],

// The regexp pattern Jest uses to detect test files
// testRegex: "",

// This option allows the use of a custom results processor
// testResultsProcessor: null,

// This option allows use of a custom test runner
// testRunner: "jasmine2",

// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",

// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",

// A map from regular expressions to paths to transformers
// transform: null,

// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "/node_modules/"
// ],

// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,

// Indicates whether each individual test should be reported during the run
// verbose: null,

// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],

// Whether to use watchman for file crawling
// watchman: true,
};
Loading