pydiverse-common 0.3.12__tar.gz → 0.3.13__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.
Files changed (48) hide show
  1. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/PKG-INFO +1 -1
  2. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/pyproject.toml +10 -1
  3. pydiverse_common-0.3.13/src/pydiverse/common/py.typed +1 -0
  4. pydiverse_common-0.3.12/.gitattributes +0 -8
  5. pydiverse_common-0.3.12/.github/CODEOWNERS +0 -1
  6. pydiverse_common-0.3.12/.github/PULL_REQUEST_TEMPLATE.md +0 -8
  7. pydiverse_common-0.3.12/.github/dependabot.yml +0 -10
  8. pydiverse_common-0.3.12/.github/scripts/check_deps.sh +0 -22
  9. pydiverse_common-0.3.12/.github/workflows/release.yml +0 -64
  10. pydiverse_common-0.3.12/.github/workflows/tests.yml +0 -53
  11. pydiverse_common-0.3.12/.github/workflows/update-lockfiles.yml +0 -36
  12. pydiverse_common-0.3.12/.pre-commit-config.yaml +0 -74
  13. pydiverse_common-0.3.12/.readthedocs.yaml +0 -17
  14. pydiverse_common-0.3.12/README.md +0 -71
  15. pydiverse_common-0.3.12/docs/Makefile +0 -23
  16. pydiverse_common-0.3.12/docs/make.bat +0 -35
  17. pydiverse_common-0.3.12/docs/source/changelog.md +0 -64
  18. pydiverse_common-0.3.12/docs/source/conf.py +0 -204
  19. pydiverse_common-0.3.12/docs/source/index.md +0 -60
  20. pydiverse_common-0.3.12/docs/source/license.md +0 -5
  21. pydiverse_common-0.3.12/docs/source/reference/api.rst +0 -55
  22. pydiverse_common-0.3.12/pixi.lock +0 -18344
  23. pydiverse_common-0.3.12/pixi.toml +0 -95
  24. pydiverse_common-0.3.12/pytest.ini +0 -3
  25. pydiverse_common-0.3.12/tests/conftest.py +0 -31
  26. pydiverse_common-0.3.12/tests/dtypes/test_dtype_pandas.py +0 -228
  27. pydiverse_common-0.3.12/tests/dtypes/test_dtype_polars.py +0 -116
  28. pydiverse_common-0.3.12/tests/dtypes/test_dtype_pyarrow.py +0 -162
  29. pydiverse_common-0.3.12/tests/dtypes/test_dtype_sqlalchemy.py +0 -134
  30. pydiverse_common-0.3.12/tests/test_util.py +0 -198
  31. pydiverse_common-0.3.12/tests/test_version.py +0 -8
  32. pydiverse_common-0.3.12/typos.toml +0 -2
  33. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/.gitignore +0 -0
  34. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/LICENSE +0 -0
  35. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/docs/package/README.md +0 -0
  36. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/__init__.py +0 -0
  37. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/dtypes.py +0 -0
  38. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/errors/__init__.py +0 -0
  39. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/testing.py +0 -0
  40. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/__init__.py +0 -0
  41. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/computation_tracing.py +0 -0
  42. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/deep_map.py +0 -0
  43. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/deep_merge.py +0 -0
  44. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/disposable.py +0 -0
  45. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/hashing.py +0 -0
  46. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/import_.py +0 -0
  47. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/util/structlog.py +0 -0
  48. {pydiverse_common-0.3.12 → pydiverse_common-0.3.13}/src/pydiverse/common/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydiverse-common
3
- Version: 0.3.12
3
+ Version: 0.3.13
4
4
  Summary: Common functionality shared between pydiverse libraries
5
5
  Author: QuantCo, Inc.
6
6
  Author-email: Martin Trautmann <windiana@users.sf.net>, Finn Rudolph <finn.rudolph@t-online.de>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pydiverse-common"
3
- version = "0.3.12"
3
+ version = "0.3.13"
4
4
  description = "Common functionality shared between pydiverse libraries"
5
5
  authors = [
6
6
  { name = "QuantCo, Inc." },
@@ -29,6 +29,15 @@ dependencies = ["python-box >=7.3.2,<8"]
29
29
 
30
30
  [tool.hatch.build.targets.wheel]
31
31
  packages = ["src/pydiverse"]
32
+ include = [
33
+ "src/pydiverse/common/py.typed", # ensure the marker is shipped
34
+ ]
35
+
36
+ [tool.hatch.build.targets.sdist]
37
+ include = [
38
+ "src/pydiverse/**", # ship package sources
39
+ "src/pydiverse/common/py.typed", # be explicit for sdists too
40
+ ]
32
41
 
33
42
  [tool.ruff]
34
43
  target-version = "py310"
@@ -0,0 +1 @@
1
+ partial
@@ -1,8 +0,0 @@
1
- * text=auto
2
-
3
- *.{diff,patch} binary
4
-
5
- *.{py,yaml,yml,sh} text eol=lf
6
- *.bat text eol=crlf
7
-
8
- pixi.lock merge=binary linguist-language=YAML linguist-generated=true
@@ -1 +0,0 @@
1
- * @pydiverse/code-owners
@@ -1,8 +0,0 @@
1
- <!--
2
- Thank you for pull request.
3
- Below are a few things we ask you kindly to self-check before getting a review. Remove checks that are not relevant.
4
- -->
5
-
6
- # Checklist
7
-
8
- - [ ] Added a `docs/source/changelog.md` entry
@@ -1,10 +0,0 @@
1
- version: 2
2
- updates:
3
- - package-ecosystem: github-actions
4
- directory: /
5
- schedule:
6
- interval: monthly
7
- groups:
8
- gh-actions:
9
- patterns:
10
- - "*"
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -euo pipefail
4
-
5
- contains_dependency_all=true
6
-
7
- while read -r package version; do
8
- if [[ $package == "python" ]]; then
9
- continue
10
- fi
11
-
12
- dependency="${package} ${version}"
13
- contains_dependency=$(yq -r ".project.dependencies | map(. == \"${dependency}\") | any" pyproject.toml)
14
- if [[ $contains_dependency == "false" ]]; then
15
- echo "${dependency} not found in pyproject.toml"
16
- contains_dependency_all=false
17
- fi
18
- done < <(yq -r '.dependencies | to_entries | .[] | "\(.key) \(.value)"' pixi.toml)
19
-
20
- if [[ $contains_dependency_all == "false" ]]; then
21
- exit 1
22
- fi
@@ -1,64 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- tags:
8
- - '*.*.*'
9
- pull_request:
10
-
11
- jobs:
12
- build:
13
- name: Build Package
14
- runs-on: ubuntu-latest
15
- steps:
16
- - name: Checkout branch
17
- uses: actions/checkout@v4
18
-
19
- - name: Set up pixi
20
- uses: prefix-dev/setup-pixi@v0.8.14
21
- with:
22
- environments: release
23
-
24
- - name: Ensure tag matches version
25
- if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
26
- run: |
27
- version="$(pixi exec -s go-yq -- yq .project.version pyproject.toml)"
28
- tag="${{ github.ref_name }}"
29
- if [ "$version" != "$tag" ]; then
30
- echo "Tag $tag does not match version $version"
31
- exit 1
32
- fi
33
-
34
- - name: Build
35
- run: pixi run -e release hatch build
36
-
37
- - name: Check build
38
- run: pixi run -e release twine check dist/*
39
-
40
- - name: List files
41
- run: ls -l dist/
42
-
43
- - name: Upload package
44
- uses: actions/upload-artifact@v4
45
- with:
46
- name: artifact
47
- path: dist/*
48
-
49
- release:
50
- name: Publish Package
51
- if: startsWith(github.ref, 'refs/tags/')
52
- needs: [build]
53
- runs-on: ubuntu-latest
54
- permissions:
55
- id-token: write
56
- contents: write
57
- environment: pypi
58
- steps:
59
- - uses: actions/download-artifact@v4
60
- with:
61
- name: artifact
62
- path: dist
63
- - name: Publish package on PyPi
64
- uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc
@@ -1,53 +0,0 @@
1
- name: Tests
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
- paths-ignore:
9
- - "docs/**"
10
-
11
- jobs:
12
- lint:
13
- name: Pre-commit Checks
14
- timeout-minutes: 5
15
- runs-on: ubuntu-latest
16
- steps:
17
- - name: Checkout branch
18
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
19
- - name: Set up pixi
20
- uses: prefix-dev/setup-pixi@8ca4608ef7f4daeb54f5205b20d0b7cb42f11143 # v0.8.1
21
- - name: Install repository
22
- # needed for generate-col-ops hook
23
- run: pixi run postinstall
24
- - name: pre-commit
25
- run: pixi run pre-commit run -a --color=always --show-diff-on-failure
26
- - name: Check pyproject.toml dependencies
27
- run: pixi run check-deps
28
- test:
29
- name: pytest
30
- runs-on: ${{ matrix.os }}
31
- strategy:
32
- matrix:
33
- os:
34
- - ubuntu-latest
35
- environment:
36
- - py310
37
- - py313
38
- - py310all
39
- - py311all
40
- - py312all
41
- - py313all
42
- timeout-minutes: 5
43
- steps:
44
- - uses: actions/checkout@v4
45
-
46
- - name: Setup Pixi
47
- uses: prefix-dev/setup-pixi@v0.8.14
48
- with:
49
- environments: ${{ matrix.environment }}
50
-
51
- - name: Run tests
52
- run: |
53
- pixi run -e ${{ matrix.environment }} pytest tests -ra ${RUNNER_DEBUG:+-v} --color=yes
@@ -1,36 +0,0 @@
1
- name: Update lockfiles
2
-
3
- permissions:
4
- contents: write
5
- pull-requests: write
6
-
7
- on:
8
- workflow_dispatch:
9
- schedule:
10
- - cron: 0 5 1 * *
11
-
12
- jobs:
13
- pixi-update:
14
- runs-on: ubuntu-latest
15
- steps:
16
- - uses: actions/checkout@v4
17
- - name: Set up pixi
18
- uses: prefix-dev/setup-pixi@v0.8.14
19
- with:
20
- run-install: false
21
- - name: Update lockfiles
22
- run: |
23
- set -euo pipefail
24
- pixi update --json | pixi exec pixi-diff-to-markdown >> diff.md
25
- - name: Create pull request
26
- uses: peter-evans/create-pull-request@v7
27
- with:
28
- token: ${{ secrets.GITHUB_TOKEN }}
29
- commit-message: Update pixi lockfile
30
- title: Update pixi lockfile
31
- body-path: diff.md
32
- branch: update-pixi
33
- base: main
34
- labels: pixi
35
- delete-branch: true
36
- add-paths: pixi.lock
@@ -1,74 +0,0 @@
1
- exclude: ^.pixi$
2
- repos:
3
- - repo: local
4
- hooks:
5
- # ensure pixi environments are up to date
6
- # workaround for https://github.com/prefix-dev/pixi/issues/1482
7
- - id: pixi-install
8
- name: pixi-install
9
- entry: pixi install -e default
10
- language: system
11
- always_run: true
12
- require_serial: true
13
- pass_filenames: false
14
- # ruff
15
- - id: ruff
16
- name: ruff
17
- entry: pixi run -e lint ruff check --fix --exit-non-zero-on-fix --force-exclude
18
- language: system
19
- types_or: [python, pyi]
20
- require_serial: true
21
- - id: ruff-format
22
- name: ruff-format
23
- entry: pixi run -e lint ruff format --force-exclude
24
- language: system
25
- types_or: [python, pyi]
26
- require_serial: true
27
- # mypy
28
- # - id: mypy
29
- # name: mypy
30
- # entry: pixi run -e lint mypy
31
- # language: system
32
- # types: [python]
33
- # require_serial: true
34
- # taplo
35
- - id: taplo
36
- name: taplo
37
- entry: pixi run -e lint taplo format
38
- language: system
39
- types: [toml]
40
- # pre-commit-hooks
41
- - id: trailing-whitespace-fixer
42
- name: trailing-whitespace-fixer
43
- entry: pixi run -e lint trailing-whitespace-fixer
44
- language: system
45
- types: [text]
46
- - id: end-of-file-fixer
47
- name: end-of-file-fixer
48
- entry: pixi run -e lint end-of-file-fixer
49
- language: system
50
- types: [text]
51
- - id: check-merge-conflict
52
- name: check-merge-conflict
53
- entry: pixi run -e lint check-merge-conflict --assume-in-merge
54
- language: system
55
- types: [text]
56
- exclude: ".rst$"
57
- # typos
58
- - id: typos
59
- name: typos
60
- entry: pixi run -e lint typos --force-exclude
61
- language: system
62
- types: [text]
63
- require_serial: true
64
- # insert-license
65
- - id: insert-license
66
- name: insert-license
67
- entry: >-
68
- pixi run -e lint
69
- insert-license
70
- --license-base64 Q29weXJpZ2h0IChjKSBRdWFudENvIGFuZCBweWRpdmVyc2UgY29udHJpYnV0b3JzIDIwMjUtMjAyNQpTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCg==
71
- --dynamic-years
72
- --comment-style "#"
73
- language: system
74
- types: [python]
@@ -1,17 +0,0 @@
1
- # Read the Docs configuration file
2
- # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
-
4
- version: 2
5
- build:
6
- os: ubuntu-22.04
7
- tools:
8
- python: mambaforge-latest
9
- commands:
10
- - mamba install -c conda-forge -c nodefaults pixi
11
- - pixi run -e docs postinstall
12
- - pixi run -e docs docs
13
- - pixi run -e docs readthedocs
14
- sphinx:
15
- configuration: docs/source/conf.py
16
- formats:
17
- - pdf
@@ -1,71 +0,0 @@
1
- # pydiverse.common
2
-
3
- [![CI](https://img.shields.io/github/actions/workflow/status/pydiverse/pydiverse.common/tests.yml?style=flat-square&branch=main&label=tests)](https://github.com/pydiverse/pydiverse.common/actions/workflows/tests.yml)
4
- [![Docs](https://readthedocs.org/projects/pydiversecommon/badge/?version=latest&style=flat-square)](https://pydiversecommon.readthedocs.io/en/latest)
5
- [![pypi-version](https://img.shields.io/pypi/v/pydiverse-common.svg?logo=pypi&logoColor=white&style=flat-square)](https://pypi.org/project/pydiverse-common)
6
- [![conda-forge](https://img.shields.io/conda/pn/conda-forge/pydiverse-common?logoColor=white&logo=conda-forge&style=flat-square)](https://prefix.dev/channels/conda-forge/packages/pydiverse-common)
7
-
8
- A base package for different libraries in the pydiverse library collection.
9
- This includes functionality like a type-system for tabular data (SQL and DataFrame).
10
- This type-system is used for ensuring reliable operation of the pydiverse library
11
- with various execution backends like Pandas, Polars, and various SQL dialects.
12
-
13
- ## Installation
14
-
15
- To install pydiverse common try this:
16
-
17
- ```bash
18
- git clone https://github.com/pydiverse/pydiverse.common.git
19
- cd pydiverse.common
20
-
21
- # Create the environment, activate it and install the pre-commit hooks
22
- pixi install
23
- pixi run pre-commit install
24
- ```
25
-
26
- ## Testing
27
-
28
- Tests can be run with:
29
-
30
- ```bash
31
- pixi run pytest
32
- ```
33
-
34
- ## Packaging and publishing to pypi and conda-forge using github actions
35
-
36
- - bump version number in [pyproject.toml](pyproject.toml)
37
- - set correct release date in [changelog.md](docs/source/changelog.md)
38
- - push increased version number to `main` branch
39
- - tag commit with `git tag <version>`, e.g. `git tag 0.7.0`
40
- - `git push --tags`
41
-
42
- The package should appear on https://pypi.org/project/pydiverse-common/ in a timely manner. It is normal that it takes
43
- a few hours until the new package version is available on https://conda-forge.org/packages/.
44
-
45
- ### Packaging and publishing to Pypi manually
46
-
47
- Packages are first released on test.pypi.org:
48
-
49
- - bump version number in [pyproject.toml](pyproject.toml) (check consistency with [changelog.md](docs/source/changelog.md))
50
- - push increased version number to `main` branch
51
- - `pixi run -e release hatch build`
52
- - `pixi run -e release twine upload --repository testpypi dist/*`
53
- - verify with https://test.pypi.org/search/?q=pydiverse.common
54
-
55
- Finally, they are published via:
56
-
57
- - `git tag <version>`
58
- - `git push --tags`
59
- - Attention: Please, only continue here, if automatic publishing fails for some reason!
60
- - `pixi run -e release hatch build`
61
- - `pixi run -e release twine upload --repository pypi dist/*`
62
-
63
- ### Publishing package on conda-forge manually
64
-
65
- Conda-forge packages are updated via:
66
-
67
- - Attention: Please, only continue here, if automatic conda-forge publishing fails for longer than 24h!
68
- - https://github.com/conda-forge/pydiverse-common-feedstock#updating-pydiverse-common-feedstock
69
- - update `recipe/meta.yaml`
70
- - test meta.yaml in pydiverse common repo: `conda-build build ../pydiverse-common-feedstock/recipe/meta.yaml`
71
- - commit `recipe/meta.yaml` to branch of fork and submit PR
@@ -1,23 +0,0 @@
1
- # Minimal makefile for Sphinx documentation
2
- #
3
-
4
- # You can set these variables from the command line, and also
5
- # from the environment for the first two.
6
- SPHINXOPTS ?=
7
- SPHINXBUILD ?= sphinx-build
8
- SOURCEDIR = source
9
- BUILDDIR = build
10
-
11
- # Put it first so that "make" without argument is like "make help".
12
- help:
13
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
-
15
- .PHONY: help Makefile
16
-
17
- # Catch-all target: route all unknown targets to Sphinx using the new
18
- # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
- %: Makefile
20
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
21
-
22
- livehtml:
23
- sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) --watch ../src $(O)
@@ -1,35 +0,0 @@
1
- @ECHO OFF
2
-
3
- pushd %~dp0
4
-
5
- REM Command file for Sphinx documentation
6
-
7
- if "%SPHINXBUILD%" == "" (
8
- set SPHINXBUILD=sphinx-build
9
- )
10
- set SOURCEDIR=source
11
- set BUILDDIR=build
12
-
13
- %SPHINXBUILD% >NUL 2>NUL
14
- if errorlevel 9009 (
15
- echo.
16
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
17
- echo.installed, then set the SPHINXBUILD environment variable to point
18
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
19
- echo.may add the Sphinx directory to PATH.
20
- echo.
21
- echo.If you don't have Sphinx installed, grab it from
22
- echo.https://www.sphinx-doc.org/
23
- exit /b 1
24
- )
25
-
26
- if "%1" == "" goto help
27
-
28
- %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
29
- goto end
30
-
31
- :help
32
- %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
33
-
34
- :end
35
- popd
@@ -1,64 +0,0 @@
1
- # Changelog
2
-
3
- ## 0.3.12 (2025-08-21)
4
- - fixed Dtype.to_pandas() for parameterized String and Decimal types
5
-
6
- ## 0.3.11 (2025-08-21)
7
- - fixed __eq__, __hash__, and __repr__ for types with parameters
8
- - import string length from sqlalchemy VARCHAR(n) type
9
-
10
- ## 0.3.10 (2025-08-21)
11
- - implemented String with max_length argument for SQL VARCHAR(n) generation
12
- - implemented Decimal with precision and scale arguments
13
-
14
- ## 0.3.9 (2025-08-21)
15
- - fix enum pyarrow dtype
16
-
17
- ## 0.3.8 (2025-08-19)
18
- - fixed util.hashing.hash_polars_dataframe for simple dataframe
19
-
20
- ## 0.3.7 (2025-08-19)
21
- - support util.hashing.hash_polars_dataframe
22
-
23
- ## 0.3.6 (2025-08-01)
24
- - hack structlog / dask / pytest capture incompatibility
25
- (structlog._output.stderr != sys.stderr leads to pickle error)
26
-
27
- ## 0.3.5 (2025-06-27)
28
- - added enum type
29
-
30
- ## 0.3.4 (2025-06-10)
31
- - fixed pypi package dependencies
32
-
33
- ## 0.3.3 (2025-06-08)
34
- - improved support of None and List type
35
- - bug fixes in type conversion functions
36
-
37
- ## 0.3.2 (2025-06-08)
38
- - pydiverse.common.__version__ (implemented via importlib.metadata)
39
-
40
- ## 0.3.1 (2025-06-08)
41
- - fixed some type conversions (mostly Duration)
42
-
43
- ## 0.3.0 (2025-06-08)
44
- - rename Uint type to UInt
45
-
46
- ## 0.2.1 (2025-06-06)
47
- - also support to_xxx() for generic Int and Float Dtype classes
48
-
49
- ## 0.2.0 (2025-06-06)
50
- - moved many utility functions from `pydiverse.pipedag` to `pydiverse.common`;
51
- this includes deep_map, ComputationTracer, @disposable, @requires, stable_hash,
52
- load_object, and structlog initialization
53
- - Decimal becomes subtype of Float
54
-
55
- ## 0.1.0 (2022-09-01)
56
- Initial release.
57
-
58
- - `@materialize` annotations
59
- - flow definition with nestable stages
60
- - zookeeper synchronization
61
- - postgres database backend
62
- - Prefect 1.x and 2.x support
63
- - multi-processing/multi-node support for state exchange between `@materialize` tasks
64
- - support materialization for: pandas, sqlalchemy, raw sql text, pydiverse.transform