steppy-dev 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- steppy_dev-0.3.0/.claude/launch.json +41 -0
- steppy_dev-0.3.0/.dockerignore +54 -0
- steppy_dev-0.3.0/.gitattributes +22 -0
- steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/bug_report.yml +77 -0
- steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- steppy_dev-0.3.0/.github/ISSUE_TEMPLATE/feature_request.yml +41 -0
- steppy_dev-0.3.0/.github/pull_request_template.md +13 -0
- steppy_dev-0.3.0/.github/workflows/ci.yml +218 -0
- steppy_dev-0.3.0/.github/workflows/release.yml +200 -0
- steppy_dev-0.3.0/.github/workflows/steppy-e2e.yml +264 -0
- steppy_dev-0.3.0/.gitignore +110 -0
- steppy_dev-0.3.0/CHANGELOG.md +862 -0
- steppy_dev-0.3.0/CLAUDE.md +231 -0
- steppy_dev-0.3.0/CODE_OF_CONDUCT.md +26 -0
- steppy_dev-0.3.0/CONTRIBUTING.md +224 -0
- steppy_dev-0.3.0/Dockerfile +55 -0
- steppy_dev-0.3.0/LICENSE +202 -0
- steppy_dev-0.3.0/NEW_FEATURE.md +322 -0
- steppy_dev-0.3.0/NOTICE +13 -0
- steppy_dev-0.3.0/PKG-INFO +1335 -0
- steppy_dev-0.3.0/PROMPT_EXAMPLE.md +410 -0
- steppy_dev-0.3.0/README.md +1290 -0
- steppy_dev-0.3.0/SECURITY.md +271 -0
- steppy_dev-0.3.0/STEPPY-REFERENCE.md +556 -0
- steppy_dev-0.3.0/config.yaml +316 -0
- steppy_dev-0.3.0/contracts/bundle-manifest.schema.json +417 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/cases.json +485 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/create-invoice.en.json +61 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/create-invoice.fr.json +61 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/remove-inactive-customers.en.json +76 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/remove-inactive-customers.fr.json +76 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/send-invoice.en.json +48 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/send-invoice.fr.json +48 -0
- steppy_dev-0.3.0/contracts/fixtures/tours/valid/tours.manifest.json +78 -0
- steppy_dev-0.3.0/contracts/report.schema.json +859 -0
- steppy_dev-0.3.0/contracts/tour.schema.json +213 -0
- steppy_dev-0.3.0/contracts/tours-manifest.schema.json +158 -0
- steppy_dev-0.3.0/credentials.yaml.example +33 -0
- steppy_dev-0.3.0/docs/brand/README.md +33 -0
- steppy_dev-0.3.0/docs/brand/steppy-icon.svg +1 -0
- steppy_dev-0.3.0/docs/brand/steppy-mark-dark.svg +1 -0
- steppy_dev-0.3.0/docs/brand/steppy-mark.svg +1 -0
- steppy_dev-0.3.0/docs/design/in-app-tours.md +371 -0
- steppy_dev-0.3.0/docs/tours.md +1390 -0
- steppy_dev-0.3.0/fixtures/demo-guide/create_screenshots.py +49 -0
- steppy_dev-0.3.0/fixtures/demo-guide/e2e/scenarios/editor/invoices.md +27 -0
- steppy_dev-0.3.0/fixtures/demo-guide/e2e/scenarios/editor/onboarding.md +27 -0
- steppy_dev-0.3.0/fixtures/demo-guide/package-lock.json +567 -0
- steppy_dev-0.3.0/fixtures/demo-guide/package.json +10 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/guide.json +140 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-01.json +1 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-01.png +0 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-02.json +1 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/invoices/step-02.png +0 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-01.json +1 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-01.png +0 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-02.json +1 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/onboarding/step-02.png +0 -0
- steppy_dev-0.3.0/fixtures/demo-guide/public/assets/editor/steppy-player.js +5419 -0
- steppy_dev-0.3.0/fixtures/demo-guide/steppy.guide.config.static.ts +46 -0
- steppy_dev-0.3.0/fixtures/demo-guide/steppy.guide.config.ts +54 -0
- steppy_dev-0.3.0/fixtures/tour-demo/README.md +95 -0
- steppy_dev-0.3.0/fixtures/tour-demo/app/app.css +291 -0
- steppy_dev-0.3.0/fixtures/tour-demo/app/app.js +550 -0
- steppy_dev-0.3.0/fixtures/tour-demo/app/index.html +52 -0
- steppy_dev-0.3.0/fixtures/tour-demo/project/app-assets/.gitkeep +0 -0
- steppy_dev-0.3.0/fixtures/tour-demo/project/config.yaml +40 -0
- steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--create-invoice.md +89 -0
- steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--remove-inactive-customers.md +89 -0
- steppy_dev-0.3.0/fixtures/tour-demo/project/scenarios/editor--send-invoice.md +50 -0
- steppy_dev-0.3.0/fixtures/tour-demo/serve.py +350 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/README.md +44 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/.gitignore +44 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/angular.json +83 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/package-lock.json +7917 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/package.json +36 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/public/i18n/en.json +37 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/public/i18n/fr.json +37 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.config.ts +45 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.routes.ts +19 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/app.ts +118 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/customers.ts +101 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/demo-config.ts +49 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoice-detail.ts +45 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoice-list.ts +105 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/app/invoices.ts +57 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/index.html +13 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/main.ts +23 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/src/styles.css +144 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/tsconfig.app.json +15 -0
- steppy_dev-0.3.0/fixtures/tour-demo-angular/app/tsconfig.json +30 -0
- steppy_dev-0.3.0/hatch_build.py +61 -0
- steppy_dev-0.3.0/packages/angular/LICENSE +202 -0
- steppy_dev-0.3.0/packages/angular/NOTICE +6 -0
- steppy_dev-0.3.0/packages/angular/README.md +129 -0
- steppy_dev-0.3.0/packages/angular/angular.json +50 -0
- steppy_dev-0.3.0/packages/angular/ng-package.json +8 -0
- steppy_dev-0.3.0/packages/angular/package-lock.json +9169 -0
- steppy_dev-0.3.0/packages/angular/package.json +49 -0
- steppy_dev-0.3.0/packages/angular/src/config.ts +51 -0
- steppy_dev-0.3.0/packages/angular/src/navigate.spec.ts +70 -0
- steppy_dev-0.3.0/packages/angular/src/navigate.ts +49 -0
- steppy_dev-0.3.0/packages/angular/src/overlay.ts +68 -0
- steppy_dev-0.3.0/packages/angular/src/provide.ts +33 -0
- steppy_dev-0.3.0/packages/angular/src/public-api.ts +21 -0
- steppy_dev-0.3.0/packages/angular/src/real-overlay.spec.ts +39 -0
- steppy_dev-0.3.0/packages/angular/src/testing/fake-overlay.ts +137 -0
- steppy_dev-0.3.0/packages/angular/src/testing/zone-providers.ts +4 -0
- steppy_dev-0.3.0/packages/angular/src/testing/zone-setup.ts +3 -0
- steppy_dev-0.3.0/packages/angular/src/tour-start.directive.spec.ts +30 -0
- steppy_dev-0.3.0/packages/angular/src/tour-start.directive.ts +33 -0
- steppy_dev-0.3.0/packages/angular/src/tours.component.spec.ts +212 -0
- steppy_dev-0.3.0/packages/angular/src/tours.component.ts +182 -0
- steppy_dev-0.3.0/packages/angular/src/tours.service.spec.ts +153 -0
- steppy_dev-0.3.0/packages/angular/src/tours.service.ts +187 -0
- steppy_dev-0.3.0/packages/angular/src/tours.zone.spec.ts +119 -0
- steppy_dev-0.3.0/packages/angular/tsconfig.json +26 -0
- steppy_dev-0.3.0/packages/angular/tsconfig.lib.json +11 -0
- steppy_dev-0.3.0/packages/angular/tsconfig.lib.prod.json +9 -0
- steppy_dev-0.3.0/packages/angular/tsconfig.spec.json +8 -0
- steppy_dev-0.3.0/packages/player/LICENSE +202 -0
- steppy_dev-0.3.0/packages/player/NOTICE +9 -0
- steppy_dev-0.3.0/packages/player/README.md +191 -0
- steppy_dev-0.3.0/packages/player/THIRD_PARTY_LICENSES.txt +158 -0
- steppy_dev-0.3.0/packages/player/dev/fixture-manifest.json +240 -0
- steppy_dev-0.3.0/packages/player/dev/index.html +199 -0
- steppy_dev-0.3.0/packages/player/package-lock.json +2085 -0
- steppy_dev-0.3.0/packages/player/package.json +72 -0
- steppy_dev-0.3.0/packages/player/schema/README.md +19 -0
- steppy_dev-0.3.0/packages/player/scripts/check-pack.ts +51 -0
- steppy_dev-0.3.0/packages/player/scripts/check-tour-size.ts +45 -0
- steppy_dev-0.3.0/packages/player/scripts/emit-json-schema.ts +20 -0
- steppy_dev-0.3.0/packages/player/src/cursor/animator.ts +398 -0
- steppy_dev-0.3.0/packages/player/src/cursor/legacy-iife.ts +147 -0
- steppy_dev-0.3.0/packages/player/src/cursor/types.ts +67 -0
- steppy_dev-0.3.0/packages/player/src/i18n/ui-strings.ts +144 -0
- steppy_dev-0.3.0/packages/player/src/index.ts +30 -0
- steppy_dev-0.3.0/packages/player/src/interaction/positioning.ts +44 -0
- steppy_dev-0.3.0/packages/player/src/manifest/content.ts +46 -0
- steppy_dev-0.3.0/packages/player/src/manifest/index.ts +23 -0
- steppy_dev-0.3.0/packages/player/src/manifest/parse.ts +104 -0
- steppy_dev-0.3.0/packages/player/src/manifest/schema.ts +347 -0
- steppy_dev-0.3.0/packages/player/src/steppy-guide.ts +983 -0
- steppy_dev-0.3.0/packages/player/src/templates/base-styles.ts +347 -0
- steppy_dev-0.3.0/packages/player/src/templates/controls.ts +98 -0
- steppy_dev-0.3.0/packages/player/src/templates/index.ts +43 -0
- steppy_dev-0.3.0/packages/player/src/templates/inline.ts +81 -0
- steppy_dev-0.3.0/packages/player/src/templates/overlay.ts +38 -0
- steppy_dev-0.3.0/packages/player/src/templates/sidebar.ts +303 -0
- steppy_dev-0.3.0/packages/player/src/templates/types.ts +91 -0
- steppy_dev-0.3.0/packages/player/src/tour/api.ts +61 -0
- steppy_dev-0.3.0/packages/player/src/tour/contract.ts +60 -0
- steppy_dev-0.3.0/packages/player/src/tour/dom.ts +104 -0
- steppy_dev-0.3.0/packages/player/src/tour/engine.ts +307 -0
- steppy_dev-0.3.0/packages/player/src/tour/events.ts +34 -0
- steppy_dev-0.3.0/packages/player/src/tour/host.ts +699 -0
- steppy_dev-0.3.0/packages/player/src/tour/index.ts +32 -0
- steppy_dev-0.3.0/packages/player/src/tour/layer.ts +49 -0
- steppy_dev-0.3.0/packages/player/src/tour/loader.ts +289 -0
- steppy_dev-0.3.0/packages/player/src/tour/resolver.ts +109 -0
- steppy_dev-0.3.0/packages/player/src/tour/routes.ts +113 -0
- steppy_dev-0.3.0/packages/player/src/tour/signature.ts +64 -0
- steppy_dev-0.3.0/packages/player/src/tour/storage.ts +86 -0
- steppy_dev-0.3.0/packages/player/src/tour/strings.ts +139 -0
- steppy_dev-0.3.0/packages/player/src/tour/styles.ts +238 -0
- steppy_dev-0.3.0/packages/player/src/tour/templates.ts +135 -0
- steppy_dev-0.3.0/packages/player/src/tour/tracker.ts +193 -0
- steppy_dev-0.3.0/packages/player/src/tour/triggers.ts +197 -0
- steppy_dev-0.3.0/packages/player/src/tour/validate.ts +433 -0
- steppy_dev-0.3.0/packages/player/src/ui/markdown.ts +129 -0
- steppy_dev-0.3.0/packages/player/src/ui/names.ts +19 -0
- steppy_dev-0.3.0/packages/player/src/ui/placement.ts +193 -0
- steppy_dev-0.3.0/packages/player/src/ui/strings.ts +66 -0
- steppy_dev-0.3.0/packages/player/src/ui/tokens.ts +64 -0
- steppy_dev-0.3.0/packages/player/src/video/easing.ts +92 -0
- steppy_dev-0.3.0/packages/player/src/video/iife.ts +49 -0
- steppy_dev-0.3.0/packages/player/src/video/stage.ts +511 -0
- steppy_dev-0.3.0/packages/player/src/video/timeline.ts +633 -0
- steppy_dev-0.3.0/packages/player/test/animator.test.ts +207 -0
- steppy_dev-0.3.0/packages/player/test/bridge-from-python.test.ts +244 -0
- steppy_dev-0.3.0/packages/player/test/component.test.ts +730 -0
- steppy_dev-0.3.0/packages/player/test/fixtures.ts +88 -0
- steppy_dev-0.3.0/packages/player/test/markdown.test.ts +130 -0
- steppy_dev-0.3.0/packages/player/test/positioning.test.ts +58 -0
- steppy_dev-0.3.0/packages/player/test/schema.test.ts +475 -0
- steppy_dev-0.3.0/packages/player/test/setup.ts +8 -0
- steppy_dev-0.3.0/packages/player/test/templates.test.ts +430 -0
- steppy_dev-0.3.0/packages/player/test/tour/boundaries.test.ts +68 -0
- steppy_dev-0.3.0/packages/player/test/tour/engine.test.ts +211 -0
- steppy_dev-0.3.0/packages/player/test/tour/golden.test.ts +88 -0
- steppy_dev-0.3.0/packages/player/test/tour/helpers.ts +121 -0
- steppy_dev-0.3.0/packages/player/test/tour/host.test.ts +546 -0
- steppy_dev-0.3.0/packages/player/test/tour/loader.test.ts +259 -0
- steppy_dev-0.3.0/packages/player/test/tour/resolver-tracker.test.ts +185 -0
- steppy_dev-0.3.0/packages/player/test/tour/routes.test.ts +104 -0
- steppy_dev-0.3.0/packages/player/test/tour/small-modules.test.ts +182 -0
- steppy_dev-0.3.0/packages/player/test/tour/validate.test.ts +129 -0
- steppy_dev-0.3.0/packages/player/test/ui/guide-markdown-parity.test.ts +139 -0
- steppy_dev-0.3.0/packages/player/test/ui/guide-styles-stable.test.ts +23 -0
- steppy_dev-0.3.0/packages/player/test/ui/legacy-markdown.ts +62 -0
- steppy_dev-0.3.0/packages/player/test/ui/legacy-placement.ts +64 -0
- steppy_dev-0.3.0/packages/player/test/ui/legacy-ui-strings.ts +109 -0
- steppy_dev-0.3.0/packages/player/test/ui/markdown-policy.test.ts +83 -0
- steppy_dev-0.3.0/packages/player/test/ui/placement.test.ts +127 -0
- steppy_dev-0.3.0/packages/player/test/ui/strings.test.ts +80 -0
- steppy_dev-0.3.0/packages/player/test/video-stage.test.ts +334 -0
- steppy_dev-0.3.0/packages/player/test/video-timeline.test.ts +596 -0
- steppy_dev-0.3.0/packages/player/tsconfig.json +24 -0
- steppy_dev-0.3.0/packages/player/tsconfig.types.json +15 -0
- steppy_dev-0.3.0/packages/player/vite.config.ts +37 -0
- steppy_dev-0.3.0/packages/player/vite.iife.config.ts +33 -0
- steppy_dev-0.3.0/packages/player/vite.tour.config.ts +62 -0
- steppy_dev-0.3.0/packages/player/vite.video.config.ts +35 -0
- steppy_dev-0.3.0/packages/react/README.md +75 -0
- steppy_dev-0.3.0/packages/react/package-lock.json +1611 -0
- steppy_dev-0.3.0/packages/react/package.json +41 -0
- steppy_dev-0.3.0/packages/react/src/index.ts +197 -0
- steppy_dev-0.3.0/packages/react/src/shims.d.ts +4 -0
- steppy_dev-0.3.0/packages/react/test/component.test.ts +57 -0
- steppy_dev-0.3.0/packages/react/tsconfig.build.json +10 -0
- steppy_dev-0.3.0/packages/react/tsconfig.json +22 -0
- steppy_dev-0.3.0/packages/react/vite.config.ts +35 -0
- steppy_dev-0.3.0/packages/steppy/index.d.ts +67 -0
- steppy_dev-0.3.0/packages/steppy/index.js +8 -0
- steppy_dev-0.3.0/packages/steppy/index.ts +218 -0
- steppy_dev-0.3.0/packages/steppy/package.json +19 -0
- steppy_dev-0.3.0/packages/steppy/tsconfig.json +12 -0
- steppy_dev-0.3.0/packages/vue/README.md +67 -0
- steppy_dev-0.3.0/packages/vue/package-lock.json +1729 -0
- steppy_dev-0.3.0/packages/vue/package.json +38 -0
- steppy_dev-0.3.0/packages/vue/src/index.ts +136 -0
- steppy_dev-0.3.0/packages/vue/src/shims.d.ts +4 -0
- steppy_dev-0.3.0/packages/vue/test/component.test.ts +47 -0
- steppy_dev-0.3.0/packages/vue/tsconfig.build.json +10 -0
- steppy_dev-0.3.0/packages/vue/tsconfig.json +22 -0
- steppy_dev-0.3.0/packages/vue/vite.config.ts +29 -0
- steppy_dev-0.3.0/pyproject.toml +133 -0
- steppy_dev-0.3.0/scenarios/admin--create-project.md +58 -0
- steppy_dev-0.3.0/scenarios/admin--edit-settings.md +85 -0
- steppy_dev-0.3.0/scenarios/cross--task-approval.md +74 -0
- steppy_dev-0.3.0/scenarios/editor--manage-items.md +77 -0
- steppy_dev-0.3.0/seed/base.py +150 -0
- steppy_dev-0.3.0/skills/steppy-app-tours/SKILL.md +448 -0
- steppy_dev-0.3.0/skills/steppy-ci-report/SKILL.md +567 -0
- steppy_dev-0.3.0/skills/steppy-scenario-author/SKILL.md +2176 -0
- steppy_dev-0.3.0/skills/steppy-template/SKILL.md +676 -0
- steppy_dev-0.3.0/src/steppy/__init__.py +9 -0
- steppy_dev-0.3.0/src/steppy/__main__.py +13 -0
- steppy_dev-0.3.0/src/steppy/_cli_common.py +183 -0
- steppy_dev-0.3.0/src/steppy/_docker/Dockerfile.installed +53 -0
- steppy_dev-0.3.0/src/steppy/_parallel/__init__.py +7 -0
- steppy_dev-0.3.0/src/steppy/_parallel/compose.py +349 -0
- steppy_dev-0.3.0/src/steppy/_parallel/event_bus.py +418 -0
- steppy_dev-0.3.0/src/steppy/_parallel/failures.py +267 -0
- steppy_dev-0.3.0/src/steppy/_parallel/fingerprint.py +141 -0
- steppy_dev-0.3.0/src/steppy/_parallel/image.py +380 -0
- steppy_dev-0.3.0/src/steppy/_parallel/lastfailed.py +125 -0
- steppy_dev-0.3.0/src/steppy/_parallel/lifecycle.py +90 -0
- steppy_dev-0.3.0/src/steppy/_parallel/preauth.py +109 -0
- steppy_dev-0.3.0/src/steppy/_parallel/progress.py +101 -0
- steppy_dev-0.3.0/src/steppy/_parallel/queue.py +385 -0
- steppy_dev-0.3.0/src/steppy/_parallel/renderer.py +489 -0
- steppy_dev-0.3.0/src/steppy/_parallel/retry.py +316 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/THIRD_PARTY_LICENSES.txt +158 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/__init__.py +100 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-cursor-legacy.js +2 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-cursor-legacy.js.map +1 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-player.js +5419 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-player.js.map +1 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-video.js +472 -0
- steppy_dev-0.3.0/src/steppy/_player_bundle/steppy-video.js.map +1 -0
- steppy_dev-0.3.0/src/steppy/_templating.py +117 -0
- steppy_dev-0.3.0/src/steppy/assertions.py +251 -0
- steppy_dev-0.3.0/src/steppy/auth.py +493 -0
- steppy_dev-0.3.0/src/steppy/build.py +2798 -0
- steppy_dev-0.3.0/src/steppy/build_models.py +669 -0
- steppy_dev-0.3.0/src/steppy/buildid.py +134 -0
- steppy_dev-0.3.0/src/steppy/bundle/__init__.py +47 -0
- steppy_dev-0.3.0/src/steppy/bundle/archive.py +239 -0
- steppy_dev-0.3.0/src/steppy/bundle/classify.py +329 -0
- steppy_dev-0.3.0/src/steppy/bundle/create.py +490 -0
- steppy_dev-0.3.0/src/steppy/bundle/hashing.py +28 -0
- steppy_dev-0.3.0/src/steppy/bundle/manifest.py +334 -0
- steppy_dev-0.3.0/src/steppy/bundle/results.py +546 -0
- steppy_dev-0.3.0/src/steppy/bundle_cli.py +455 -0
- steppy_dev-0.3.0/src/steppy/captures.py +207 -0
- steppy_dev-0.3.0/src/steppy/cli.py +2489 -0
- steppy_dev-0.3.0/src/steppy/cloud/__init__.py +58 -0
- steppy_dev-0.3.0/src/steppy/cloud/client.py +267 -0
- steppy_dev-0.3.0/src/steppy/cloud/upload.py +497 -0
- steppy_dev-0.3.0/src/steppy/compat.py +109 -0
- steppy_dev-0.3.0/src/steppy/config.py +231 -0
- steppy_dev-0.3.0/src/steppy/config_schema.py +87 -0
- steppy_dev-0.3.0/src/steppy/contracts/__init__.py +54 -0
- steppy_dev-0.3.0/src/steppy/contracts/bundle.py +215 -0
- steppy_dev-0.3.0/src/steppy/contracts/report.py +346 -0
- steppy_dev-0.3.0/src/steppy/contracts/tours.py +505 -0
- steppy_dev-0.3.0/src/steppy/coordinator.py +1352 -0
- steppy_dev-0.3.0/src/steppy/coverage/__init__.py +9 -0
- steppy_dev-0.3.0/src/steppy/coverage/gaps.py +190 -0
- steppy_dev-0.3.0/src/steppy/coverage/manifest.py +193 -0
- steppy_dev-0.3.0/src/steppy/coverage/merge.py +363 -0
- steppy_dev-0.3.0/src/steppy/coverage/normalize.py +174 -0
- steppy_dev-0.3.0/src/steppy/coverage/report.py +178 -0
- steppy_dev-0.3.0/src/steppy/coverage/sourcemap.py +219 -0
- steppy_dev-0.3.0/src/steppy/coverage/store.py +473 -0
- steppy_dev-0.3.0/src/steppy/coverage/triage.py +151 -0
- steppy_dev-0.3.0/src/steppy/coverage_cli.py +265 -0
- steppy_dev-0.3.0/src/steppy/durations.py +48 -0
- steppy_dev-0.3.0/src/steppy/exclusive.py +178 -0
- steppy_dev-0.3.0/src/steppy/flaky_cli.py +169 -0
- steppy_dev-0.3.0/src/steppy/generator.py +633 -0
- steppy_dev-0.3.0/src/steppy/guide.py +1467 -0
- steppy_dev-0.3.0/src/steppy/history.py +352 -0
- steppy_dev-0.3.0/src/steppy/init_cli.py +330 -0
- steppy_dev-0.3.0/src/steppy/locales.py +282 -0
- steppy_dev-0.3.0/src/steppy/migrate/__init__.py +35 -0
- steppy_dev-0.3.0/src/steppy/migrate/apply.py +194 -0
- steppy_dev-0.3.0/src/steppy/migrate/plan.py +199 -0
- steppy_dev-0.3.0/src/steppy/migrate/rules.py +465 -0
- steppy_dev-0.3.0/src/steppy/migrate/verify.py +163 -0
- steppy_dev-0.3.0/src/steppy/migrate_cli.py +152 -0
- steppy_dev-0.3.0/src/steppy/models.py +2539 -0
- steppy_dev-0.3.0/src/steppy/naming.py +37 -0
- steppy_dev-0.3.0/src/steppy/parser.py +475 -0
- steppy_dev-0.3.0/src/steppy/pdf.py +193 -0
- steppy_dev-0.3.0/src/steppy/presets.py +284 -0
- steppy_dev-0.3.0/src/steppy/record_cli.py +796 -0
- steppy_dev-0.3.0/src/steppy/report/__init__.py +37 -0
- steppy_dev-0.3.0/src/steppy/report/assets.py +197 -0
- steppy_dev-0.3.0/src/steppy/report/build.py +261 -0
- steppy_dev-0.3.0/src/steppy/report/coverage_source.py +277 -0
- steppy_dev-0.3.0/src/steppy/report/model.py +423 -0
- steppy_dev-0.3.0/src/steppy/report/render.py +303 -0
- steppy_dev-0.3.0/src/steppy/report/source.py +238 -0
- steppy_dev-0.3.0/src/steppy/report_cli.py +173 -0
- steppy_dev-0.3.0/src/steppy/runmeta.py +114 -0
- steppy_dev-0.3.0/src/steppy/selection.py +183 -0
- steppy_dev-0.3.0/src/steppy/sitemap.py +205 -0
- steppy_dev-0.3.0/src/steppy/testids.py +166 -0
- steppy_dev-0.3.0/src/steppy/totp.py +26 -0
- steppy_dev-0.3.0/src/steppy/tour_spec.py +163 -0
- steppy_dev-0.3.0/src/steppy/tours/__init__.py +22 -0
- steppy_dev-0.3.0/src/steppy/tours/actions.py +402 -0
- steppy_dev-0.3.0/src/steppy/tours/compiler.py +144 -0
- steppy_dev-0.3.0/src/steppy/tours/diagnostics.py +137 -0
- steppy_dev-0.3.0/src/steppy/tours/emit.py +239 -0
- steppy_dev-0.3.0/src/steppy/tours/ids.py +40 -0
- steppy_dev-0.3.0/src/steppy/tours/inference.py +399 -0
- steppy_dev-0.3.0/src/steppy/tours/model.py +120 -0
- steppy_dev-0.3.0/src/steppy/tours/paths.py +126 -0
- steppy_dev-0.3.0/src/steppy/tours/pipeline.py +277 -0
- steppy_dev-0.3.0/src/steppy/tours/publish.py +124 -0
- steppy_dev-0.3.0/src/steppy/tours/replay.py +234 -0
- steppy_dev-0.3.0/src/steppy/tours/routes.py +175 -0
- steppy_dev-0.3.0/src/steppy/tours/settings.py +164 -0
- steppy_dev-0.3.0/src/steppy/tours/text.py +237 -0
- steppy_dev-0.3.0/src/steppy/tours_cli.py +219 -0
- steppy_dev-0.3.0/src/steppy/tts/__init__.py +280 -0
- steppy_dev-0.3.0/src/steppy/tts/cache.py +185 -0
- steppy_dev-0.3.0/src/steppy/tts/presets.py +125 -0
- steppy_dev-0.3.0/src/steppy/tts/providers/__init__.py +6 -0
- steppy_dev-0.3.0/src/steppy/tts/providers/http.py +184 -0
- steppy_dev-0.3.0/src/steppy/tts/providers/local.py +207 -0
- steppy_dev-0.3.0/src/steppy/tts/providers/null.py +28 -0
- steppy_dev-0.3.0/src/steppy/tts/registry.py +201 -0
- steppy_dev-0.3.0/src/steppy/tts/track.py +158 -0
- steppy_dev-0.3.0/src/steppy/tts/types.py +94 -0
- steppy_dev-0.3.0/src/steppy/update_cli.py +460 -0
- steppy_dev-0.3.0/src/steppy/video.py +730 -0
- steppy_dev-0.3.0/src/steppy/video_cache.py +239 -0
- steppy_dev-0.3.0/src/steppy/video_cli.py +271 -0
- steppy_dev-0.3.0/src/steppy/worker.py +301 -0
- steppy_dev-0.3.0/steppy-config.schema.json +1995 -0
- steppy_dev-0.3.0/templates/_steppy_events.py +291 -0
- steppy_dev-0.3.0/templates/_steppy_tours.py +404 -0
- steppy_dev-0.3.0/templates/angular/component-interactive.ts.j2 +109 -0
- steppy_dev-0.3.0/templates/angular/component-video.ts.j2 +112 -0
- steppy_dev-0.3.0/templates/angular/component.ts.j2 +229 -0
- steppy_dev-0.3.0/templates/angular/content.ts.j2 +31 -0
- steppy_dev-0.3.0/templates/angular/gitignore.j2 +3 -0
- steppy_dev-0.3.0/templates/angular/group.component.ts.j2 +39 -0
- steppy_dev-0.3.0/templates/angular/onboarding.component.ts.j2 +43 -0
- steppy_dev-0.3.0/templates/angular/routes.ts.j2 +34 -0
- steppy_dev-0.3.0/templates/ci/github-actions.yml +284 -0
- steppy_dev-0.3.0/templates/ci/gitlab-ci.yml +178 -0
- steppy_dev-0.3.0/templates/conftest.py.j2 +2405 -0
- steppy_dev-0.3.0/templates/guide.book.html.j2 +145 -0
- steppy_dev-0.3.0/templates/guide.fragment.html.j2 +257 -0
- steppy_dev-0.3.0/templates/guide.html.j2 +301 -0
- steppy_dev-0.3.0/templates/guide.md.j2 +18 -0
- steppy_dev-0.3.0/templates/init/config.yaml +124 -0
- steppy_dev-0.3.0/templates/init/credentials.yaml.example +30 -0
- steppy_dev-0.3.0/templates/init/scenarios/example--first-flow.md +53 -0
- steppy_dev-0.3.0/templates/report/_head.html.j2 +14 -0
- steppy_dev-0.3.0/templates/report/_mark.html.j2 +3 -0
- steppy_dev-0.3.0/templates/report/coverage.html.j2 +124 -0
- steppy_dev-0.3.0/templates/report/index.html.j2 +203 -0
- steppy_dev-0.3.0/templates/report/report.css +401 -0
- steppy_dev-0.3.0/templates/report/scenario.html.j2 +137 -0
- steppy_dev-0.3.0/templates/static/_headers.j2 +30 -0
- steppy_dev-0.3.0/templates/static/_mode_links.html.j2 +22 -0
- steppy_dev-0.3.0/templates/static/_seo_head.html.j2 +37 -0
- steppy_dev-0.3.0/templates/static/cursor.js.j2 +10 -0
- steppy_dev-0.3.0/templates/static/group.html.j2 +78 -0
- steppy_dev-0.3.0/templates/static/guides.css +678 -0
- steppy_dev-0.3.0/templates/static/index.html.j2 +79 -0
- steppy_dev-0.3.0/templates/static/interactive.html.j2 +100 -0
- steppy_dev-0.3.0/templates/static/onboarding.html.j2 +64 -0
- steppy_dev-0.3.0/templates/static/page.html.j2 +145 -0
- steppy_dev-0.3.0/templates/static/robots.txt.j2 +7 -0
- steppy_dev-0.3.0/templates/static/video.html.j2 +135 -0
- steppy_dev-0.3.0/templates/test_scenario.py.j2 +767 -0
- steppy_dev-0.3.0/tests/__init__.py +1 -0
- steppy_dev-0.3.0/tests/_codegen_snapshot.py +581 -0
- steppy_dev-0.3.0/tests/_private_terms.py +32 -0
- steppy_dev-0.3.0/tests/integration/README.md +286 -0
- steppy_dev-0.3.0/tests/integration/test_coverage_recorder_it.py +203 -0
- steppy_dev-0.3.0/tests/integration/test_tour_angular_it.py +384 -0
- steppy_dev-0.3.0/tests/integration/test_tour_player_it.py +603 -0
- steppy_dev-0.3.0/tests/integration/test_tour_replay_it.py +159 -0
- steppy_dev-0.3.0/tests/integration/tour_geometry.py +163 -0
- steppy_dev-0.3.0/tests/test_action_enum_sync.py +137 -0
- steppy_dev-0.3.0/tests/test_angular_adapter_sync.py +98 -0
- steppy_dev-0.3.0/tests/test_assert_contains_count.py +111 -0
- steppy_dev-0.3.0/tests/test_assertion_grammar.py +243 -0
- steppy_dev-0.3.0/tests/test_auth_form_rename.py +138 -0
- steppy_dev-0.3.0/tests/test_auth_js_injection.py +99 -0
- steppy_dev-0.3.0/tests/test_build.py +866 -0
- steppy_dev-0.3.0/tests/test_build_fixture.py +790 -0
- steppy_dev-0.3.0/tests/test_build_interactive.py +684 -0
- steppy_dev-0.3.0/tests/test_build_models.py +738 -0
- steppy_dev-0.3.0/tests/test_build_seo.py +726 -0
- steppy_dev-0.3.0/tests/test_build_tours.py +165 -0
- steppy_dev-0.3.0/tests/test_build_video.py +488 -0
- steppy_dev-0.3.0/tests/test_bundle.py +747 -0
- steppy_dev-0.3.0/tests/test_bundle_contract_parity.py +92 -0
- steppy_dev-0.3.0/tests/test_bundle_events_sink.py +356 -0
- steppy_dev-0.3.0/tests/test_bundle_events_steps.py +272 -0
- steppy_dev-0.3.0/tests/test_bundle_run_wiring.py +230 -0
- steppy_dev-0.3.0/tests/test_bundle_schema.py +102 -0
- steppy_dev-0.3.0/tests/test_bundle_upload.py +390 -0
- steppy_dev-0.3.0/tests/test_call_action.py +257 -0
- steppy_dev-0.3.0/tests/test_capture_dom.py +135 -0
- steppy_dev-0.3.0/tests/test_capture_resolution_robustness.py +300 -0
- steppy_dev-0.3.0/tests/test_capture_shell_security.py +77 -0
- steppy_dev-0.3.0/tests/test_captures.py +122 -0
- steppy_dev-0.3.0/tests/test_cli_error_handling.py +123 -0
- steppy_dev-0.3.0/tests/test_cli_rerun.py +292 -0
- steppy_dev-0.3.0/tests/test_cli_run_guide_tag.py +176 -0
- steppy_dev-0.3.0/tests/test_click_synthetic.py +100 -0
- steppy_dev-0.3.0/tests/test_compat_registry.py +25 -0
- steppy_dev-0.3.0/tests/test_compat_scan.py +94 -0
- steppy_dev-0.3.0/tests/test_config_env_interpolation.py +130 -0
- steppy_dev-0.3.0/tests/test_config_schema.py +83 -0
- steppy_dev-0.3.0/tests/test_confirm_action.py +108 -0
- steppy_dev-0.3.0/tests/test_conftest_locale_mirror.py +177 -0
- steppy_dev-0.3.0/tests/test_coverage_cli.py +246 -0
- steppy_dev-0.3.0/tests/test_coverage_config.py +87 -0
- steppy_dev-0.3.0/tests/test_coverage_gaps.py +310 -0
- steppy_dev-0.3.0/tests/test_coverage_manifest.py +262 -0
- steppy_dev-0.3.0/tests/test_coverage_non_ui.py +303 -0
- steppy_dev-0.3.0/tests/test_coverage_normalize.py +122 -0
- steppy_dev-0.3.0/tests/test_coverage_record_template.py +119 -0
- steppy_dev-0.3.0/tests/test_coverage_sourcemap.py +161 -0
- steppy_dev-0.3.0/tests/test_coverage_store.py +264 -0
- steppy_dev-0.3.0/tests/test_distribution_name.py +95 -0
- steppy_dev-0.3.0/tests/test_escaping_fuzz.py +282 -0
- steppy_dev-0.3.0/tests/test_example_scenarios_validate.py +47 -0
- steppy_dev-0.3.0/tests/test_exclusive_groups.py +191 -0
- steppy_dev-0.3.0/tests/test_expand_action.py +110 -0
- steppy_dev-0.3.0/tests/test_failure_fingerprint.py +155 -0
- steppy_dev-0.3.0/tests/test_fill_date_action.py +222 -0
- steppy_dev-0.3.0/tests/test_fill_flags.py +101 -0
- steppy_dev-0.3.0/tests/test_flaky_cli.py +149 -0
- steppy_dev-0.3.0/tests/test_generator_events_plugin.py +154 -0
- steppy_dev-0.3.0/tests/test_guide_cursor.py +200 -0
- steppy_dev-0.3.0/tests/test_guide_fragment.py +174 -0
- steppy_dev-0.3.0/tests/test_guide_mode_sync.py +106 -0
- steppy_dev-0.3.0/tests/test_guide_pdf_cli.py +214 -0
- steppy_dev-0.3.0/tests/test_guide_text_format.py +211 -0
- steppy_dev-0.3.0/tests/test_guide_video_cli.py +324 -0
- steppy_dev-0.3.0/tests/test_history.py +205 -0
- steppy_dev-0.3.0/tests/test_init.py +179 -0
- steppy_dev-0.3.0/tests/test_interactive_manifest.py +1330 -0
- steppy_dev-0.3.0/tests/test_layout_fixes.py +808 -0
- steppy_dev-0.3.0/tests/test_locale_screenshots.py +217 -0
- steppy_dev-0.3.0/tests/test_locales.py +184 -0
- steppy_dev-0.3.0/tests/test_locales_dynamic.py +141 -0
- steppy_dev-0.3.0/tests/test_match_within.py +329 -0
- steppy_dev-0.3.0/tests/test_migrate_custom.py +312 -0
- steppy_dev-0.3.0/tests/test_navigate_reload.py +99 -0
- steppy_dev-0.3.0/tests/test_navigate_wait.py +92 -0
- steppy_dev-0.3.0/tests/test_no_bundle_import_on_default_path.py +71 -0
- steppy_dev-0.3.0/tests/test_no_cloud_import_on_default_path.py +73 -0
- steppy_dev-0.3.0/tests/test_no_coverage_import_on_default_path.py +51 -0
- steppy_dev-0.3.0/tests/test_no_migrate_import_on_default_path.py +72 -0
- steppy_dev-0.3.0/tests/test_no_parallel_import_on_default_path.py +84 -0
- steppy_dev-0.3.0/tests/test_no_playwright_import_on_default_path.py +99 -0
- steppy_dev-0.3.0/tests/test_no_private_names.py +46 -0
- steppy_dev-0.3.0/tests/test_no_report_import_on_default_path.py +78 -0
- steppy_dev-0.3.0/tests/test_no_tours_import_on_default_path.py +81 -0
- steppy_dev-0.3.0/tests/test_no_video_import_on_default_path.py +117 -0
- steppy_dev-0.3.0/tests/test_optional_and_when.py +222 -0
- steppy_dev-0.3.0/tests/test_output_config.py +431 -0
- steppy_dev-0.3.0/tests/test_parallel_auth_isolation.py +132 -0
- steppy_dev-0.3.0/tests/test_parallel_circuit_breaker.py +119 -0
- steppy_dev-0.3.0/tests/test_parallel_compose.py +126 -0
- steppy_dev-0.3.0/tests/test_parallel_config.py +138 -0
- steppy_dev-0.3.0/tests/test_parallel_coordinator_wait.py +119 -0
- steppy_dev-0.3.0/tests/test_parallel_event_bus.py +347 -0
- steppy_dev-0.3.0/tests/test_parallel_events_plugin.py +287 -0
- steppy_dev-0.3.0/tests/test_parallel_exclusive_scheduling.py +314 -0
- steppy_dev-0.3.0/tests/test_parallel_exit_policy.py +211 -0
- steppy_dev-0.3.0/tests/test_parallel_failures.py +214 -0
- steppy_dev-0.3.0/tests/test_parallel_guide_integration.py +436 -0
- steppy_dev-0.3.0/tests/test_parallel_lastfailed.py +176 -0
- steppy_dev-0.3.0/tests/test_parallel_preauth.py +195 -0
- steppy_dev-0.3.0/tests/test_parallel_queue.py +344 -0
- steppy_dev-0.3.0/tests/test_parallel_renderer.py +364 -0
- steppy_dev-0.3.0/tests/test_parallel_report_flags.py +157 -0
- steppy_dev-0.3.0/tests/test_parallel_retry_pass.py +310 -0
- steppy_dev-0.3.0/tests/test_parallel_worker_image.py +321 -0
- steppy_dev-0.3.0/tests/test_parser.py +1630 -0
- steppy_dev-0.3.0/tests/test_parser_malformed_lines.py +93 -0
- steppy_dev-0.3.0/tests/test_pdf.py +313 -0
- steppy_dev-0.3.0/tests/test_pick_date_action.py +155 -0
- steppy_dev-0.3.0/tests/test_pick_time_action.py +136 -0
- steppy_dev-0.3.0/tests/test_player_bundle_files.py +42 -0
- steppy_dev-0.3.0/tests/test_record_cli.py +179 -0
- steppy_dev-0.3.0/tests/test_record_login_and_secrets.py +115 -0
- steppy_dev-0.3.0/tests/test_record_transform.py +296 -0
- steppy_dev-0.3.0/tests/test_report_assets.py +243 -0
- steppy_dev-0.3.0/tests/test_report_ci.py +160 -0
- steppy_dev-0.3.0/tests/test_report_ci_templates.py +255 -0
- steppy_dev-0.3.0/tests/test_report_cli.py +214 -0
- steppy_dev-0.3.0/tests/test_report_coverage.py +248 -0
- steppy_dev-0.3.0/tests/test_report_model.py +432 -0
- steppy_dev-0.3.0/tests/test_report_render.py +412 -0
- steppy_dev-0.3.0/tests/test_report_schema.py +122 -0
- steppy_dev-0.3.0/tests/test_report_source.py +209 -0
- steppy_dev-0.3.0/tests/test_reusable_workflow.py +142 -0
- steppy_dev-0.3.0/tests/test_robustness_flaws.py +214 -0
- steppy_dev-0.3.0/tests/test_run_byte_identical.py +134 -0
- steppy_dev-0.3.0/tests/test_scenario_version.py +59 -0
- steppy_dev-0.3.0/tests/test_screenshot_mask.py +72 -0
- steppy_dev-0.3.0/tests/test_screenshot_path_resolution.py +331 -0
- steppy_dev-0.3.0/tests/test_select_option_action.py +163 -0
- steppy_dev-0.3.0/tests/test_selection.py +239 -0
- steppy_dev-0.3.0/tests/test_selector_lint.py +190 -0
- steppy_dev-0.3.0/tests/test_seo_config_sync.py +92 -0
- steppy_dev-0.3.0/tests/test_sitemap.py +262 -0
- steppy_dev-0.3.0/tests/test_skills_neutralized.py +29 -0
- steppy_dev-0.3.0/tests/test_skills_sync.py +128 -0
- steppy_dev-0.3.0/tests/test_step_events_codegen.py +265 -0
- steppy_dev-0.3.0/tests/test_step_required_fields.py +111 -0
- steppy_dev-0.3.0/tests/test_step_timeout_and_force.py +237 -0
- steppy_dev-0.3.0/tests/test_template_precedence.py +144 -0
- steppy_dev-0.3.0/tests/test_toggle_action.py +127 -0
- steppy_dev-0.3.0/tests/test_totp.py +159 -0
- steppy_dev-0.3.0/tests/test_tour_action_table.py +30 -0
- steppy_dev-0.3.0/tests/test_tour_contract_sync.py +105 -0
- steppy_dev-0.3.0/tests/test_tour_demo_server.py +60 -0
- steppy_dev-0.3.0/tests/test_tour_leaves.py +226 -0
- steppy_dev-0.3.0/tests/test_tour_leaves_stdlib_only.py +34 -0
- steppy_dev-0.3.0/tests/test_tour_replay_codegen.py +224 -0
- steppy_dev-0.3.0/tests/test_tour_replay_conftest.py +187 -0
- steppy_dev-0.3.0/tests/test_tour_replay_helpers.py +590 -0
- steppy_dev-0.3.0/tests/test_tour_replay_helpers_mirror.py +73 -0
- steppy_dev-0.3.0/tests/test_tour_replay_plan.py +205 -0
- steppy_dev-0.3.0/tests/test_tours_cli.py +349 -0
- steppy_dev-0.3.0/tests/test_tours_config.py +110 -0
- steppy_dev-0.3.0/tests/test_tours_contract.py +173 -0
- steppy_dev-0.3.0/tests/test_tours_diagnostics.py +24 -0
- steppy_dev-0.3.0/tests/test_tours_disabled_inert.py +85 -0
- steppy_dev-0.3.0/tests/test_tours_docs_sync.py +178 -0
- steppy_dev-0.3.0/tests/test_tours_golden.py +120 -0
- steppy_dev-0.3.0/tests/test_tours_inference.py +808 -0
- steppy_dev-0.3.0/tests/test_tours_routes.py +73 -0
- steppy_dev-0.3.0/tests/test_tours_scenario_model.py +221 -0
- steppy_dev-0.3.0/tests/test_tours_schema.py +48 -0
- steppy_dev-0.3.0/tests/test_tours_text.py +180 -0
- steppy_dev-0.3.0/tests/test_tts.py +779 -0
- steppy_dev-0.3.0/tests/test_ui_presets.py +97 -0
- steppy_dev-0.3.0/tests/test_update.py +244 -0
- steppy_dev-0.3.0/tests/test_upload_action.py +284 -0
- steppy_dev-0.3.0/tests/test_versions_aligned.py +83 -0
- steppy_dev-0.3.0/tests/test_video.py +716 -0
- steppy_dev-0.3.0/tests/test_video_cache.py +161 -0
- steppy_dev-0.3.0/tests/test_wait_for_predicate.py +228 -0
- steppy_dev-0.3.0/tests/test_wait_for_state.py +91 -0
- steppy_dev-0.3.0/tests/test_widget_control_and_detect.py +204 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.0.1",
|
|
3
|
+
"configurations": [
|
|
4
|
+
{
|
|
5
|
+
"name": "player-dev",
|
|
6
|
+
"runtimeExecutable": "python",
|
|
7
|
+
"runtimeArgs": [
|
|
8
|
+
"-m",
|
|
9
|
+
"http.server",
|
|
10
|
+
"8099",
|
|
11
|
+
"--directory",
|
|
12
|
+
"packages/player"
|
|
13
|
+
],
|
|
14
|
+
"port": 8099
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "tour-demo",
|
|
18
|
+
"runtimeExecutable": "python",
|
|
19
|
+
"runtimeArgs": [
|
|
20
|
+
"fixtures/tour-demo/serve.py",
|
|
21
|
+
"--port",
|
|
22
|
+
"8770"
|
|
23
|
+
],
|
|
24
|
+
"port": 8770
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "tour-demo-angular",
|
|
28
|
+
"runtimeExecutable": "python",
|
|
29
|
+
"runtimeArgs": [
|
|
30
|
+
"fixtures/tour-demo/serve.py",
|
|
31
|
+
"--port",
|
|
32
|
+
"8772",
|
|
33
|
+
"--style-src",
|
|
34
|
+
"'unsafe-inline'",
|
|
35
|
+
"--app-dir",
|
|
36
|
+
"fixtures/tour-demo-angular/app/dist/tour-demo-angular/browser"
|
|
37
|
+
],
|
|
38
|
+
"port": 8772
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Build context for the worker image (see Dockerfile). The image build only
|
|
2
|
+
# needs: pyproject.toml, hatch_build.py, src/, templates/, skills/,
|
|
3
|
+
# CHANGELOG.md. Everything else is excluded to keep `docker build` fast and
|
|
4
|
+
# to keep local secrets/state from being sent to the Docker daemon.
|
|
5
|
+
|
|
6
|
+
# VCS / editor
|
|
7
|
+
.git/
|
|
8
|
+
.github/
|
|
9
|
+
.claude/
|
|
10
|
+
|
|
11
|
+
# Secrets — never leave the host
|
|
12
|
+
.auth/
|
|
13
|
+
credentials.yaml
|
|
14
|
+
credentials.yml
|
|
15
|
+
|
|
16
|
+
# Runtime state / generated output
|
|
17
|
+
.steppy/
|
|
18
|
+
output/
|
|
19
|
+
tests/e2e/
|
|
20
|
+
|
|
21
|
+
# Python caches / envs
|
|
22
|
+
__pycache__/
|
|
23
|
+
**/__pycache__/
|
|
24
|
+
*.py[cod]
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.venv/
|
|
27
|
+
venv/
|
|
28
|
+
.pytest_cache/
|
|
29
|
+
.mypy_cache/
|
|
30
|
+
.ruff_cache/
|
|
31
|
+
|
|
32
|
+
# Node workspaces — the built player bundle is vendored at
|
|
33
|
+
# src/steppy/_player_bundle/, so packages/ isn't needed for the image build.
|
|
34
|
+
packages/
|
|
35
|
+
node_modules/
|
|
36
|
+
**/node_modules/
|
|
37
|
+
|
|
38
|
+
# Project/dev files not needed to pip-install the steppy package
|
|
39
|
+
tests/
|
|
40
|
+
fixtures/
|
|
41
|
+
scenarios/
|
|
42
|
+
seed/
|
|
43
|
+
config.yaml
|
|
44
|
+
credentials.yaml.example
|
|
45
|
+
steppy.guide.config.ts
|
|
46
|
+
steppy-config.schema.json
|
|
47
|
+
docker-compose*.yml
|
|
48
|
+
Dockerfile
|
|
49
|
+
.dockerignore
|
|
50
|
+
README.md
|
|
51
|
+
SECURITY.md
|
|
52
|
+
CONTRIBUTING.md
|
|
53
|
+
NEW_COMMANDS.md
|
|
54
|
+
PROJECT.md
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# LF everywhere, on every OS. Several guard tests compare files byte for byte
|
|
2
|
+
# (the _totp_now / _base_language / sanitise_nodeid mirrors, the generated
|
|
3
|
+
# JSON schemas, the vendored bundles), and a CRLF checkout on Windows turns
|
|
4
|
+
# those into diffs nobody made.
|
|
5
|
+
* text=auto eol=lf
|
|
6
|
+
|
|
7
|
+
*.png binary
|
|
8
|
+
*.jpg binary
|
|
9
|
+
*.jpeg binary
|
|
10
|
+
*.gif binary
|
|
11
|
+
*.webp binary
|
|
12
|
+
*.ico binary
|
|
13
|
+
*.pdf binary
|
|
14
|
+
*.mp4 binary
|
|
15
|
+
*.wav binary
|
|
16
|
+
*.zip binary
|
|
17
|
+
|
|
18
|
+
# Build outputs committed on purpose (so `pip install git+...` needs no Node).
|
|
19
|
+
# Collapsed in diffs and left out of GitHub's language statistics.
|
|
20
|
+
src/steppy/_player_bundle/*.js linguist-generated=true
|
|
21
|
+
src/steppy/_player_bundle/*.js.map linguist-generated=true
|
|
22
|
+
fixtures/demo-guide/public/assets/**/steppy-player.js linguist-generated=true
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something in Steppy behaves differently from what the docs say.
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for taking the time to report this. A security vulnerability goes
|
|
9
|
+
through a private advisory instead (see SECURITY.md), never a public issue.
|
|
10
|
+
|
|
11
|
+
- type: dropdown
|
|
12
|
+
id: area
|
|
13
|
+
attributes:
|
|
14
|
+
label: Area
|
|
15
|
+
options:
|
|
16
|
+
- Scenarios, validate or generate
|
|
17
|
+
- Running tests (steppy run)
|
|
18
|
+
- Parallel runs (--workers)
|
|
19
|
+
- Guides, build, PDF or video
|
|
20
|
+
- In-app tours
|
|
21
|
+
- Report, bundle or coverage
|
|
22
|
+
- Recording (steppy record)
|
|
23
|
+
- "@steppy/player"
|
|
24
|
+
- "@steppy/angular"
|
|
25
|
+
- Something else
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: what-happened
|
|
31
|
+
attributes:
|
|
32
|
+
label: What happened
|
|
33
|
+
description: Include the full error. Re-running with `--verbose` (or `STEPPY_DEBUG=1`) prints the traceback.
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: expected
|
|
39
|
+
attributes:
|
|
40
|
+
label: What you expected
|
|
41
|
+
validations:
|
|
42
|
+
required: true
|
|
43
|
+
|
|
44
|
+
- type: textarea
|
|
45
|
+
id: reproduce
|
|
46
|
+
attributes:
|
|
47
|
+
label: How to reproduce
|
|
48
|
+
description: |
|
|
49
|
+
The command you ran, and the smallest scenario or `config.yaml` excerpt that shows the
|
|
50
|
+
problem. Use the neutral example domain if you can.
|
|
51
|
+
render: markdown
|
|
52
|
+
validations:
|
|
53
|
+
required: true
|
|
54
|
+
|
|
55
|
+
- type: input
|
|
56
|
+
id: steppy-version
|
|
57
|
+
attributes:
|
|
58
|
+
label: Steppy version
|
|
59
|
+
description: Output of `python -c "import steppy; print(steppy.__version__)"`, or the npm package version.
|
|
60
|
+
validations:
|
|
61
|
+
required: true
|
|
62
|
+
|
|
63
|
+
- type: textarea
|
|
64
|
+
id: environment
|
|
65
|
+
attributes:
|
|
66
|
+
label: Environment
|
|
67
|
+
description: Operating system, Python version, Playwright version, and Node version if the problem involves `steppy build` or an npm package.
|
|
68
|
+
validations:
|
|
69
|
+
required: true
|
|
70
|
+
|
|
71
|
+
- type: checkboxes
|
|
72
|
+
id: redaction
|
|
73
|
+
attributes:
|
|
74
|
+
label: Before you submit
|
|
75
|
+
options:
|
|
76
|
+
- label: I removed credentials, tokens, internal URLs and personal data from the logs, config and screenshots above.
|
|
77
|
+
required: true
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest a new capability or a change to an existing one.
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: The problem
|
|
9
|
+
description: What are you trying to do, and what gets in the way today? A scenario excerpt helps.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: What you would like
|
|
17
|
+
description: How it could work from your side, such as a new step field, action, config key or command.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: alternatives
|
|
23
|
+
attributes:
|
|
24
|
+
label: What you do today instead
|
|
25
|
+
description: "For example an `action: custom` block or a `call` helper you had to write."
|
|
26
|
+
|
|
27
|
+
- type: dropdown
|
|
28
|
+
id: area
|
|
29
|
+
attributes:
|
|
30
|
+
label: Area
|
|
31
|
+
options:
|
|
32
|
+
- Scenarios, validate or generate
|
|
33
|
+
- Running tests (steppy run)
|
|
34
|
+
- Parallel runs (--workers)
|
|
35
|
+
- Guides, build, PDF or video
|
|
36
|
+
- In-app tours
|
|
37
|
+
- Report, bundle or coverage
|
|
38
|
+
- Recording (steppy record)
|
|
39
|
+
- "@steppy/player"
|
|
40
|
+
- "@steppy/angular"
|
|
41
|
+
- Something else
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## What this changes
|
|
2
|
+
|
|
3
|
+
<!-- What the change does and why. Link the issue it closes, if any. -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] `python -m pytest tests/ --ignore=tests/e2e -q` passes
|
|
8
|
+
- [ ] `ruff check . && ruff format --check .` passes
|
|
9
|
+
- [ ] Templates were edited in `templates/` only, never in the generated `src/steppy/templates/`
|
|
10
|
+
- [ ] If `packages/player/src/` changed: `npm --prefix packages/player test` passes, and the bundles were rebuilt and re-vendored into `src/steppy/_player_bundle/`
|
|
11
|
+
- [ ] A user-visible change has an entry under `[Unreleased]` in `CHANGELOG.md`, and the docs and skills say the same thing
|
|
12
|
+
|
|
13
|
+
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the guard tests and what each one protects. By opening this pull request you agree that your contribution is licensed under the Apache License 2.0, as described there.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
lint:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
# Ruff comes from the `dev` dependency group (pyproject.toml), never from
|
|
18
|
+
# whatever happens to be on PATH — see CONTRIBUTING.md for why that matters.
|
|
19
|
+
- uses: astral-sh/setup-uv@v6
|
|
20
|
+
|
|
21
|
+
- name: Lint
|
|
22
|
+
run: uv run --only-group dev ruff check .
|
|
23
|
+
|
|
24
|
+
- name: Format
|
|
25
|
+
run: uv run --only-group dev ruff format --check .
|
|
26
|
+
|
|
27
|
+
python:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
strategy:
|
|
30
|
+
fail-fast: false
|
|
31
|
+
matrix:
|
|
32
|
+
python-version: ['3.12', '3.13']
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
|
|
36
|
+
- uses: actions/setup-python@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: ${{ matrix.python-version }}
|
|
39
|
+
|
|
40
|
+
- name: Install package (editable) + extras
|
|
41
|
+
run: |
|
|
42
|
+
python -m pip install --upgrade pip
|
|
43
|
+
pip install -e '.[report,retry,bundle]'
|
|
44
|
+
|
|
45
|
+
- name: Run unit tests
|
|
46
|
+
run: python -m pytest tests/ --ignore=tests/e2e -q
|
|
47
|
+
|
|
48
|
+
player:
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
steps:
|
|
51
|
+
- uses: actions/checkout@v4
|
|
52
|
+
|
|
53
|
+
- uses: actions/setup-node@v4
|
|
54
|
+
with:
|
|
55
|
+
node-version: '20'
|
|
56
|
+
cache: 'npm'
|
|
57
|
+
cache-dependency-path: packages/player/package-lock.json
|
|
58
|
+
|
|
59
|
+
- name: Install player workspace
|
|
60
|
+
run: npm --prefix packages/player ci
|
|
61
|
+
|
|
62
|
+
- name: Run player tests
|
|
63
|
+
run: npm --prefix packages/player test
|
|
64
|
+
|
|
65
|
+
# The bundles under src/steppy/_player_bundle/ are committed so that
|
|
66
|
+
# `pip install git+...` needs no Node toolchain. The build is reproducible,
|
|
67
|
+
# so a mismatch means someone changed packages/player/src/ without
|
|
68
|
+
# rebuilding and re-vendoring — and every git install would ship the old player.
|
|
69
|
+
- name: Vendored bundles match the source
|
|
70
|
+
run: |
|
|
71
|
+
npm --prefix packages/player run build
|
|
72
|
+
fail=0
|
|
73
|
+
for f in steppy-player.js steppy-cursor-legacy.js steppy-video.js; do
|
|
74
|
+
for g in "$f" "$f.map"; do
|
|
75
|
+
if ! cmp -s "packages/player/dist/$g" "src/steppy/_player_bundle/$g"; then
|
|
76
|
+
echo "::error file=src/steppy/_player_bundle/$g::stale vendored bundle — run the player build and copy dist/ into src/steppy/_player_bundle/"
|
|
77
|
+
fail=1
|
|
78
|
+
fi
|
|
79
|
+
done
|
|
80
|
+
done
|
|
81
|
+
exit $fail
|
|
82
|
+
|
|
83
|
+
# The in-app tour overlay (dist/steppy-tour.js) ships to apps through
|
|
84
|
+
# npm, not the wheel, so it is not compared above. It has a size budget
|
|
85
|
+
# instead; the build above already produced it.
|
|
86
|
+
- name: Tour overlay size budget
|
|
87
|
+
run: npm --prefix packages/player run size:tour
|
|
88
|
+
|
|
89
|
+
# Publish-readiness: every file package.json points at is in the tarball.
|
|
90
|
+
- name: npm pack contents
|
|
91
|
+
run: npm --prefix packages/player run check:pack
|
|
92
|
+
|
|
93
|
+
# In-app tours in a real browser: the overlay in the demo app (top layer,
|
|
94
|
+
# focus, keyboard, remote loading with CORS and SRI, a built guide site as
|
|
95
|
+
# the remote origin) and the generated tour replays — including the one this
|
|
96
|
+
# feature exists for: a renamed test-id fails the build, naming tour, step
|
|
97
|
+
# and test-id. happy-dom covers the logic; only Chromium covers this.
|
|
98
|
+
tour-e2e:
|
|
99
|
+
runs-on: ubuntu-latest
|
|
100
|
+
steps:
|
|
101
|
+
- uses: actions/checkout@v4
|
|
102
|
+
|
|
103
|
+
- uses: actions/setup-node@v4
|
|
104
|
+
with:
|
|
105
|
+
node-version: '20'
|
|
106
|
+
cache: 'npm'
|
|
107
|
+
cache-dependency-path: packages/player/package-lock.json
|
|
108
|
+
|
|
109
|
+
- name: Build the tour overlay
|
|
110
|
+
run: |
|
|
111
|
+
npm --prefix packages/player ci
|
|
112
|
+
npm --prefix packages/player run build
|
|
113
|
+
|
|
114
|
+
- uses: actions/setup-python@v5
|
|
115
|
+
with:
|
|
116
|
+
python-version: '3.12'
|
|
117
|
+
|
|
118
|
+
- name: Install package (editable) + Chromium
|
|
119
|
+
run: |
|
|
120
|
+
python -m pip install --upgrade pip
|
|
121
|
+
pip install -e .
|
|
122
|
+
playwright install chromium --with-deps
|
|
123
|
+
|
|
124
|
+
- name: Run the tour browser tests
|
|
125
|
+
env:
|
|
126
|
+
STEPPY_TOUR_E2E: '1'
|
|
127
|
+
run: python -m pytest tests/integration/test_tour_replay_it.py tests/integration/test_tour_player_it.py -q
|
|
128
|
+
|
|
129
|
+
- name: Keep the failure evidence
|
|
130
|
+
if: failure()
|
|
131
|
+
uses: actions/upload-artifact@v4
|
|
132
|
+
with:
|
|
133
|
+
name: tour-e2e-failure
|
|
134
|
+
path: |
|
|
135
|
+
/tmp/pytest-of-*/pytest-*/**/tests/e2e/**
|
|
136
|
+
/tmp/pytest-of-*/pytest-*/**/output/**
|
|
137
|
+
if-no-files-found: ignore
|
|
138
|
+
retention-days: 7
|
|
139
|
+
|
|
140
|
+
# @steppy/angular: the zoneless and the zone.js unit suites, the
|
|
141
|
+
# ng-packagr build, and what `npm publish ./dist` would ship. The adapter
|
|
142
|
+
# type-checks against the overlay's declarations, so the player is built first.
|
|
143
|
+
angular-adapter:
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
steps:
|
|
146
|
+
- uses: actions/checkout@v4
|
|
147
|
+
|
|
148
|
+
- uses: actions/setup-node@v4
|
|
149
|
+
with:
|
|
150
|
+
node-version: '22'
|
|
151
|
+
cache: 'npm'
|
|
152
|
+
cache-dependency-path: |
|
|
153
|
+
packages/player/package-lock.json
|
|
154
|
+
packages/angular/package-lock.json
|
|
155
|
+
|
|
156
|
+
- name: Build the player
|
|
157
|
+
run: |
|
|
158
|
+
npm --prefix packages/player ci
|
|
159
|
+
npm --prefix packages/player run build
|
|
160
|
+
|
|
161
|
+
- name: Test and build the adapter
|
|
162
|
+
run: |
|
|
163
|
+
npm --prefix packages/angular ci
|
|
164
|
+
npm --prefix packages/angular test
|
|
165
|
+
npm --prefix packages/angular run build
|
|
166
|
+
npm pack --dry-run ./packages/angular/dist
|
|
167
|
+
|
|
168
|
+
# In-app tours in a real Angular + PrimeNG + ngx-translate app, through the
|
|
169
|
+
# adapter: the plain demo's scenarios and their generated replays run
|
|
170
|
+
# unchanged against it, plus the router bridge, zone hygiene and i18n.
|
|
171
|
+
tour-angular-e2e:
|
|
172
|
+
runs-on: ubuntu-latest
|
|
173
|
+
steps:
|
|
174
|
+
- uses: actions/checkout@v4
|
|
175
|
+
|
|
176
|
+
- uses: actions/setup-node@v4
|
|
177
|
+
with:
|
|
178
|
+
node-version: '22'
|
|
179
|
+
cache: 'npm'
|
|
180
|
+
cache-dependency-path: |
|
|
181
|
+
packages/player/package-lock.json
|
|
182
|
+
packages/angular/package-lock.json
|
|
183
|
+
fixtures/tour-demo-angular/app/package-lock.json
|
|
184
|
+
|
|
185
|
+
- name: Build the player, the adapter and the demo
|
|
186
|
+
run: |
|
|
187
|
+
npm --prefix packages/player ci
|
|
188
|
+
npm --prefix packages/player run build
|
|
189
|
+
npm --prefix packages/angular ci
|
|
190
|
+
npm --prefix packages/angular run build
|
|
191
|
+
npm --prefix fixtures/tour-demo-angular/app ci
|
|
192
|
+
npm --prefix fixtures/tour-demo-angular/app run build
|
|
193
|
+
|
|
194
|
+
- uses: actions/setup-python@v5
|
|
195
|
+
with:
|
|
196
|
+
python-version: '3.12'
|
|
197
|
+
|
|
198
|
+
- name: Install package (editable) + Chromium
|
|
199
|
+
run: |
|
|
200
|
+
python -m pip install --upgrade pip
|
|
201
|
+
pip install -e .
|
|
202
|
+
playwright install chromium --with-deps
|
|
203
|
+
|
|
204
|
+
- name: Run the Angular tour browser tests
|
|
205
|
+
env:
|
|
206
|
+
STEPPY_TOUR_ANGULAR_E2E: '1'
|
|
207
|
+
run: python -m pytest tests/integration/test_tour_angular_it.py -q
|
|
208
|
+
|
|
209
|
+
- name: Keep the failure evidence
|
|
210
|
+
if: failure()
|
|
211
|
+
uses: actions/upload-artifact@v4
|
|
212
|
+
with:
|
|
213
|
+
name: tour-angular-e2e-failure
|
|
214
|
+
path: |
|
|
215
|
+
/tmp/pytest-of-*/pytest-*/**/tests/e2e/**
|
|
216
|
+
/tmp/pytest-of-*/pytest-*/**/output/**
|
|
217
|
+
if-no-files-found: ignore
|
|
218
|
+
retention-days: 7
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build-and-release:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout
|
|
17
|
+
uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Verify tag matches all package versions
|
|
20
|
+
run: |
|
|
21
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
22
|
+
PROJECT_VERSION=$(grep -E '^version = ' pyproject.toml | head -1 | sed -E 's/version = "(.*)"/\1/')
|
|
23
|
+
TYPES_VERSION=$(python -c "import json;print(json.load(open('packages/steppy/package.json'))['version'])")
|
|
24
|
+
PLAYER_VERSION=$(python -c "import json;print(json.load(open('packages/player/package.json'))['version'])")
|
|
25
|
+
ANGULAR_VERSION=$(python -c "import json;print(json.load(open('packages/angular/package.json'))['version'])")
|
|
26
|
+
echo "Tag: $TAG_VERSION"
|
|
27
|
+
echo "pyproject.toml: $PROJECT_VERSION"
|
|
28
|
+
echo "packages/steppy/package.json: $TYPES_VERSION"
|
|
29
|
+
echo "packages/player/package.json: $PLAYER_VERSION"
|
|
30
|
+
echo "packages/angular/package.json: $ANGULAR_VERSION"
|
|
31
|
+
fail=0
|
|
32
|
+
for name_ver in "pyproject.toml=$PROJECT_VERSION" "packages/steppy=$TYPES_VERSION" "packages/player=$PLAYER_VERSION" "packages/angular=$ANGULAR_VERSION"; do
|
|
33
|
+
name="${name_ver%%=*}"; ver="${name_ver##*=}"
|
|
34
|
+
if [ "$TAG_VERSION" != "$ver" ]; then
|
|
35
|
+
echo "::error::Tag $GITHUB_REF_NAME does not match $name version $ver"
|
|
36
|
+
fail=1
|
|
37
|
+
fi
|
|
38
|
+
done
|
|
39
|
+
[ "$fail" = 0 ]
|
|
40
|
+
|
|
41
|
+
- name: Setup Node
|
|
42
|
+
uses: actions/setup-node@v4
|
|
43
|
+
with:
|
|
44
|
+
node-version: '20'
|
|
45
|
+
cache: 'npm'
|
|
46
|
+
cache-dependency-path: packages/player/package-lock.json
|
|
47
|
+
|
|
48
|
+
- name: Setup Python
|
|
49
|
+
uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: '3.12'
|
|
52
|
+
|
|
53
|
+
- name: Install player workspace
|
|
54
|
+
run: npm --prefix packages/player ci
|
|
55
|
+
|
|
56
|
+
- name: Build player bundles
|
|
57
|
+
run: npm --prefix packages/player run build
|
|
58
|
+
|
|
59
|
+
# The tour overlay ships through npm only: its size budget and the
|
|
60
|
+
# package's contents are checked here, before anything is released.
|
|
61
|
+
- name: Tour overlay size budget and npm pack contents
|
|
62
|
+
run: |
|
|
63
|
+
npm --prefix packages/player run size:tour
|
|
64
|
+
npm --prefix packages/player run check:pack
|
|
65
|
+
|
|
66
|
+
- name: Vendor player bundles into Python package
|
|
67
|
+
run: |
|
|
68
|
+
cp packages/player/dist/steppy-player.js src/steppy/_player_bundle/
|
|
69
|
+
cp packages/player/dist/steppy-player.js.map src/steppy/_player_bundle/
|
|
70
|
+
cp packages/player/dist/steppy-cursor-legacy.js src/steppy/_player_bundle/
|
|
71
|
+
cp packages/player/dist/steppy-cursor-legacy.js.map src/steppy/_player_bundle/
|
|
72
|
+
cp packages/player/dist/steppy-video.js src/steppy/_player_bundle/
|
|
73
|
+
cp packages/player/dist/steppy-video.js.map src/steppy/_player_bundle/
|
|
74
|
+
ls -la src/steppy/_player_bundle/
|
|
75
|
+
|
|
76
|
+
- name: Install build tools
|
|
77
|
+
run: pip install --upgrade build twine
|
|
78
|
+
|
|
79
|
+
- name: Build wheel + sdist
|
|
80
|
+
run: python -m build
|
|
81
|
+
|
|
82
|
+
# The README becomes the PyPI project page; a description PyPI cannot
|
|
83
|
+
# render is refused at upload, after the GitHub Release already exists.
|
|
84
|
+
- name: Check the metadata PyPI will render
|
|
85
|
+
run: twine check --strict dist/*
|
|
86
|
+
|
|
87
|
+
- name: Verify wheel contains vendored bundles
|
|
88
|
+
run: |
|
|
89
|
+
WHEEL=$(ls dist/*.whl | head -1)
|
|
90
|
+
echo "Inspecting $WHEEL"
|
|
91
|
+
python -m zipfile -l "$WHEEL" | tee /tmp/wheel-contents.txt
|
|
92
|
+
for f in steppy-player.js steppy-cursor-legacy.js steppy-video.js THIRD_PARTY_LICENSES.txt; do
|
|
93
|
+
if ! grep -q "steppy/_player_bundle/$f" /tmp/wheel-contents.txt; then
|
|
94
|
+
echo "::error::$f missing from wheel"
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
done
|
|
98
|
+
for f in LICENSE NOTICE; do
|
|
99
|
+
if ! grep -q "dist-info/licenses/$f" /tmp/wheel-contents.txt; then
|
|
100
|
+
echo "::error::$f missing from wheel"
|
|
101
|
+
exit 1
|
|
102
|
+
fi
|
|
103
|
+
done
|
|
104
|
+
# The tour replay helper is copied next to conftest.py by `generate`;
|
|
105
|
+
# the tour overlay itself is never vendored (it ships through npm).
|
|
106
|
+
if ! grep -q "steppy/templates/_steppy_tours.py" /tmp/wheel-contents.txt; then
|
|
107
|
+
echo "::error::templates/_steppy_tours.py missing from wheel"
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
if grep -q "steppy-tour.js" /tmp/wheel-contents.txt; then
|
|
111
|
+
echo "::error::steppy-tour.js must not be vendored into the wheel"
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# The PyPI job publishes these exact files rather than building again.
|
|
116
|
+
- name: Keep the distributions for the PyPI job
|
|
117
|
+
uses: actions/upload-artifact@v4
|
|
118
|
+
with:
|
|
119
|
+
name: python-dist
|
|
120
|
+
path: dist/
|
|
121
|
+
if-no-files-found: error
|
|
122
|
+
|
|
123
|
+
- name: Create GitHub Release
|
|
124
|
+
env:
|
|
125
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
126
|
+
run: |
|
|
127
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
128
|
+
--title "$GITHUB_REF_NAME" \
|
|
129
|
+
--generate-notes \
|
|
130
|
+
dist/*.whl dist/*.tar.gz
|
|
131
|
+
|
|
132
|
+
- name: PyPI publishing is off
|
|
133
|
+
if: vars.PYPI_PUBLISH != 'true'
|
|
134
|
+
run: echo "::notice::The PYPI_PUBLISH repository variable is not 'true'; steppy-dev is not published to PyPI"
|
|
135
|
+
|
|
136
|
+
# steppy-dev on PyPI, through Trusted Publishing: PyPI trusts this workflow
|
|
137
|
+
# in this repository and the `pypi` environment, so no token is stored.
|
|
138
|
+
# Skipped until the PYPI_PUBLISH repository variable is 'true', which is set
|
|
139
|
+
# once the trusted publisher exists (CONTRIBUTING.md, "Releasing").
|
|
140
|
+
publish-pypi:
|
|
141
|
+
needs: build-and-release
|
|
142
|
+
if: vars.PYPI_PUBLISH == 'true'
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
environment:
|
|
145
|
+
name: pypi
|
|
146
|
+
url: https://pypi.org/project/steppy-dev/
|
|
147
|
+
permissions:
|
|
148
|
+
id-token: write # Trusted Publishing
|
|
149
|
+
# Every step here can mint the token that uploads to PyPI, so each action
|
|
150
|
+
# is pinned to a commit rather than a tag its owner could move.
|
|
151
|
+
steps:
|
|
152
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
153
|
+
with:
|
|
154
|
+
name: python-dist
|
|
155
|
+
path: dist/
|
|
156
|
+
|
|
157
|
+
- name: Publish steppy-dev
|
|
158
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
159
|
+
|
|
160
|
+
# @steppy/player (the guide player and the in-app tour overlay) and
|
|
161
|
+
# @steppy/angular. Skipped until an NPM_TOKEN secret exists; the player
|
|
162
|
+
# goes first because the adapter names it as a peer at the same version.
|
|
163
|
+
publish-npm:
|
|
164
|
+
needs: build-and-release
|
|
165
|
+
runs-on: ubuntu-latest
|
|
166
|
+
permissions:
|
|
167
|
+
contents: read
|
|
168
|
+
id-token: write # npm provenance
|
|
169
|
+
env:
|
|
170
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
171
|
+
steps:
|
|
172
|
+
- name: No npm token
|
|
173
|
+
if: env.NODE_AUTH_TOKEN == ''
|
|
174
|
+
run: echo "::notice::NPM_TOKEN is not set; the npm packages are not published"
|
|
175
|
+
|
|
176
|
+
- uses: actions/checkout@v4
|
|
177
|
+
if: env.NODE_AUTH_TOKEN != ''
|
|
178
|
+
|
|
179
|
+
- uses: actions/setup-node@v4
|
|
180
|
+
if: env.NODE_AUTH_TOKEN != ''
|
|
181
|
+
with:
|
|
182
|
+
node-version: '22'
|
|
183
|
+
registry-url: 'https://registry.npmjs.org'
|
|
184
|
+
|
|
185
|
+
- name: Build the player and the Angular adapter
|
|
186
|
+
if: env.NODE_AUTH_TOKEN != ''
|
|
187
|
+
run: |
|
|
188
|
+
npm --prefix packages/player ci
|
|
189
|
+
npm --prefix packages/player run build
|
|
190
|
+
npm --prefix packages/player run check:pack
|
|
191
|
+
npm --prefix packages/angular ci
|
|
192
|
+
npm --prefix packages/angular run build
|
|
193
|
+
|
|
194
|
+
- name: Publish @steppy/player
|
|
195
|
+
if: env.NODE_AUTH_TOKEN != ''
|
|
196
|
+
run: npm publish ./packages/player --provenance --ignore-scripts
|
|
197
|
+
|
|
198
|
+
- name: Publish @steppy/angular
|
|
199
|
+
if: env.NODE_AUTH_TOKEN != ''
|
|
200
|
+
run: npm publish ./packages/angular/dist --provenance
|