Compare commits

...

180 Commits

Author SHA1 Message Date
Harmen Stoppels
d675ecba33 builtin: use absolute imports again 2025-05-21 14:00:14 +02:00
Massimiliano Culpo
5879724a2a builtin: remove spack.variant imports (#50576)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-21 11:35:06 +02:00
Harmen Stoppels
bfc52d6f50 spack repo migrate: fix order of if-elif (#50579) 2025-05-21 11:31:26 +02:00
Harmen Stoppels
0107792a9e archspec: change module from archspec to _vendoring.archspec (#50450) 2025-05-21 11:25:02 +02:00
Massimiliano Culpo
de6f07094e builtin: remove unnecessary use of archspec.cpu (#50582)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-21 10:09:21 +02:00
Harmen Stoppels
63c60c18c7 ci: sync packages to python/spack_repo instead of spack_repo/ (#50589) 2025-05-21 09:10:01 +02:00
Alex Richert
f01a442ad4 cmd/mirror.py: match CLI specs to concrete specs in env (#50307)
* cmd/mirror.py: match CLI specs to concrete specs in env

* Allow using 'mirror create -a/--all' to match multiple concrete specs

* remove unit test preventing 'mirror create -a <spec>'

* Add test_mirror_spec_from_env() unit test (cmd/mirror.py)
2025-05-21 05:40:14 +00:00
Alberto Sartori
cca0eb6873 justbuild: add v1.5.1 and v1.5.2 (#50566)
* justbuild: add v1.5.1
* justbuild: add v1.5.2
2025-05-20 23:33:40 -06:00
Todd Gamblin
c39725a9e6 bugfix: add build system imports to new packages (#50587)
Since #50452, build systems are no longer in core and need their own imports.

Specifically, in addition to:

```python
from spack.package import *
```

you now also need, e.g.:

```python
from spack_repo.builtin.build_systems.python import PythonPackage
```

Or similar for other build systems, or things will break.

- [x] Fix `py-deprecat` package
- [x] Fix `cryoef` package

Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
2025-05-20 18:26:24 -07:00
Daniele Colombo
e58351f421 py-maturin: update rust dependency version (#50485) 2025-05-20 17:18:40 -07:00
Daniele Colombo
2a028144ba cryoef: new package (#50486) 2025-05-20 17:05:34 -07:00
Adam J. Stewart
22a7419235 py-numpy: add v2.2.6 (#50524) 2025-05-20 16:28:04 -07:00
Briffou
7e21357045 mgis: wrong version for tfel 5.0.0 (#50523) 2025-05-20 16:26:55 -07:00
Adam J. Stewart
cf7e1643c3 py-distributed: Python 3.12+ not supported before 2022.6.1 (#50525) 2025-05-20 16:25:22 -07:00
Adam J. Stewart
158ddf72cf py-datacube: add v1.9.3 (#50526) 2025-05-20 16:22:11 -07:00
Alec Scott
9567b13b4f direnv: add v2.36.0 (#50527)
* direnv: add v2.36.0
* Fix go version constraint
2025-05-20 16:19:22 -07:00
Alec Scott
f6da60b541 fzf: add v0.62.0 (#50528) 2025-05-20 16:18:14 -07:00
Alec Scott
3caff2c5a0 goimports: add v0.33.0 (#50529)
* goimports: add v0.33.0
* Fix depends_on go version constraint
2025-05-20 16:12:08 -07:00
Alec Scott
091a8a4734 gopls: add v0.18.1 (#50530) 2025-05-20 16:11:10 -07:00
Alec Scott
cfcee7d092 hugo: add v0.147.3 (#50531) 2025-05-20 16:09:23 -07:00
Alec Scott
c6d04286c5 kubectl: add v1.33.1 (#50532)
* kubectl: add v1.33.1
* Fix go version constraint
2025-05-20 16:08:28 -07:00
Wouter Deconinck
3c3e1c6d30 rdma-core: add through v57.0 (#50535) 2025-05-20 16:06:40 -07:00
Buldram
3669f0356b chafa: add v1.16.0 (#50536) 2025-05-20 16:05:12 -07:00
Eddie Nolan
dd72df89d6 mpfr: Apply patches for versions 4.1.0-4.2.1 (#50537)
In particular, the 4.2.1 patches address a bug that prevents building
gcc with recent clang and glibc.

See details here: https://www.mpfr.org/mpfr-4.2.1/#fixed
2025-05-20 16:01:17 -07:00
Fernando Ayats
445667adbe py-py-spy: fix linkage with libunwind (#50542) 2025-05-20 15:58:17 -07:00
Adam J. Stewart
3ec4797513 py-shapely: add v2.1.1 (#50544) 2025-05-20 15:55:59 -07:00
Dennis Klein
50e8f6395c fairlogger: add new v2.2.0 (#50545)
* remove deprecated
   * remove obsolete conditions
* deprecate remaining `@:1`
2025-05-20 15:54:58 -07:00
Dennis Klein
bf9426a48d fairmq: conflicts boost@1.88: (#50546) 2025-05-20 15:50:30 -07:00
Wouter Deconinck
bf08b1e2c6 openldap: depends_on uuid (#50557) 2025-05-20 15:43:36 -07:00
Wouter Deconinck
687137a057 e2fsprogs: depends_on uuid (#50559) 2025-05-20 15:41:51 -07:00
Patrick Lavin
6c4c9985d5 sst-core: depends on c (#50561) 2025-05-20 15:30:05 -07:00
Harmen Stoppels
2927e708bc PackageBase: make _update_external_dependencies private (#50580) 2025-05-20 15:27:35 -07:00
Bram Veenboer
a9d3bd8d7f Update pynvml package (#50398)
* Add dependency on Python <= 3.11 for 8.0.4
   The SafeConfigParser was removed in Python 3.12.
* Add version 11.5.3
* Add version 12.2.0
* Update order of version from newest to oldest
* Remove unneeded requirement on python@3.6
   Since Spack only has Python 3.6 or newer anyway.

* Update license to BSD-3-Clause from version 12 onwards

* Set minimum Python version to 3.9 from version 12 onwards

* Add py-nvidia-ml-py dependency from version 12 onwards

* Update py-nvidia-ml-py package

- Change license to BSD-2-Clause
- Add many more versions

* Apply black formatting

* Add url_for_version helper function

Co-authored-by: Tamara Dahlgren <35777542+tldahlgren@users.noreply.github.com>

* Remove spaces on empty line

* Apply spack style

* Move depends_on directive

---------

Co-authored-by: Tamara Dahlgren <35777542+tldahlgren@users.noreply.github.com>
2025-05-20 15:14:03 -07:00
Harmen Stoppels
64fc66ab48 ci: import-check continue-on-error: true (#50581)
Allow other CI checks to continue even if the circular import check fails.

Circular imports are often indicative of code that needs to be restructured, but there
are still places where we need to add them. This allows CI to continue, so that if CI is
passing *except* for a problematic import, we can still force merge and accept a bit
of technical debt to admit a useful feature.  Also, this allows people to keep working
while they fix their circular import issues, without being blind to CI results.

- [x] update ci workflow: import-check continue-on-error: true
2025-05-20 15:50:14 -06:00
Harmen Stoppels
c86b2860aa docs: fix a few typos (#50573)
* docs: fix a few typos

* fix a few issues in packaging_guide.rst

* more fixes
2025-05-20 13:24:54 -04:00
Seth R. Johnson
d991ebbe09 celeritas: new versions through 0.6 (#50197)
* Add v0.5.2

* celeritas: new version

* celeritas: new version 0.6

* Add sanity check

* celeritas: add Ben as mantainer

* Enable celeritas covfie variant

* Fix missing covfie requirement

* Fix covfie/hip conflict

* fixup! Fix covfie/hip conflict

* Add new covfie version dependency

* Update covfie dependencies

* fixup! Update covfie dependencies

* try removing references to 0.6.1

* Style

* fixup! try removing references to 0.6.1

* Fix hep stack
2025-05-20 11:00:01 -04:00
Hugh Carson
3f00eeabd2 strumpack: Propagate cuda_arch to slate (#50460) 2025-05-20 07:51:09 -07:00
John Pennycook
b77d9b87f8 py-codebasin: new package (#50549) 2025-05-20 07:46:47 -07:00
jordialcaraz
e46dae9eb6 [Tau package] patch for rocm 6.2, do not configure for rocprofiler by default, only if enabled with +rocprofiler (#50555)
* Updateing TAU recipe to add patch file for ROCM>6.2

* Create tau-rocm-disable-rocprofiler-default.patch

* Changing from version check to +rocm

* [@spackbot] updating style on behalf of jordialcaraz

---------

Co-authored-by: jordialcaraz <jordialcaraz@users.noreply.github.com>
2025-05-20 07:31:34 -07:00
Kyle Brindley
760fc05da3 py-waves: add v0.12.9 -> v0.13.1 (#50090)
* FEAT: add versions 0.12.9->0.13.1

* MAINT: remove developer inline note after release with updated minimum salib spec

* MAINT: build scripts changed in 0.12.10

* MAINT: style guide updates
2025-05-20 10:19:00 -04:00
Robert Maaskant
e07503e4ac rclone: add v1.69.2 (#50426)
* rclone: add v1.69.2

* rclone: explicit type=build deps

Co-authored-by: Alec Scott <hi@alecbcs.com>

---------

Co-authored-by: Alec Scott <hi@alecbcs.com>
2025-05-20 09:53:44 -04:00
Wouter Deconinck
aba8d85b4d cyrus-sasl: depends_on krb5 (#50556) 2025-05-20 05:55:03 -06:00
Mikael Simberg
546625cdb8 aws-ofi-nccl: add v1.14.2 (#50558) 2025-05-20 13:53:17 +02:00
Fernando Ayats
d951c4f112 py-watchfiles: add version 1.0.5 (#50539)
* py-watchfiles: add version 1.0.5

* py-watchfiles: add @viperML to maintainers
2025-05-20 06:58:31 -04:00
Harmen Stoppels
ef2b596e3f msvc: fix imports (#50543) 2025-05-20 12:19:55 +02:00
Harmen Stoppels
f07789febf builtin: fix a few imports (#50570) 2025-05-20 12:11:27 +02:00
Bill Williams
4316c4fb00 Package updates: Score-P 9, OTF2 3.1, OPARI2 2.9, Cube 4.9 (#49659)
Things done:

* Added variants for llvm plugin and gcc plugin
* Made binutils a proper variant
* Updated dependencies and their associated packages where applicable
* Modernization in progress: idiomatic use of `with_or_without` and `enable_or_disable` where it's trivial, transition towards `spec.satisfies(X)` rather than `X in spec`

TODO:
[x] Clean up RC entry/entries and add final tarball when available
[x] Be consistent about `spec.satisfies` everywhere: consistent enough for now
[x] Add `+mpi_f08` variant (is there a standard name for this?) (for 9.1, as commented)

---------

Co-authored-by: William Williams <william.williams@tu-dresden.de>
Co-authored-by: wrwilliams <wrwilliams@users.noreply.github.com>
Co-authored-by: Todd Gamblin <tgamblin@llnl.gov>
2025-05-20 01:14:40 -07:00
Harmen Stoppels
72871ebde8 spack.package: re-export PackageBase, register_builder and Builder (#50547) 2025-05-20 09:21:10 +02:00
Wouter Deconinck
3b2163c718 dcap: depends_on krb5 (#50553) 2025-05-19 19:29:44 -06:00
Wouter Deconinck
16067871e2 r: add v4.5.0 (#50554) 2025-05-19 18:26:17 -06:00
Wouter Deconinck
53ae44163d krb5: depends_on libedit (#50552) 2025-05-19 18:12:00 -06:00
Sam Reeve
02880a866c exaca: add new release (#50548) 2025-05-19 16:33:36 -06:00
Krishna Chilleri
a242e77e81 hpc-beeflow: add github branch and remove v0.1.9 (#50518)
* remove 0.1.9 version and downgrade version of cwl-utils

* add github branch
2025-05-19 14:17:21 -07:00
Robert Maaskant
e9b822a86a py-pip: add v25.1 and v25.1.1 (#50433) 2025-05-19 20:21:45 +02:00
Mikael Simberg
3ea16482a6 berkeley-db: silence warning/error about incompatible pointer types with GCC 15 (#50483) 2025-05-19 20:04:47 +02:00
Thomas-Ulrich
a13557ac94 add easi 1.6.1 (#50465) 2025-05-19 08:51:41 -07:00
Matt Thompson
69e9841262 mapl: add v2.53.4 (#50515) 2025-05-19 08:50:17 -07:00
Carlos Bederián
65279dc6f3 ucc: add v1.4.4 (#50519) 2025-05-19 08:49:45 -07:00
Lin Guo
3623d5d20e su2: capitalize a couple env vars required by SU2 (#50495) 2025-05-19 07:56:13 -07:00
Dave Keeshan
50cc87500c xnedit: add v1.6.3, allow motif to be disabled during build as mo… (#50500) 2025-05-19 07:51:36 -07:00
Robert Maaskant
b4e039ad7b py-setuptools: add v79.0.1 (#50369) 2025-05-19 07:39:58 -07:00
Harmen Stoppels
6227bd7986 build systems: import from spack.package (#50541) 2025-05-19 12:18:36 +02:00
Massimiliano Culpo
da9fa24d15 Remove build_systems.intel from builtin repo (#50540)
Now that build systems are finally part of repos,
we can remove the deprecated `intel` build system.

In the rare case some custom repo has recipes using
that build system, they can migrate to v2 and add
`intel` back to their repository.

Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-19 11:57:45 +02:00
Harmen Stoppels
2929ea02a1 Move builders into builtin repo (#50452)
Builders and package classes refer to packages from the builtin package
repo and are often modified together with packages. That means that
these classes should move into `spack_repo.builtin`.

* move `spack.build_systems` -> `spack_repo.builtin.build_systems`

* Remove the following re-exports from the `spack.package` module:
  - `AspellDictPackage`                 - `LuaPackage`
  - `AutotoolsPackage`                  - `MakefilePackage`
  - `BundlePackage`                     - `MavenPackage`
  - `CachedCMakePackage`                - `MesonPackage`
  - `cmake_cache_filepath`              - `MSBuildPackage`
  - `cmake_cache_option`                - `NMakePackage`
  - `cmake_cache_path`                  - `OctavePackage`
  - `cmake_cache_string`                - `PerlPackage`
  - `CargoPackage`                      - `PythonExtension`
  - `CMakePackage`                      - `PythonPackage`
  - `generator`                         - `QMakePackage`
  - `CompilerPackage`                   - `RacketPackage`
  - `CudaPackage`                       - `RPackage`
  - `Package`                           - `ROCmPackage`
  - `GNUMirrorPackage`                  - `RubyPackage`
  - `GoPackage`                         - `SConsPackage`
  - `IntelPackage`                      - `SIPPackage`
  - `IntelOneApiLibraryPackageWithSdk`  - `SourceforgePackage`
  - `IntelOneApiLibraryPackage`         - `SourcewarePackage`
  - `IntelOneApiStaticLibraryList`      - `WafPackage`
  - `IntelOneApiPackage`                - `XorgPackage`
  - `INTEL_MATH_LIBRARIES`

* update mock packages to repo v2.0 and add copies of packages/build
  systems they use from builtin

* add missing imports to build systems in `package.py` from builtin
  and test repos

* update various tests

This PR is breaking because of removal of various names from
 `spack.package`, but breakage should be minimal thanks to #50496, which
 ensures the above names are always imported in repo v1 packages.

Specifically this PR breaks imports like the following in `package.py` files:

```python
from spack.package import Package
```

but if your repo is v1.0 (see `spack repo list`) and has the following
much more common pattern:

```python
from spack.package import *
```

nothing should break.
2025-05-18 20:31:20 -07:00
downloadico
c99e654650 meme: add version 5.5.7 (#50517) 2025-05-18 18:45:10 -07:00
Chris White
8ba4b3c103 forward shared variant to parmetis/metis (#50461) 2025-05-17 08:13:11 -06:00
Afzal Patel
240e669793 ci: remove ck from ML ROCm stack (#50508) 2025-05-17 13:33:22 +02:00
Luc Berger
2bda9159d3 kokkos ecosystem: release 4.6.01 (#50271) 2025-05-16 20:47:54 -06:00
John W. Parent
b12a64d687 msmpi package: fix build (#50263)
Restores ability to build MSMPI from source.

* Modernizes the MSMPI package
* Strips out MSMPI build system that is long deprecated
* Adds patches to re-introduce missing functionality from said build system
* Adds builds + support for dependencies no longer fetched by build system
2025-05-16 22:03:33 +00:00
Massimiliano Culpo
70f4eef020 test_migrate_diff: mark xfail on Windows for now (#50513)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-16 18:35:42 +02:00
Harmen Stoppels
7a0c5671dc spack repo migrate: support v1 -> v2 migration for package api (#50507) 2025-05-16 17:18:33 +02:00
downloadico
45402d7850 apptainer: added new version 1.4.1 (#50493)
* apptainer: added new version 1.4.1

* set required version of GO to 1.23.6 for apptainer 1.4.1.
2025-05-16 09:06:17 -06:00
Jon Rood
31d48ba011 netcdf_c: depends on cxx when building with CMake (#50392) 2025-05-16 16:36:16 +02:00
pauleonix
4d55fe6284 cuda: add v12.9 and new Blackwell targets (#50284)
* cuda: Add 12.9 and new Blackwell targets

Including family-specific architecture features like sm_100f

* tau, caliper: Add cuda v12.9 conflict

Legacy nvtx was dropped.

* petsc: "libnvToolsExt.a" -> "libnvtx3interop.a" for cuda@12.9: and petsc@:3.23.1

* legion: Add upper bound to cuda version range

Avoid build failure due to CUDA driver API incompatibility.
See https://github.com/StanfordLegion/legion/issues/1864

---------

Co-authored-by: Satish Balay <balay@mcs.anl.gov>
2025-05-16 15:17:50 +02:00
Harmen Stoppels
b8c31b22a5 builtin: crlf -> lf (#50505) 2025-05-16 04:09:20 -06:00
Tamara Dahlgren
9738f1c026 test/cmd/compiler.py: use mock packages (#50362)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
Co-authored-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-16 11:53:36 +02:00
Ryan Krattiger
e3a7d5763f Sync CI config to spack/spack-packages (#50497) 2025-05-16 11:39:11 +02:00
Harmen Stoppels
e7e37899f4 Auto-import spack.build_systems._package_api_v1 (#50496)
When loading packages from a v1.0 repository, inject a line

from spack.build_systems._package_api import *

This allows removal of certain names in `spack.package` as part of api
v2 without breaking backward compatibility in Spack.
2025-05-16 11:07:06 +02:00
Veselin Dobrev
6e98f88c51 glew: add patch for mesa >= 24.0.0 (#50401)
Co-authored-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-16 08:19:23 +02:00
Raffaele Solcà
600336eba5 Add dla-future v0.10.0 (#50494) 2025-05-15 23:55:13 -06:00
Tamara Dahlgren
56df6b414d tests/compilers/libraries.py: use mock packages (#50442) 2025-05-16 07:49:07 +02:00
Thomas Helfer
5e617be0ad New versions of TFEL (5.0.1, 4.2.3, 4.1.4, 4.0.5, 3.4.8, 3.3.7, 3.2.12, 3.1.15 and 3.0.15) and MGIS (2.2.1 and 3.0.1) (#50501)
* update tfel package
* Update MGIS package
* add support for Version 5.0.1, 4.2.3, 4.1.4, 4.0.5, 3.4.8, 3.3.7, 3.2.12, 3.1.15 and 3.0.15
* add support for Versions 3.0.1 and 2.2.1
2025-05-15 23:38:56 -06:00
Paul R. C. Kent
0f44e42a70 py-pyscf: add v2.9.0 (#50350)
* py-pyscf: add v2.9.0
* Remove cmake 4 conflict
* require setuptools 61.0+
2025-05-15 22:08:55 -07:00
Lucas Frérot
ff86b3acdd tamaas: added version 2.8.1 (#50488) 2025-05-15 17:59:30 -07:00
Andrey Perestoronin
b4dd42bed7 add intel-oneapi-ccl 2021.15.2 package (#50490) 2025-05-15 17:12:47 -06:00
Dom Heinzeller
7f8c5bd4ca Various package updates from JCSDA spack-stack-dev: crtm, g2, grads, hdf, ip, met, metplus, py-kiwisolver, py-pyogrio, py-ruamel-yaml-clib, wgrib2 (#50108)
* Update crtm from jcsda/spack-stack-dev
* Update grads from jcsda/spack-stack-dev
* Update hdf from jcsda/spack-stack-dev
* Update ip from jcsda/spack-stack-dev
* Update met from jcsda/spack-stack-dev
* Update metplus from jcsda/spack-stack-dev
* Update py-kiwisolver from jcsda/spack-stack-dev
* Update py-pyogrio from jcsda/spack-stack-dev
* Update py-ruamel-yaml-clib from jcsda/spack-stack-dev
* Update wgrib2 from jcsda/spack-stack-dev
2025-05-15 14:19:57 -07:00
Victor A. P. Magri
ac08428f20 hypre: fix ~fortran variant (#50480)
* hypre: fix ~fortran variant
* Fix typos
2025-05-15 11:10:25 -07:00
Tamara Dahlgren
37abfc7541 test_builtin_repo: add a marker to skip the test if builtin is not available (#50476) 2025-05-15 19:50:42 +02:00
Harmen Stoppels
f96def28cb spack repo migrate: add missing imports (#50491) 2025-05-15 18:16:23 +02:00
Seth R. Johnson
4b1f126de7 pre-commit: new versions 4.1 and 4.2 (#50492) 2025-05-15 10:40:57 -05:00
Tamara Dahlgren
0d586695a0 tests/cmd/external.py: use mock packages (#50363)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
Co-authored-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-15 16:59:35 +02:00
Tamara Dahlgren
f1ba23316b test/compilers/conversion.py: use mock packages (#50391) 2025-05-15 12:14:15 +02:00
Massimiliano Culpo
3891305005 Remove a unit test, replace with an audit (#50484)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-15 11:45:28 +02:00
Sergi Siso
cf20d677a1 py-psyclone: remove unneeded dependency (#50367) 2025-05-14 21:54:22 -06:00
Tamara Dahlgren
5c5b0d80d2 tests/bindist: test_{relative|default}_rpaths* ignore arch target (#50357) 2025-05-14 17:41:50 -07:00
Massimiliano Culpo
f8538a1b1c Parse % as ^ in specs (#49808)
This PR modifies the parser, so that `%` is parsed as a `DEPENDENCY`, and all
node properties that follow are associated to the name after the `%`. e.g.,
in `foo %gcc +binutils` the `+binutils` refers to `gcc` and not to `foo`.

`%` is still parsed as a build-type dependency, at the moment.

Environments, config files and `package.py` files from before Spack v1.0 may have
spec strings with package variants, targets, etc. *after* a build dependency, and these
will need to be updated. You can use the `spack style --spec-strings` command to do this.

To see what strings will be parsed differently under Spack v1.0, run:

```
spack style --spec-strings FILES
```

where `FILES` is a list of filenames that may contain old specs. To update these spec
strings so that they parse correctly under both Spack 1.0 and Spack 0.x, you can run:

```
spack style --fix --spec-strings FILES
```

In the example above, `foo %gcc +binutils` would be rewritten as `foo +binutils %gcc`,
which parses the same in any Spack version.

In addition, this PR fixes several issues with `%` dependencies:

- [x] Ensure we can still constrain compilers on reuse
- [x] Ensure we can reuse a compiler by hash
- [x] Add tests

---------

Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-14 16:17:34 -06:00
Patrick Lavin
1f0aaafc71 spatter: new package (#50326)
* add spatter package
* update license, change default backend
* move package to new location
* rearrage spack directives

---------

Co-authored-by: Patrick Lavin <prlavin@sandia.gov>
Co-authored-by: plavin <plavin@users.noreply.github.com>
2025-05-14 14:17:24 -07:00
Adam J. Stewart
fb8d6e8ea0 py-jsonargparse: add v4.39.0 (#50376) 2025-05-14 13:57:21 -07:00
Adam J. Stewart
756721c6dd py-kornia: add v0.8.1 (#50377) 2025-05-14 13:56:03 -07:00
Paul
153c3f03c8 jacamar-ci: add v0.26.0 (#50459) 2025-05-14 13:38:46 -04:00
Robert Maaskant
c4f51ff60d py-twine: add v6.1.0 (#50434)
* py-twine: add v6.1.0
* py-twine: add python version deps
2025-05-14 10:27:25 -07:00
Robert Maaskant
da650aac0c gh: add v2.72.0 (#50425) 2025-05-14 10:34:21 -04:00
Robert Maaskant
782b5c30d2 glab: add v1.57.0 (#50424) 2025-05-14 10:33:40 -04:00
Harmen Stoppels
1e9be97a25 Update sys.path references (#50466) 2025-05-14 10:25:00 +00:00
Alberto Invernizzi
bd5f277e17 hpx: remove unused patch file (#50463) 2025-05-14 12:01:13 +02:00
Tamara Dahlgren
719fd6fb43 test_load_json_specfiles: skip virtual reconstruction (#50361) 2025-05-14 02:32:47 -06:00
Harmen Stoppels
abcc641373 Fix spack.repo.is_package_module (#50464) 2025-05-14 10:22:28 +02:00
G-Ragghianti
abcef565a8 spack env activate: respect --without-view when --temp (#50438) 2025-05-14 09:58:38 +02:00
Harmen Stoppels
00d65b75a1 remove std_cmake_args, std_pip_args, std_meson_args (#50462)
The "magic" globals `std_cmake_args`, `std_pip_args` and `std_meson_args` were deprecated in Spack 0.23 and removed in this commit, because they are no longer static and don't make sense to be defined for packages that do not depend on cmake, pip or meson.

Additionally, removing them ensures that `build_environment.py` no longer depends on builders, which will soon be moved out of `spack` into the `spack_repo` package.

The audit that scans whether these globals are used is not removed.
2025-05-14 09:51:42 +02:00
Massimiliano Culpo
de4a9e867d py-torch: rework patches to avoid secondary rate limits (#50455)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-14 09:48:58 +02:00
ddement
56f40cc1c8 openturbine: Update dependencies and configuration in anticipation of beta release (#50355)
* Updated OpenTurbine package to reflect new configuration options
2025-05-13 13:07:44 -07:00
John W. Parent
ae2c9d1b99 Win: Restore oneAPI env setup (#50444)
oneAPI env setup was prematurely removed in compilers-as-nodes update
(#45189 - removed from the compiler class but not added to the
associated compiler package): restore it.
2025-05-13 12:22:49 -06:00
Stephen Nicholas Swatman
af24280c96 benchmark: add v1.9.3 (#50428)
This commit adds v1.9.3 of Google Benchmark.
2025-05-13 11:10:18 -07:00
Robert Maaskant
8daf4bc215 py-pyproject-hooks: add v1.1.0 and v1.2.0 (#50435) 2025-05-13 11:02:37 -07:00
Robert Maaskant
dabf7e9de8 py-distlib: add v0.3.8 and v0.3.9 (#50436)
* py-distlib: add v0.3.8 and v0.3.9

* py-distlib: github.com as homepage
2025-05-13 10:03:13 -07:00
Zack Galbreath
9cfb973d69 ci: recalibrate per-package resource requests (#50406) 2025-05-13 09:28:11 -05:00
Seth R. Johnson
e4f9e73671 g4vg: new version 1.0.4 (#50439) 2025-05-13 14:31:46 +02:00
Tamara Dahlgren
ae9cffe55f test/bootstrap.py: test_bootstrap_search_for_compilers_with* use mock packages path (#50441) 2025-05-13 14:31:13 +02:00
Jon Rood
f675130fe9 metaphysicl: depends on c (#50446) 2025-05-13 04:44:34 -06:00
Harmen Stoppels
c5eb82fcb0 pkg.spec.package is pkg after deserialization (#50449) 2025-05-13 12:08:13 +02:00
Massimiliano Culpo
a938167a22 Add a prefix when we import vendored modules (#50443)
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
Co-authored-by: Harmen Stoppels <harmenstoppels@gmail.com>
2025-05-13 07:20:40 +02:00
Mikael Simberg
bdb6ac8188 mold: add v2.39.1 (#50431) 2025-05-12 15:39:55 -06:00
Jon Rood
6efdc3c005 amr-wind: update some dependency constraints and add fortran dependency. (#50440) 2025-05-12 15:25:45 -06:00
Diego Alvarez S.
5a8a7b83f6 blast-plus: fix python version to <=3.11 (#50416) 2025-05-12 09:24:08 +02:00
Dmitri Smirnov
70de20eaa2 optix-dev: new package for NVIDIA OptiX SDK headers (#50080) 2025-05-12 09:05:22 +02:00
Adam J. Stewart
d8172e2c29 GDAL: add v3.11.0 (#50405) 2025-05-12 08:58:52 +02:00
Diego Alvarez S.
3371cc55ed nextflow: add v25.04.0 (#50412) 2025-05-12 08:50:13 +02:00
Satish Balay
35ee3706bb petsc, py-petsc4py: add v3.23.2 (#50409) 2025-05-12 08:48:41 +02:00
Diego Alvarez S.
9493cf016b Add seqkit v2.10.0 (#50414) 2025-05-12 08:47:25 +02:00
Seth R. Johnson
f6caa1c824 covfie: add v0.14 and maintainer (#50417) 2025-05-12 08:36:57 +02:00
Matthieu Dorier
2c9f94e6a5 py-confluent-kafka: new package (#50418) 2025-05-12 08:36:17 +02:00
pauleonix
2504dcf4f8 cuda: add v12.8.1 (#49379) 2025-05-12 08:34:12 +02:00
Alec Scott
82baa658a4 typos: add v1.32.0 (#50421) 2025-05-12 08:33:03 +02:00
Jon Rood
21384be78d exawind: depends on fortran as well (#50393) 2025-05-10 10:44:38 +02:00
Massimiliano Culpo
acd47147a5 solver: support concrete multivalued variants (#50325)
The solves now supports key:=val syntax for multivalued variants in specs originating from input, externals, requirements, directives and when conditions

Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-09 23:08:21 +02:00
Harmen Stoppels
3ed6736b2c compiler.py: be more defensive (#50403) 2025-05-09 16:58:52 +00:00
Massimiliano Culpo
842954f6a4 solver: treat external nodes as concrete for optimization purposes (#50165)
This PR is a step towards treating externals as concrete specs. Specifically, it moves the optimization weights of external nodes into the group of "reused" specs, and doesn't count externals as specs to be built. 

It still keeps the one to many mapping between an external spec in `packages.yaml` and the corresponding specs in the DB. To make it such that an hashed external is preferred to a non-hashed one, the version weights of externals are demoted at lowest priority.

**Change in behavior**:
- Having the possibility, Spack will now prefer to mix compilers in a DAG, and use the latest version possible for each node, rather than using a single compiler and employ old versions of some nodes because of conflicts
- In general, using externals by default is now triggered by putting their weights in the "reused" group. This means that any penalty they might induce will never have the same priority as something that needs to be built. This behavior reflects reality, but changes some default choices from the previous state.

Modifications:
- External nodes weights are now moved to the group of "reused" specs
- Runtimes are treated as concrete as well (to avoid that e.g.`gcc` is not selected because it "builds" the runtime package)
- Shuffle version weights, so that externals are least preferred (counterbalanced by the fact that they are in the "reused" groups)
- Split provider weights on edges from version badness on edges

Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2025-05-09 17:41:16 +02:00
Harmen Stoppels
5c918e40a6 builtin: remove llnl.util.tty import (#50396)
* builtin: remove llnl.util.tty import

* hipsycl: remove unnecessary imports
2025-05-09 15:35:18 +02:00
Harmen Stoppels
98570929aa builtin: github url pull -> commit (#50399)
rate limits on github.com's pull/ urls are ~1 per minute, the rate
limits for merged commits are better and on top of that less dynamic.
2025-05-09 15:25:39 +02:00
Gregor Olenik
75bcf58b30 neon: add new package (#50278) 2025-05-09 15:20:24 +02:00
Harshula Jayasuriya
4a03cac6cc fms: require +pic when +shared (#50130) 2025-05-09 06:15:04 -06:00
Thomas Madlener
75faab206b lcio: add version 2.22.6 (#50368)
Fix dependency on "c" to previous versions as this has been fixed

Co-authored-by: Valentin Volkl <valentin.volkl@cern.ch>
2025-05-09 05:37:56 -06:00
Sergey Kosukhin
c9ab0d8fcb icon: add version 2025.04 (#50245) 2025-05-09 10:22:08 +02:00
John W. Parent
c45e02d58f mpilander: conflict with Windows (#49733) 2025-05-09 10:04:46 +02:00
Thomas-Ulrich
33c8f518ae seissol: fix build by adding language dependance (#50302) 2025-05-09 10:01:00 +02:00
Rémi Lacroix
2491a9abff conquest: explicitly configure the MPI compilers. (#50287) 2025-05-09 09:58:45 +02:00
G-Ragghianti
1a26ec7b8b parsec: new version and compiler dependency (#50292) 2025-05-09 09:29:27 +02:00
Patrick Diehl
89a79d3df0 hpx: add fetching APEX and specify develop (#50289)
* Add fetching APEX and specify develop

* Using the spack package

* [@spackbot] updating style on behalf of diehlpk

* Add restrictions for 1.5
2025-05-09 09:28:30 +02:00
Marc T. Henry de Frahan
ce700d69d7 Add amr-wind versions (#50373) 2025-05-09 00:10:53 -06:00
Tamara Dahlgren
a505fb1f37 unit tests: switch TestSpecList to use mock packages (#50353) 2025-05-09 07:45:49 +02:00
吴坎
f039b22093 Update package.py (#50378) 2025-05-08 23:34:41 -06:00
Dave Keeshan
18ea8f813e yosys: add v0.53 (#50372) 2025-05-08 23:34:23 -06:00
Jonas Eschle
d7e740defa py-hepstats: new package (#43697)
* enh: add py-hepstats package
* fix: version
* fix: update pypi version
* fix: update hash
* fix: use github package
* fix: allow download from pypi
* chore: remove unused Bazel, cleanup imports
* enh:  add 0.9.2 version
* fix: update dependencies for version 0.9.0 and adjust build system
* chore:  move to new builtin directory

---------

Co-authored-by: jonas-eschle <jonas-eschle@users.noreply.github.com>
2025-05-08 23:29:02 -06:00
Chris Green
c21dc1a27a jsonnet: Support CMake builds with external nlohmann-json (#49284)
* jsonnet: Support CMake builds with external `nlohmann-json`

* New version 0.21.0
2025-05-08 23:23:45 -06:00
Sinan
f30d8ea2a5 package/lemon,qjson,qtkeychain: fix c compiler depencency (#50311)
* package/lemon,qjson,qtkeychain: fix c compiler depencency
* remove generated

---------

Co-authored-by: sbulut <sbulut@3vgeomatics.com>
2025-05-08 16:44:23 -07:00
Scott Wittenburg
03cb30cb96 binary_distribution: Do not look in sub-mirrors when indexing (#50389)
When indexing top level specs, eg, in s3://spack-binaries/develop,
do not sync manifests from all the stacks.  Instead, add the path
to the spec manifests to the url to sync, so that only items in
s3://spack-binaries/develop/v3/manifests/spec are copied to the
local system.
2025-05-08 17:25:35 -06:00
Scott Wittenburg
f6da037129 binary_distribution: Handle fetch error during rebuild-index (#50387)
Allow rebuild-index to continue if fetching some specs fails
for any reason, and issue a warning indicating which manifest
is associated with the failed fetch.
2025-05-08 13:54:43 -06:00
Kyle Shores
31c2897fd8 musica: adding a netcdf-fortran dependency (#50252) 2025-05-08 13:41:33 -06:00
jgraciahlrs
1a379215da Allow usage of config variables and env variables with include_concrete (#45871)
* Allow usage of spack config vars in concrete env path
* Update docs on usage of spack config vars in concrete env path
2025-05-08 14:23:02 -05:00
Robert Maaskant
0f7c1b5e38 go: add v1.23.9 and v1.24.3 (#50346) 2025-05-08 13:57:00 -05:00
ShujieL
7e3af5d42d dd4hep: add v1.32 (#50359)
* Update package.py for dd4hep 1.32

* Update package.py to fix the podio-dd4hep version

* fix the dd4hep 1.32 hash

Co-authored-by: Sakib Rahman <rahmans@myumanitoba.ca>

---------

Co-authored-by: Sakib Rahman <rahmans@myumanitoba.ca>
2025-05-08 11:52:57 -07:00
Victor A. P. Magri
f45e312f81 raja: add gpu-profiling variant (#50354) 2025-05-08 12:40:56 -06:00
Chris Marsh
a82e21e82f add 0.61.2 and fix numpy version constraints (#50352) 2025-05-08 12:24:13 -06:00
Robert Maaskant
1ba40b99ee yq: add v4.45.2 (#50345) 2025-05-08 12:07:22 -06:00
Robert Maaskant
60f2698a4a trivy: add v0.62.0 and v0.62.1 (#50344) 2025-05-08 12:07:04 -06:00
Harmen Stoppels
b3772f8bb6 builtin: remove unused imports from build_systems (#50385) 2025-05-08 19:27:24 +02:00
Harmen Stoppels
cd75e52ba2 yaml_cpp: do not import spack.spec (#50382) 2025-05-08 10:52:35 -06:00
Harmen Stoppels
b0b316c646 builtin: add a few missing __init__.py (#50374) 2025-05-08 18:45:09 +02:00
Harmen Stoppels
7bbf581169 singularity-eos: remove conditional depends_on (#50381) 2025-05-08 18:42:06 +02:00
Harmen Stoppels
7b93d01a68 builtin: remove various redundant wildcard imports (#50380) 2025-05-08 18:38:18 +02:00
Harmen Stoppels
a95fa26857 docs/comments: fix typo with wildcard import (#50379) 2025-05-08 18:37:45 +02:00
Harmen Stoppels
6f2393a345 builtin: delete spack.store import (#50383) 2025-05-08 10:31:11 -06:00
Mikael Simberg
9fa2bb375c fmt: add v11.2.0 (#50343) 2025-05-08 05:54:54 -06:00
Harmen Stoppels
98c08ce5c6 repo.py: enable search paths when spack.repo.PATH is assigned (#50370)
Fixes a bug where `custom_repo.get_pkg_class("foo")` failed executing `import spack_repo.builtin` even if the builtin repo was configured globally.

Instead of assignment of `spack.repo.PATH`, the `spack.repo.enable_repo` function now assigns and enables the repo, meaning that also Python module search paths are modified.
2025-05-08 13:42:20 +02:00
Caetano Melone
83f115894b glib: add preferred version 2.78.3 (#50356)
Versions of glib above 2.78.3 don't build (https://github.com/spack/spack/issues/49358). Until this is fixed we should set preferred to a confirmed version instead per https://github.com/spack/spack/issues/49358#issuecomment-2706251681.
2025-05-08 09:27:07 +02:00
Tamara Dahlgren
59339be48f test/cmd/find.py: switch to use mock_packages (#50358) 2025-05-08 08:33:56 +02:00
snehring
ef0599b53c cryodrgn: adding v3.4.3 (#48804)
Signed-off-by: Shane Nehring <snehring@iastate.edu>
2025-05-07 12:43:37 -07:00
Veselin Dobrev
9c4207a551 mesa: add the latest v24.* and v25.* versions (#47642)
* [mesa] Add latest version: 24.2.7
* Fix the llvm build for @18: when libunwind is disabled
* [mesa] Updaing to the latest 24.* and 25.* versions
* Add libshmfence dependency

---------

Co-authored-by: Tamara Dahlgren <35777542+tldahlgren@users.noreply.github.com>
2025-05-07 12:09:23 -07:00
Sinan
eb95390ce7 package/qscintilla: fix build issue (#50317)
* package/qscintilla: fix build issue

* add maintainer

* package/qscintilla: fix build issue

* add maintainer

---------

Co-authored-by: sbulut <sbulut@3vgeomatics.com>
2025-05-07 19:45:14 +02:00
Sinan
527d723db0 package_qgis add new versions (#50328)
* package_qgis add new versions

* restore deprecated version

---------

Co-authored-by: sbulut <sbulut@3vgeomatics.com>
2025-05-07 09:50:58 -07:00
9349 changed files with 29689 additions and 9792 deletions

View File

@@ -6,6 +6,7 @@ on:
jobs:
# Check we don't make the situation with circular imports worse
import-check:
continue-on-error: true
runs-on: ubuntu-latest
steps:
- uses: julia-actions/setup-julia@v2

View File

@@ -27,7 +27,10 @@ jobs:
- name: Sync spack/spack-packages with spack/spack
run: |
cd spack-packages
git-filter-repo --quiet --source ../spack --subdirectory-filter var/spack/repos --refs develop
git-filter-repo --quiet --source ../spack \
--path var/spack/repos/ --path-rename var/spack/repos/:python/ \
--path share/spack/gitlab/cloud_pipelines/ --path-rename share/spack/gitlab/cloud_pipelines/:.ci/gitlab/ \
--refs develop
- name: Push
run: |
cd spack-packages

View File

@@ -276,7 +276,7 @@ remove dependent packages *before* removing their dependencies or use the
Garbage collection
^^^^^^^^^^^^^^^^^^
When Spack builds software from sources, if often installs tools that are needed
When Spack builds software from sources, it often installs tools that are needed
just to build or test other software. These are not necessary at runtime.
To support cases where removing these tools can be a benefit Spack provides
the ``spack gc`` ("garbage collector") command, which will uninstall all unneeded packages:

View File

@@ -89,7 +89,7 @@ You can see that the mirror is added with ``spack mirror list`` as follows:
spack-public https://spack-llnl-mirror.s3-us-west-2.amazonaws.com/
At this point, you've create a buildcache, but spack hasn't indexed it, so if
At this point, you've created a buildcache, but Spack hasn't indexed it, so if
you run ``spack buildcache list`` you won't see any results. You need to index
this new build cache as follows:
@@ -318,7 +318,7 @@ other system dependencies. However, they are still compatible with tools like
``skopeo``, ``podman``, and ``docker`` for pulling and pushing.
.. note::
The docker ``overlayfs2`` storage driver is limited to 128 layers, above which a
The Docker ``overlayfs2`` storage driver is limited to 128 layers, above which a
``max depth exceeded`` error may be produced when pulling the image. There
are `alternative drivers <https://docs.docker.com/storage/storagedriver/>`_.

View File

@@ -14,7 +14,7 @@ is an entire command dedicated to the management of every aspect of bootstrappin
.. command-output:: spack bootstrap --help
Spack is configured to bootstrap its dependencies lazily by default; i.e. the first time they are needed and
Spack is configured to bootstrap its dependencies lazily by default; i.e., the first time they are needed and
can't be found. You can readily check if any prerequisite for using Spack is missing by running:
.. code-block:: console
@@ -36,8 +36,8 @@ can't be found. You can readily check if any prerequisite for using Spack is mis
In the case of the output shown above Spack detected that both ``clingo`` and ``gnupg``
are missing and it's giving detailed information on why they are needed and whether
they can be bootstrapped. The return code of this command summarizes the results, if any
dependencies are missing the return code is ``1``, otherwise ``0``. Running a command that
they can be bootstrapped. The return code of this command summarizes the results; if any
dependencies are missing, the return code is ``1``, otherwise ``0``. Running a command that
concretizes a spec, like:
.. code-block:: console

View File

@@ -66,7 +66,7 @@ on these ideas for each distinct build system that Spack supports:
build_systems/rocmpackage
build_systems/sourceforgepackage
For reference, the :py:mod:`Build System API docs <spack.build_systems>`
For reference, the :py:mod:`Build System API docs <spack_repo.builtin.build_systems>`
provide a list of build systems and methods/attributes that can be
overridden. If you are curious about the implementation of a particular
build system, you can view the source code by running:
@@ -90,7 +90,7 @@ packages. You can quickly find examples by running:
You can then view these packages with ``spack edit``.
This guide is intended to supplement the
:py:mod:`Build System API docs <spack.build_systems>` with examples of
:py:mod:`Build System API docs <spack_repo.builtin.build_systems>` with examples of
how to override commonly used methods. It also provides rules of thumb
and suggestions for package developers who are unfamiliar with a
particular build system.

View File

@@ -129,8 +129,8 @@ Adding flags to cmake
To add additional flags to the ``cmake`` call, simply override the
``cmake_args`` function. The following example defines values for the flags
``WHATEVER``, ``ENABLE_BROKEN_FEATURE``, ``DETECT_HDF5``, and ``THREADS`` with
and without the :meth:`~spack.build_systems.cmake.CMakeBuilder.define` and
:meth:`~spack.build_systems.cmake.CMakeBuilder.define_from_variant` helper functions:
and without the :meth:`~spack_repo.builtin.build_systems.cmake.CMakeBuilder.define` and
:meth:`~spack_repo.builtin.build_systems.cmake.CMakeBuilder.define_from_variant` helper functions:
.. code-block:: python

View File

@@ -35,8 +35,8 @@
if not os.path.exists(link_name):
os.symlink(os.path.abspath("../../.."), link_name, target_is_directory=True)
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external"))
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external/_vendoring"))
sys.path.append(os.path.abspath("_spack_root/lib/spack/"))
sys.path.append(os.path.abspath("_spack_root/var/spack/repos/"))
# Add the Spack bin directory to the path so that we can use its output in docs.
os.environ["SPACK_ROOT"] = os.path.abspath("_spack_root")
@@ -76,11 +76,20 @@
apidoc_args
+ [
"_spack_root/lib/spack/spack",
"_spack_root/lib/spack/spack/package.py", # sphinx struggles with os.chdir re-export.
"_spack_root/lib/spack/spack/test/*.py",
"_spack_root/lib/spack/spack/test/cmd/*.py",
]
)
sphinx_apidoc(apidoc_args + ["_spack_root/lib/spack/llnl"])
sphinx_apidoc(
apidoc_args
+ [
"--implicit-namespaces",
"_spack_root/var/spack/repos/spack_repo",
"_spack_root/var/spack/repos/spack_repo/builtin/packages",
]
)
# Enable todo items
todo_include_todos = True
@@ -209,7 +218,7 @@ def setup(sphinx):
# Spack classes that are private and we don't want to expose
("py:class", "spack.provider_index._IndexBase"),
("py:class", "spack.repo._PrependFileLoader"),
("py:class", "spack.build_systems._checks.BuilderWithDefaults"),
("py:class", "spack_repo.builtin.build_systems._checks.BuilderWithDefaults"),
# Spack classes that intersphinx is unable to resolve
("py:class", "spack.version.StandardVersion"),
("py:class", "spack.spec.DependencySpec"),
@@ -219,7 +228,7 @@ def setup(sphinx):
("py:class", "spack.install_test.Pb"),
("py:class", "spack.filesystem_view.SimpleFilesystemView"),
("py:class", "spack.traverse.EdgeAndDepth"),
("py:class", "archspec.cpu.microarchitecture.Microarchitecture"),
("py:class", "_vendoring.archspec.cpu.microarchitecture.Microarchitecture"),
("py:class", "spack.compiler.CompilerCache"),
# TypeVar that is not handled correctly
("py:class", "llnl.util.lang.T"),

View File

@@ -148,8 +148,8 @@ this can expose you to attacks. Use at your own risk.
``ssl_certs``
--------------------
Path to custom certificats for SSL verification. The value can be a
filesytem path, or an environment variable that expands to an absolute file path.
Path to custom certificates for SSL verification. The value can be a
filesystem path, or an environment variable that expands to an absolute file path.
The default value is set to the environment variable ``SSL_CERT_FILE``
to use the same syntax used by many other applications that automatically
detect custom certificates.

View File

@@ -11,7 +11,7 @@ Container Images
Spack :ref:`environments` can easily be turned into container images. This page
outlines two ways in which this can be done:
1. By installing the environment on the host system, and copying the installations
1. By installing the environment on the host system and copying the installations
into the container image. This approach does not require any tools like Docker
or Singularity to be installed.
2. By generating a Docker or Singularity recipe that can be used to build the
@@ -56,8 +56,8 @@ environment roots and its runtime dependencies.
.. note::
When using registries like GHCR and Docker Hub, the ``--oci-password`` flag is not
the password for your account, but a personal access token you need to generate separately.
When using registries like GHCR and Docker Hub, the ``--oci-password`` flag specifies not
the password for your account, but rather a personal access token you need to generate separately.
The specified ``--base-image`` should have a libc that is compatible with the host system.
For example if your host system is Ubuntu 20.04, you can use ``ubuntu:20.04``, ``ubuntu:22.04``

View File

@@ -539,7 +539,9 @@ from the command line.
You can also include an environment directly in the ``spack.yaml`` file. It
involves adding the ``include_concrete`` heading in the yaml followed by the
absolute path to the independent environments.
absolute path to the independent environments. Note, that you may use Spack
config variables such as ``$spack`` or environment variables as long as the
expression expands to an absolute path.
.. code-block:: yaml
@@ -549,7 +551,7 @@ absolute path to the independent environments.
unify: true
include_concrete:
- /absolute/path/to/environment1
- /absolute/path/to/environment2
- $spack/../path/to/environment2
Once the ``spack.yaml`` has been updated you must concretize the environment to

View File

@@ -20,7 +20,7 @@ be present on the machine where Spack is run:
:header-rows: 1
These requirements can be easily installed on most modern Linux systems;
on macOS, the Command Line Tools package is required, and a full XCode suite
on macOS, the Command Line Tools package is required, and a full Xcode suite
may be necessary for some packages such as Qt and apple-gl. Spack is designed
to run on HPC platforms like Cray. Not all packages should be expected
to work on all platforms.

View File

@@ -103,6 +103,7 @@ or refer to the full manual below.
:caption: API Docs
Spack API Docs <spack>
Spack Builtin Repo <spack_repo>
LLNL API Docs <llnl>
==================

View File

@@ -8,7 +8,7 @@
Modules (modules.yaml)
======================
The use of module systems to manage user environment in a controlled way
The use of module systems to manage user environments in a controlled way
is a common practice at HPC centers that is sometimes embraced also by
individual programmers on their development machines. To support this
common practice Spack integrates with `Environment Modules
@@ -490,7 +490,7 @@ that are already in the Lmod hierarchy.
.. note::
Tcl and Lua modules also allow for explicit conflicts between modulefiles.
Tcl and Lua modules also allow for explicit conflicts between module files.
.. code-block:: yaml
@@ -513,7 +513,7 @@ that are already in the Lmod hierarchy.
:meth:`~spack.spec.Spec.format` method.
For Lmod and Environment Modules versions prior 4.2, it is important to
express the conflict on both modulefiles conflicting with each other.
express the conflict on both module files conflicting with each other.
.. note::
@@ -550,7 +550,7 @@ that are already in the Lmod hierarchy.
.. warning::
Consistency of Core packages
The user is responsible for maintining consistency among core packages, as ``core_specs``
The user is responsible for maintaining consistency among core packages, as ``core_specs``
bypasses the hierarchy that allows Lmod to safely switch between coherent software stacks.
.. warning::

View File

@@ -69,7 +69,7 @@ An example for ``CMake`` is, for instance:
The predefined steps for each build system are called "phases".
In general, the name and order in which the phases will be executed can be
obtained by either reading the API docs at :py:mod:`~.spack.build_systems`, or
obtained by either reading the API docs at :py:mod:`~.spack_repo.builtin.build_systems`, or
using the ``spack info`` command:
.. code-block:: console
@@ -158,7 +158,7 @@ builder class explicitly. Using the same example as above, this reads:
url_fmt = "https://github.com/uclouvain/openjpeg/archive/version.{0}.tar.gz"
return url_fmt.format(version)
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
class CMakeBuilder(spack_repo.builtin.build_systems.cmake.CMakeBuilder):
def cmake_args(self):
args = [
self.define_from_variant("BUILD_CODEC", "codec"),
@@ -179,7 +179,7 @@ Spack can be found at :ref:`package_class_structure`.
.. code-block:: python
class Foo(CmakePackage):
class Foo(CMakePackage):
def cmake_args(self):
...
@@ -256,7 +256,7 @@ for details):
#
# See the Spack documentation for more information on packaging.
# ----------------------------------------------------------------------------
import spack.build_systems.autotools
import spack_repo.builtin.build_systems.autotools
from spack.package import *
@@ -497,7 +497,7 @@ extends Spack's ``Package`` class. For example, here is
.. code-block:: python
:linenos:
from spack import *
from spack.package import *
class Libelf(Package):
""" ... description ... """
@@ -1089,7 +1089,7 @@ You've already seen the ``homepage`` and ``url`` package attributes:
.. code-block:: python
:linenos:
from spack import *
from spack.package import *
class Mpich(Package):
@@ -1212,7 +1212,7 @@ class-level tarball URL and VCS. For example:
version("master", branch="master")
version("12.12.1", md5="ecd4606fa332212433c98bf950a69cc7")
version("12.10.1", md5="667333dbd7c0f031d47d7c5511fd0810")
version("12.8.1", "9f37f683ee2b427b5540db8a20ed6b15")
version("12.8.1", md5="9f37f683ee2b427b5540db8a20ed6b15")
If a package contains both a ``url`` and ``git`` class-level attribute,
Spack decides which to use based on the arguments to the ``version()``
@@ -1343,7 +1343,7 @@ Submodules
version("1.0.1", tag="v1.0.1", submodules=True)
If a package has needs more fine-grained control over submodules, define
If a package needs more fine-grained control over submodules, define
``submodules`` to be a callable function that takes the package instance as
its only argument. The function should return a list of submodules to be fetched.
@@ -2253,22 +2253,15 @@ RPATHs in Spack are handled in one of three ways:
set in standard variables like ``CC``, ``CXX``, ``F77``, and ``FC``,
so most build systems (autotools and many gmake systems) pick them
up and use them.
#. CMake also respects Spack's compiler wrappers, but many CMake
builds have logic to overwrite RPATHs when binaries are
installed. Spack provides the ``std_cmake_args`` variable, which
includes parameters necessary for CMake build use the right
installation RPATH. It can be used like this when ``cmake`` is
invoked:
.. code-block:: python
class MyPackage(Package):
...
def install(self, spec, prefix):
cmake("..", *std_cmake_args)
make()
make("install")
#. CMake has its own RPATH handling, and distinguishes between build and
install RPATHs. By default, during the build it registers RPATHs to
all libraries it links to, so that just-built executables can be run
during the build itself. Upon installation, these RPATHs are cleared,
unless the user defines the install RPATHs. When inheriting from
``CMakePackage``, Spack handles this automatically, and sets
``CMAKE_INSTALL_RPATH_USE_LINK_PATH`` and ``CMAKE_INSTALL_RPATH``,
so that libraries of dependencies and the package's own libraries
can be found at runtime.
#. If you need to modify the build to add your own RPATHs, you can
use the ``self.rpath`` property of your package, which will
return a list of all the RPATHs that Spack will use when it
@@ -2315,31 +2308,19 @@ looks like this:
parallel = False
Similarly, you can disable parallel builds only for specific make
commands, as ``libdwarf`` does:
You can also disable parallel builds only for specific make
invocation:
.. code-block:: python
:emphasize-lines: 9, 12
:emphasize-lines: 5
:linenos:
class Libelf(Package):
...
def install(self, spec, prefix):
configure("--prefix=" + prefix,
"--enable-shared",
"--disable-dependency-tracking",
"--disable-debug")
make()
# The mkdir commands in libelf's install can fail in parallel
make("install", parallel=False)
The first make will run in parallel here, but the second will not. If
you set ``parallel`` to ``False`` at the package level, then each call
to ``make()`` will be sequential by default, but packagers can call
``make(parallel=True)`` to override it.
Note that the ``--jobs`` option works out of the box for all standard
build systems. If you are using a non-standard build system instead, you
can use the variable ``make_jobs`` to extract the number of jobs specified
@@ -2514,7 +2495,7 @@ necessary when there are breaking changes in the dependency that the
package cannot handle. In Spack we often add forward compatibility
bounds only at the time a new, breaking version of a dependency is
released. As with backward compatibility, it is typical to see a list
of forward compatibility bounds in a package file as seperate lines:
of forward compatibility bounds in a package file as separate lines:
.. code-block:: python
@@ -3390,7 +3371,7 @@ the above attribute implementations:
"/opt/spack/linux-fedora35-haswell/gcc-11.3.1/foo-1.0-ca3rczp5omy7dfzoqw4p7oc2yh3u7lt6/baz/lib/libFooBaz.so"
])
# baz library directories in the baz subdirectory of the foo porefix
# baz library directories in the baz subdirectory of the foo prefix
>>> spec["baz"].libs.directories
[
"/opt/spack/linux-fedora35-haswell/gcc-11.3.1/foo-1.0-ca3rczp5omy7dfzoqw4p7oc2yh3u7lt6/baz/lib"
@@ -3704,60 +3685,57 @@ the build system. The build systems currently supported by Spack are:
+----------------------------------------------------------+----------------------------------+
| **API docs** | **Description** |
+==========================================================+==================================+
| :class:`~spack.build_systems.generic` | Generic build system without any |
| :class:`~spack_repo.builtin.build_systems.generic` | Generic build system without any |
| | base implementation |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.makefile` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.makefile` | Specialized build system for |
| | software built invoking |
| | hand-written Makefiles |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.autotools` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.autotools` | Specialized build system for |
| | software built using |
| | GNU Autotools |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.cmake` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.cmake` | Specialized build system for |
| | software built using CMake |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.maven` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.maven` | Specialized build system for |
| | software built using Maven |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.meson` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.meson` | Specialized build system for |
| | software built using Meson |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.nmake` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.nmake` | Specialized build system for |
| | software built using NMake |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.qmake` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.qmake` | Specialized build system for |
| | software built using QMake |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.scons` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.scons` | Specialized build system for |
| | software built using SCons |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.waf` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.waf` | Specialized build system for |
| | software built using Waf |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.r` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.r` | Specialized build system for |
| | R extensions |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.octave` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.octave` | Specialized build system for |
| | Octave packages |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.python` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.python` | Specialized build system for |
| | Python extensions |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.perl` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.perl` | Specialized build system for |
| | Perl extensions |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.ruby` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.ruby` | Specialized build system for |
| | Ruby extensions |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.intel` | Specialized build system for |
| | licensed Intel software |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.oneapi` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.oneapi` | Specialized build system for |
| | Intel oneAPI software |
+----------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.aspell_dict` | Specialized build system for |
| :class:`~spack_repo.builtin.build_systems.aspell_dict` | Specialized build system for |
| | Aspell dictionaries |
+----------------------------------------------------------+----------------------------------+
@@ -3769,7 +3747,7 @@ the build system. The build systems currently supported by Spack are:
rare cases where manual intervention is needed we need to stress that a
package base class depends on the *build system* being used, not the language of the package.
For example, a Python extension installed with CMake would ``extends("python")`` and
subclass from :class:`~spack.build_systems.cmake.CMakePackage`.
subclass from :class:`~spack_repo.builtin.build_systems.cmake.CMakePackage`.
^^^^^^^^^^^^^^^^^^^^^^^^^^
Overriding builder methods
@@ -3777,7 +3755,7 @@ Overriding builder methods
Build-system "phases" have default implementations that fit most of the common cases:
.. literalinclude:: _spack_root/lib/spack/spack/build_systems/autotools.py
.. literalinclude:: _spack_root/var/spack/repos/spack_repo/builtin/build_systems/autotools.py
:pyobject: AutotoolsBuilder.configure
:linenos:
@@ -3791,7 +3769,7 @@ configure arguments:
Each specific build system has a list of attributes and methods that can be overridden to
fine-tune the installation of a package without overriding an entire phase. To
have more information on them the place to go is the API docs of the :py:mod:`~.spack.build_systems`
have more information on them the place to go is the API docs of the :py:mod:`~.spack_repo.builtin.build_systems`
module.
^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -3833,7 +3811,7 @@ If the ``package.py`` has build instructions in a separate
.. code-block:: python
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
class CMakeBuilder(spack_repo.builtin.build_systems.cmake.CMakeBuilder):
def install(self, pkg, spec, prefix):
...
@@ -3846,31 +3824,32 @@ Mixin base classes
Besides build systems, there are other cases where common metadata and behavior can be extracted
and reused by many packages. For instance, packages that depend on ``Cuda`` or ``Rocm``, share
common dependencies and constraints. To factor these attributes into a single place, Spack provides
a few mixin classes in the ``spack.build_systems`` module:
a few mixin classes in the ``spack_repo.builtin.build_systems`` module:
+---------------------------------------------------------------+----------------------------------+
| **API docs** | **Description** |
+===============================================================+==================================+
| :class:`~spack.build_systems.cuda.CudaPackage` | A helper class for packages that |
| | use CUDA |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.rocm.ROCmPackage` | A helper class for packages that |
| | use ROCm |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.gnu.GNUMirrorPackage` | A helper class for GNU packages |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.python.PythonExtension` | A helper class for Python |
| | extensions |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.sourceforge.SourceforgePackage` | A helper class for packages |
| | from sourceforge.org |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.sourceware.SourcewarePackage` | A helper class for packages |
| | from sourceware.org |
+---------------------------------------------------------------+----------------------------------+
| :class:`~spack.build_systems.xorg.XorgPackage` | A helper class for x.org |
| | packages |
+---------------------------------------------------------------+----------------------------------+
+----------------------------------------------------------------------------+----------------------------------+
| **API docs** | **Description** |
+============================================================================+==================================+
| :class:`~spack_repo.builtin.build_systems.cuda.CudaPackage` | A helper class for packages that |
| | use CUDA |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.rocm.ROCmPackage` | A helper class for packages that |
| | use ROCm |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.gnu.GNUMirrorPackage` | A helper class for GNU packages |
| | |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.python.PythonExtension` | A helper class for Python |
| | extensions |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.sourceforge.SourceforgePackage` | A helper class for packages |
| | from sourceforge.org |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.sourceware.SourcewarePackage` | A helper class for packages |
| | from sourceware.org |
+----------------------------------------------------------------------------+----------------------------------+
| :class:`~spack_repo.builtin.build_systems.xorg.XorgPackage` | A helper class for x.org |
| | packages |
+----------------------------------------------------------------------------+----------------------------------+
These classes should be used by adding them to the inheritance tree of the package that needs them,
for instance:
@@ -3914,13 +3893,13 @@ Additional build instructions are split into separate builder classes:
.. code-block:: python
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
class CMakeBuilder(spack_repo.builtin.build_systems.cmake.CMakeBuilder):
def cmake_args(self):
return [
self.define_from_variant("MY_FEATURE", "my_feature")
]
class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder):
class AutotoolsBuilder(spack_repo.builtin.build_systems.autotools.AutotoolsBuilder):
def configure_args(self):
return self.with_or_without("my-feature", variant="my_feature")
@@ -5749,7 +5728,7 @@ running each executable, ``foo`` and ``bar``, as independent test parts.
.. note::
The method name ``copy_test_files`` here is for illustration purposes.
You are free to use a name that is more suited to your package.
You are free to use a name that is better suited to your package.
The key to copying files for stand-alone testing at build time is use
of the ``run_after`` directive, which ensures the associated files are
@@ -6183,7 +6162,7 @@ running:
.. code-block:: python
from spack import *
from spack.package import *
This is already part of the boilerplate for packages created with
``spack create``.
@@ -7258,7 +7237,7 @@ which are not, there is the `checked_by` parameter in the license directive:
license("<license>", when="<when>", checked_by="<github username>")
When you have validated a github license, either when doing so explicitly or
When you have validated a package license, either when doing so explicitly or
as part of packaging a new package, please set the `checked_by` parameter
to your Github username to signal that the license has been manually
verified.

View File

@@ -214,7 +214,7 @@ package versions, simply run the following commands:
Running ``spack mark -i --all`` tells Spack to mark all of the existing
packages within an environment as "implicitly" installed. This tells
spack's garbage collection system that these packages should be cleaned up.
Spack's garbage collection system that these packages should be cleaned up.
Don't worry however, this will not remove your entire environment.
Running ``spack install`` will reexamine your spack environment after

View File

@@ -1 +0,0 @@
from _pyrsistent_version import *

View File

@@ -1 +0,0 @@
from altgraph import *

View File

@@ -1,8 +1,8 @@
"""
altgraph.Dot - Interface to the dot language
_vendoring.altgraph.Dot - Interface to the dot language
============================================
The :py:mod:`~altgraph.Dot` module provides a simple interface to the
The :py:mod:`~_vendoring.altgraph.Dot` module provides a simple interface to the
file format used in the
`graphviz <http://www.research.att.com/sw/tools/graphviz/>`_
program. The module is intended to offload the most tedious part of the process
@@ -20,7 +20,7 @@
Here is a typical usage::
from altgraph import Graph, Dot
from _vendoring.altgraph import Graph, Dot
# create a graph
edges = [ (1,2), (1,3), (3,4), (3,5), (4,5), (5,4) ]
@@ -77,7 +77,7 @@
.. note::
dotty (invoked via :py:func:`~altgraph.Dot.display`) may not be able to
dotty (invoked via :py:func:`~_vendoring.altgraph.Dot.display`) may not be able to
display all graphics styles. To verify the output save it to an image file
and look at it that way.
@@ -111,7 +111,7 @@
import os
import warnings
from altgraph import GraphError
from _vendoring.altgraph import GraphError
class Dot(object):

View File

@@ -1,5 +1,5 @@
"""
altgraph.Graph - Base Graph class
_vendoring.altgraph.Graph - Base Graph class
=================================
..
@@ -15,7 +15,7 @@
from collections import deque
from altgraph import GraphError
from _vendoring.altgraph import GraphError
class Graph(object):

View File

@@ -1,8 +1,8 @@
"""
altgraph.GraphAlgo - Graph algorithms
_vendoring.altgraph.GraphAlgo - Graph algorithms
=====================================
"""
from altgraph import GraphError
from _vendoring.altgraph import GraphError
def dijkstra(graph, start, end=None):
@@ -25,7 +25,7 @@ def dijkstra(graph, start, end=None):
and will raise an exception if it discovers that a negative edge has
caused it to make a mistake.
Adapted to altgraph by Istvan Albert, Pennsylvania State University -
Adapted to _vendoring.altgraph by Istvan Albert, Pennsylvania State University -
June, 9 2004
"""
D = {} # dictionary of final distances

View File

@@ -1,5 +1,5 @@
"""
altgraph.GraphStat - Functions providing various graph statistics
_vendoring.altgraph.GraphStat - Functions providing various graph statistics
=================================================================
"""

View File

@@ -1,17 +1,17 @@
"""
altgraph.GraphUtil - Utility classes and functions
_vendoring.altgraph.GraphUtil - Utility classes and functions
==================================================
"""
import random
from collections import deque
from altgraph import Graph, GraphError
from _vendoring.altgraph import Graph, GraphError
def generate_random_graph(node_num, edge_num, self_loops=False, multi_edges=False):
"""
Generates and returns a :py:class:`~altgraph.Graph.Graph` instance with
Generates and returns a :py:class:`~_vendoring.altgraph.Graph.Graph` instance with
*node_num* nodes randomly connected by *edge_num* edges.
"""
g = Graph.Graph()
@@ -52,7 +52,7 @@ def generate_random_graph(node_num, edge_num, self_loops=False, multi_edges=Fals
def generate_scale_free_graph(steps, growth_num, self_loops=False, multi_edges=False):
"""
Generates and returns a :py:class:`~altgraph.Graph.Graph` instance that
Generates and returns a :py:class:`~_vendoring.altgraph.Graph.Graph` instance that
will have *steps* \\* *growth_num* nodes and a scale free (powerlaw)
connectivity. Starting with a fully connected graph with *growth_num*
nodes at every step *growth_num* nodes are added to the graph and are

View File

@@ -1,14 +1,14 @@
"""
altgraph.ObjectGraph - Graph of objects with an identifier
_vendoring.altgraph.ObjectGraph - Graph of objects with an identifier
==========================================================
A graph of objects that have a "graphident" attribute.
graphident is the key for the object in the graph
"""
from altgraph import GraphError
from altgraph.Graph import Graph
from altgraph.GraphUtil import filter_stack
from _vendoring.altgraph import GraphError
from _vendoring.altgraph.Graph import Graph
from _vendoring.altgraph.GraphUtil import filter_stack
class ObjectGraph(object):

View File

@@ -1,18 +1,18 @@
"""
altgraph - a python graph library
_vendoring.altgraph - a python graph library
=================================
altgraph is a fork of `graphlib <http://pygraphlib.sourceforge.net>`_ tailored
_vendoring.altgraph is a fork of `graphlib <http://pygraphlib.sourceforge.net>`_ tailored
to use newer Python 2.3+ features, including additional support used by the
py2app suite (modulegraph and macholib, specifically).
py2app suite (modulegraph and _vendoring.macholib, specifically).
altgraph is a python based graph (network) representation and manipulation
_vendoring.altgraph is a python based graph (network) representation and manipulation
package. It has started out as an extension to the
`graph_lib module
<http://www.ece.arizona.edu/~denny/python_nest/graph_lib_1.0.1.html>`_
written by Nathan Denny it has been significantly optimized and expanded.
The :class:`altgraph.Graph.Graph` class is loosely modeled after the
The :class:`_vendoring.altgraph.Graph.Graph` class is loosely modeled after the
`LEDA <http://www.algorithmic-solutions.com/enleda.htm>`_
(Library of Efficient Datatypes) representation. The library
includes methods for constructing graphs, BFS and DFS traversals,
@@ -22,22 +22,22 @@
The package contains the following modules:
- the :py:mod:`altgraph.Graph` module contains the
:class:`~altgraph.Graph.Graph` class that stores the graph data
- the :py:mod:`_vendoring.altgraph.Graph` module contains the
:class:`~_vendoring.altgraph.Graph.Graph` class that stores the graph data
- the :py:mod:`altgraph.GraphAlgo` module implements graph algorithms
operating on graphs (:py:class:`~altgraph.Graph.Graph`} instances)
- the :py:mod:`_vendoring.altgraph.GraphAlgo` module implements graph algorithms
operating on graphs (:py:class:`~_vendoring.altgraph.Graph.Graph`} instances)
- the :py:mod:`altgraph.GraphStat` module contains functions for
- the :py:mod:`_vendoring.altgraph.GraphStat` module contains functions for
computing statistical measures on graphs
- the :py:mod:`altgraph.GraphUtil` module contains functions for
- the :py:mod:`_vendoring.altgraph.GraphUtil` module contains functions for
generating, reading and saving graphs
- the :py:mod:`altgraph.Dot` module contains functions for displaying
- the :py:mod:`_vendoring.altgraph.Dot` module contains functions for displaying
graphs via `graphviz <http://www.research.att.com/sw/tools/graphviz/>`_
- the :py:mod:`altgraph.ObjectGraph` module implements a graph of
- the :py:mod:`_vendoring.altgraph.ObjectGraph` module implements a graph of
objects with a unique identifier
Installation
@@ -62,7 +62,7 @@
Lets assume that we want to analyze the graph below (links to the full picture)
GRAPH_IMG. Our script then might look the following way::
from altgraph import Graph, GraphAlgo, Dot
from _vendoring.altgraph import Graph, GraphAlgo, Dot
# these are the edges
edges = [ (1,2), (2,4), (1,3), (2,4), (3,4), (4,5), (6,5),
@@ -141,7 +141,7 @@
"""
import pkg_resources
__version__ = pkg_resources.require("altgraph")[0].version
__version__ = pkg_resources.require("_vendoring.altgraph")[0].version
class GraphError(ValueError):

View File

@@ -1,3 +1,3 @@
"""Init file to avoid namespace packages"""
__version__ = "0.2.4"
__version__ = "0.2.5"

View File

@@ -9,8 +9,8 @@
import argparse
import typing
import archspec
import archspec.cpu
import _vendoring.archspec
import _vendoring.archspec.cpu
def _make_parser() -> argparse.ArgumentParser:
@@ -24,7 +24,7 @@ def _make_parser() -> argparse.ArgumentParser:
"-V",
help="Show the version and exit.",
action="version",
version=f"archspec, version {archspec.__version__}",
version=f"archspec, version {_vendoring.archspec.__version__}",
)
parser.add_argument("--help", "-h", help="Show the help and exit.", action="help")
@@ -45,9 +45,9 @@ def _make_parser() -> argparse.ArgumentParser:
def cpu() -> int:
"""Run the `archspec cpu` subcommand."""
"""Run the `_vendoring.archspec.cpu` subcommand."""
try:
print(archspec.cpu.host())
print(_vendoring.archspec.cpu.host())
except FileNotFoundError as exc:
print(exc)
return 1

View File

@@ -8,9 +8,9 @@
import re
import warnings
import archspec
import archspec.cpu.alias
import archspec.cpu.schema
import _vendoring.archspec
import _vendoring.archspec.cpu.alias
import _vendoring.archspec.cpu.schema
from .alias import FEATURE_ALIASES
from .schema import LazyDictionary
@@ -384,7 +384,7 @@ def fill_target_from_dict(name, data, targets):
)
known_targets = {}
data = archspec.cpu.schema.TARGETS_JSON["microarchitectures"]
data = _vendoring.archspec.cpu.schema.TARGETS_JSON["microarchitectures"]
for name in data:
if name in known_targets:
# name was already brought in as ancestor to a target

View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2014 Anders Høst
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -38,7 +38,7 @@
"typing.ClassVar",
"t.ClassVar",
"ClassVar",
"typing_extensions.ClassVar",
"_vendoring.typing_extensions.ClassVar",
)
# we don't use a double-underscore prefix because that triggers
# name mangling when trying to create a slot for the field

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: MIT
from attr import (
from _vendoring.attr import (
NOTHING,
Attribute,
Factory,
@@ -28,7 +28,7 @@
resolve_types,
validate,
)
from attr._next_gen import asdict, astuple
from _vendoring.attr._next_gen import asdict, astuple
from . import converters, exceptions, filters, setters, validators

View File

@@ -1,3 +1,3 @@
# SPDX-License-Identifier: MIT
from attr.converters import * # noqa
from _vendoring.attr.converters import * # noqa

View File

@@ -1,3 +1,3 @@
# SPDX-License-Identifier: MIT
from attr.exceptions import * # noqa
from _vendoring.attr.exceptions import * # noqa

View File

@@ -1,3 +1,3 @@
# SPDX-License-Identifier: MIT
from attr.filters import * # noqa
from _vendoring.attr.filters import * # noqa

View File

@@ -1,3 +1,3 @@
# SPDX-License-Identifier: MIT
from attr.setters import * # noqa
from _vendoring.attr.setters import * # noqa

View File

@@ -1,3 +1,3 @@
# SPDX-License-Identifier: MIT
from attr.validators import * # noqa
from _vendoring.attr.validators import * # noqa

View File

@@ -19,7 +19,7 @@
from types import CodeType
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
class _MemcachedClient(te.Protocol):
@@ -101,7 +101,7 @@ def bytecode_to_string(self) -> bytes:
class BytecodeCache:
"""To implement your own bytecode cache you have to subclass this class
and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of
these methods are passed a :class:`~jinja2.bccache.Bucket`.
these methods are passed a :class:`~_vendoring.jinja2.bccache.Bucket`.
A very basic bytecode cache that saves the bytecode on the file system::
@@ -193,7 +193,7 @@ class FileSystemBytecodeCache(BytecodeCache):
is created for the user in the system temp directory.
The pattern can be used to have multiple separate caches operate on the
same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s``
same directory. The default pattern is ``'___vendoring.jinja2_%s.cache'``. ``%s``
is replaced with the cache key.
>>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache')
@@ -202,7 +202,7 @@ class FileSystemBytecodeCache(BytecodeCache):
"""
def __init__(
self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache"
self, directory: t.Optional[str] = None, pattern: str = "___vendoring.jinja2_%s.cache"
) -> None:
if directory is None:
directory = self._get_default_cache_dir()
@@ -225,7 +225,7 @@ def _unsafe_dir() -> "te.NoReturn":
if not hasattr(os, "getuid"):
_unsafe_dir()
dirname = f"_jinja2-cache-{os.getuid()}"
dirname = f"__vendoring.jinja2-cache-{os.getuid()}"
actual_dir = os.path.join(tmpdir, dirname)
try:
@@ -332,7 +332,7 @@ class MemcachedBytecodeCache(BytecodeCache):
def __init__(
self,
client: "_MemcachedClient",
prefix: str = "jinja2/bytecode/",
prefix: str = "_vendoring.jinja2/bytecode/",
timeout: t.Optional[int] = None,
ignore_memcache_errors: bool = True,
):

View File

@@ -6,8 +6,8 @@
from itertools import chain
from keyword import iskeyword as is_python_keyword
from markupsafe import escape
from markupsafe import Markup
from _vendoring.markupsafe import escape
from _vendoring.markupsafe import Markup
from . import nodes
from .exceptions import TemplateAssertionError
@@ -23,7 +23,7 @@
from .visitor import NodeVisitor
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
F = t.TypeVar("F", bound=t.Callable[..., t.Any])
@@ -836,7 +836,7 @@ def visit_Template(
exported_names = sorted(exported)
self.writeline("from __future__ import generator_stop") # Python < 3.7
self.writeline("from jinja2.runtime import " + ", ".join(exported_names))
self.writeline("from _vendoring.jinja2.runtime import " + ", ".join(exported_names))
# if we want a deferred initialization we cannot move the
# environment into a local name

View File

@@ -8,7 +8,7 @@
from .utils import Namespace
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
# defaults for the parser / lexer
BLOCK_START_STRING = "{%"

View File

@@ -12,7 +12,7 @@
from functools import reduce
from types import CodeType
from markupsafe import Markup
from _vendoring.markupsafe import Markup
from . import nodes
from .compiler import CodeGenerator
@@ -55,7 +55,7 @@
from .utils import missing
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .bccache import BytecodeCache
from .ext import Extension
from .loaders import BaseLoader
@@ -126,7 +126,7 @@ def _environment_config_check(environment: "Environment") -> "Environment":
"""Perform a sanity check on the environment."""
assert issubclass(
environment.undefined, Undefined
), "'undefined' must be a subclass of 'jinja2.Undefined'."
), "'undefined' must be a subclass of '_vendoring.jinja2.Undefined'."
assert (
environment.block_start_string
!= environment.variable_start_string
@@ -221,7 +221,7 @@ class Environment:
`autoescape`
If set to ``True`` the XML/HTML autoescaping feature is enabled by
default. For more details about autoescaping see
:class:`~markupsafe.Markup`. As of Jinja 2.4 this can also
:class:`~_vendoring.markupsafe.Markup`. As of Jinja 2.4 this can also
be a callable that is passed the template name and has to
return ``True`` or ``False`` depending on autoescape should be
enabled by default.
@@ -264,7 +264,7 @@ class Environment:
#: if this environment is sandboxed. Modifying this variable won't make
#: the environment sandboxed though. For a real sandboxed environment
#: have a look at jinja2.sandbox. This flag alone controls the code
#: have a look at _vendoring.jinja2.sandbox. This flag alone controls the code
#: generation by the compiler.
sandboxed = False
@@ -279,11 +279,11 @@ class Environment:
shared = False
#: the class that is used for code generation. See
#: :class:`~jinja2.compiler.CodeGenerator` for more information.
#: :class:`~_vendoring.jinja2.compiler.CodeGenerator` for more information.
code_generator_class: t.Type["CodeGenerator"] = CodeGenerator
#: the context class that is used for templates. See
#: :class:`~jinja2.runtime.Context` for more information.
#: :class:`~_vendoring.jinja2.runtime.Context` for more information.
context_class: t.Type[Context] = Context
template_class: t.Type["Template"]
@@ -650,7 +650,7 @@ def _tokenize(
state: t.Optional[str] = None,
) -> TokenStream:
"""Called by the parser to do the preprocessing and filtering
for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`.
for all the extensions. Returns a :class:`~_vendoring.jinja2.lexer.TokenStream`.
"""
source = self.preprocess(source, name, filename)
stream = self.lexer.tokenize(source, name, filename, state)
@@ -1547,7 +1547,7 @@ def __repr__(self) -> str:
class TemplateExpression:
"""The :meth:`jinja2.Environment.compile_expression` method returns an
"""The :meth:`_vendoring.jinja2.Environment.compile_expression` method returns an
instance of this object. It encapsulates the expression-like access
to the template with an expression it wraps.
"""

View File

@@ -4,7 +4,7 @@
import typing as t
import warnings
from markupsafe import Markup
from _vendoring.markupsafe import Markup
from . import defaults
from . import nodes
@@ -18,7 +18,7 @@
from .utils import pass_context
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .lexer import Token
from .lexer import TokenStream
from .parser import Parser
@@ -108,10 +108,10 @@ def preprocess(
def filter_stream(
self, stream: "TokenStream"
) -> t.Union["TokenStream", t.Iterable["Token"]]:
"""It's passed a :class:`~jinja2.lexer.TokenStream` that can be used
"""It's passed a :class:`~_vendoring.jinja2.lexer.TokenStream` that can be used
to filter tokens returned. This method has to return an iterable of
:class:`~jinja2.lexer.Token`\\s, but it doesn't have to return a
:class:`~jinja2.lexer.TokenStream`.
:class:`~_vendoring.jinja2.lexer.Token`\\s, but it doesn't have to return a
:class:`~_vendoring.jinja2.lexer.TokenStream`.
"""
return stream
@@ -145,7 +145,7 @@ def call_method(
lineno: t.Optional[int] = None,
) -> nodes.Call:
"""Call a method of the extension. This is a shortcut for
:meth:`attr` + :class:`jinja2.nodes.Call`.
:meth:`attr` + :class:`_vendoring.jinja2.nodes.Call`.
"""
if args is None:
args = []
@@ -629,9 +629,9 @@ class DebugExtension(Extension):
.. code-block:: text
{'context': {'cycler': <class 'jinja2.utils.Cycler'>,
{'context': {'cycler': <class '_vendoring.jinja2.utils.Cycler'>,
...,
'namespace': <class 'jinja2.utils.Namespace'>},
'namespace': <class '_vendoring.jinja2.utils.Namespace'>},
'filters': ['abs', 'attr', 'batch', 'capitalize', 'center', 'count', 'd',
..., 'urlencode', 'urlize', 'wordcount', 'wordwrap', 'xmlattr'],
'tests': ['!=', '<', '<=', '==', '>', '>=', 'callable', 'defined',
@@ -679,7 +679,7 @@ def extract_from_ast(
This example explains the behavior:
>>> from jinja2 import Environment
>>> from _vendoring.jinja2 import Environment
>>> env = Environment()
>>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}')
>>> list(extract_from_ast(node))

View File

@@ -9,9 +9,9 @@
from itertools import chain
from itertools import groupby
from markupsafe import escape
from markupsafe import Markup
from markupsafe import soft_str
from _vendoring.markupsafe import escape
from _vendoring.markupsafe import Markup
from _vendoring.markupsafe import soft_str
from .async_utils import async_variant
from .async_utils import auto_aiter
@@ -28,7 +28,7 @@
from .utils import urlize
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
from .nodes import EvalContext
from .runtime import Context
@@ -48,7 +48,7 @@ def contextfilter(f: F) -> F:
"""Pass the context as the first argument to the decorated function.
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use :func:`~jinja2.pass_context`
Will be removed in Jinja 3.1. Use :func:`~_vendoring.jinja2.pass_context`
instead.
"""
warnings.warn(
@@ -66,7 +66,7 @@ def evalcontextfilter(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
:func:`~jinja2.pass_eval_context` instead.
:func:`~_vendoring.jinja2.pass_eval_context` instead.
.. versionadded:: 2.4
"""
@@ -85,7 +85,7 @@ def environmentfilter(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
:func:`~jinja2.pass_environment` instead.
:func:`~_vendoring.jinja2.pass_environment` instead.
"""
warnings.warn(
"'environmentfilter' is renamed to 'pass_environment', the old"
@@ -547,10 +547,10 @@ def do_default(
{{ ''|default('the string was empty', true) }}
.. versionchanged:: 2.11
It's now possible to configure the :class:`~jinja2.Environment` with
:class:`~jinja2.ChainableUndefined` to make the `default` filter work
It's now possible to configure the :class:`~_vendoring.jinja2.Environment` with
:class:`~_vendoring.jinja2.ChainableUndefined` to make the `default` filter work
on nested elements and attributes that may contain undefined values
in the chain without getting an :exc:`~jinja2.UndefinedError`.
in the chain without getting an :exc:`~_vendoring.jinja2.UndefinedError`.
"""
if isinstance(value, Undefined) or (boolean and not value):
return default_value

View File

@@ -14,7 +14,7 @@
from .utils import LRUCache
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
# cache for the lexers. Exists in order to be able to have multiple
@@ -400,7 +400,7 @@ def close(self) -> None:
def expect(self, expr: str) -> Token:
"""Expect a given token type and return it. This accepts the same
argument as :meth:`jinja2.lexer.Token.test`.
argument as :meth:`_vendoring.jinja2.lexer.Token.test`.
"""
if not self.current.test(expr):
expr = describe_token_expr(expr)

View File

@@ -47,7 +47,7 @@ class BaseLoader:
A very basic example for a loader that looks up templates on the file
system could look like this::
from jinja2 import BaseLoader, TemplateNotFound
from _vendoring.jinja2 import BaseLoader, TemplateNotFound
from os.path import join, exists, getmtime
class MyLoader(BaseLoader):
@@ -594,7 +594,7 @@ class ModuleLoader(BaseLoader):
def __init__(
self, path: t.Union[str, os.PathLike, t.Sequence[t.Union[str, os.PathLike]]]
) -> None:
package_name = f"_jinja2_module_templates_{id(self):x}"
package_name = f"__vendoring.jinja2_module_templates_{id(self):x}"
# create a fake module that looks for the templates in the
# path given.

View File

@@ -36,7 +36,7 @@ def find_undeclared_variables(ast: nodes.Template) -> t.Set[str]:
variables will be used depending on the path the execution takes at
runtime, all variables are returned.
>>> from jinja2 import Environment, meta
>>> from _vendoring.jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
>>> meta.find_undeclared_variables(ast) == {'bar'}
@@ -64,7 +64,7 @@ def find_referenced_templates(ast: nodes.Template) -> t.Iterator[t.Optional[str]
imports. If dynamic inheritance or inclusion is used, `None` will be
yielded.
>>> from jinja2 import Environment, meta
>>> from _vendoring.jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% extends "layout.html" %}{% include helper %}')
>>> list(meta.find_referenced_templates(ast))

View File

@@ -7,12 +7,12 @@
import typing as t
from collections import deque
from markupsafe import Markup
from _vendoring.markupsafe import Markup
from .utils import _PassArg
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
_NodeBound = t.TypeVar("_NodeBound", bound="Node")
@@ -1041,7 +1041,7 @@ class ExtensionAttribute(Expr):
The identifier is the identifier of the :class:`Extension`.
This node is usually constructed by calling the
:meth:`~jinja2.ext.Extension.attr` method on an extension.
:meth:`~_vendoring.jinja2.ext.Extension.attr` method on an extension.
"""
fields = ("identifier", "name")
@@ -1063,7 +1063,7 @@ class ImportedName(Expr):
class InternalName(Expr):
"""An internal name in the compiler. You cannot create these nodes
yourself but the parser provides a
:meth:`~jinja2.parser.Parser.free_identifier` method that creates
:meth:`~_vendoring.jinja2.parser.Parser.free_identifier` method that creates
a new identifier for you. This identifier is not available from the
template and is not treated specially by the compiler.
"""
@@ -1114,7 +1114,7 @@ def as_const(
class ContextReference(Expr):
"""Returns the current template context. It can be used like a
:class:`Name` node, with a ``'load'`` ctx and will return the
current :class:`~jinja2.runtime.Context` object.
current :class:`~_vendoring.jinja2.runtime.Context` object.
Here an example that assigns the current template name to a
variable named `foo`::
@@ -1123,7 +1123,7 @@ class ContextReference(Expr):
Getattr(ContextReference(), 'name'))
This is basically equivalent to using the
:func:`~jinja2.pass_context` decorator when using the high-level
:func:`~_vendoring.jinja2.pass_context` decorator when using the high-level
API, which causes a reference to the context to be passed as the
first argument to a function.
"""
@@ -1188,7 +1188,7 @@ class EvalContextModifier(Stmt):
class ScopedEvalContextModifier(EvalContextModifier):
"""Modifies the eval context and reverts it later. Works exactly like
:class:`EvalContextModifier` but will only modify the
:class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
:class:`~_vendoring.jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
"""
fields = ("body",)

View File

@@ -9,7 +9,7 @@
from .lexer import describe_token_expr
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
_ImportInclude = t.TypeVar("_ImportInclude", nodes.Import, nodes.Include)
@@ -156,7 +156,7 @@ def is_tuple_end(
return False
def free_identifier(self, lineno: t.Optional[int] = None) -> nodes.InternalName:
"""Return a new free identifier as :class:`~jinja2.nodes.InternalName`."""
"""Return a new free identifier as :class:`~_vendoring.jinja2.nodes.InternalName`."""
self._last_identifier += 1
rv = object.__new__(nodes.InternalName)
nodes.Node.__init__(rv, f"fi{self._last_identifier}", lineno=lineno)
@@ -687,7 +687,7 @@ def parse_tuple(
explicit_parentheses: bool = False,
) -> t.Union[nodes.Tuple, nodes.Expr]:
"""Works like `parse_expression` but if multiple expressions are
delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
delimited by a comma a :class:`~_vendoring.jinja2.nodes.Tuple` node is created.
This method could also return a regular expression instead of a tuple
if no commas where found.

View File

@@ -5,9 +5,9 @@
from collections import abc
from itertools import chain
from markupsafe import escape # noqa: F401
from markupsafe import Markup
from markupsafe import soft_str
from _vendoring.markupsafe import escape # noqa: F401
from _vendoring.markupsafe import Markup
from _vendoring.markupsafe import soft_str
from .async_utils import auto_aiter
from .async_utils import auto_await # noqa: F401
@@ -28,7 +28,7 @@
if t.TYPE_CHECKING:
import logging
import typing_extensions as te
import _vendoring.typing_extensions as te
from .environment import Environment
class LoopRenderFunc(te.Protocol):
@@ -849,7 +849,7 @@ class Undefined:
>>> foo + 42
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = (
@@ -1020,7 +1020,7 @@ class ChainableUndefined(Undefined):
>>> foo.bar['baz'] + 42
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
.. versionadded:: 2.11.0
"""
@@ -1047,7 +1047,7 @@ class DebugUndefined(Undefined):
>>> foo + 42
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = ()
@@ -1077,15 +1077,15 @@ class StrictUndefined(Undefined):
>>> str(foo)
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
>>> not foo
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
>>> foo + 42
Traceback (most recent call last):
...
jinja2.exceptions.UndefinedError: 'foo' is undefined
_vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = ()

View File

@@ -9,8 +9,8 @@
from collections import deque
from string import Formatter
from markupsafe import EscapeFormatter
from markupsafe import Markup
from _vendoring.markupsafe import EscapeFormatter
from _vendoring.markupsafe import Markup
from .environment import Environment
from .exceptions import SecurityError
@@ -128,7 +128,7 @@ def is_internal_attribute(obj: t.Any, attr: str) -> bool:
python objects. This is useful if the environment method
:meth:`~SandboxedEnvironment.is_safe_attribute` is overridden.
>>> from jinja2.sandbox import is_internal_attribute
>>> from _vendoring.jinja2.sandbox import is_internal_attribute
>>> is_internal_attribute(str, "mro")
True
>>> is_internal_attribute(str, "upper")

View File

@@ -12,10 +12,10 @@
from types import CodeType
from urllib.parse import quote_from_bytes
import markupsafe
import _vendoring.markupsafe
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
F = t.TypeVar("F", bound=t.Callable[..., t.Any])
@@ -28,7 +28,7 @@
def pass_context(f: F) -> F:
"""Pass the :class:`~jinja2.runtime.Context` as the first argument
"""Pass the :class:`~_vendoring.jinja2.runtime.Context` as the first argument
to the decorated function when called while rendering a template.
Can be used on functions, filters, and tests.
@@ -45,7 +45,7 @@ def pass_context(f: F) -> F:
def pass_eval_context(f: F) -> F:
"""Pass the :class:`~jinja2.nodes.EvalContext` as the first argument
"""Pass the :class:`~_vendoring.jinja2.nodes.EvalContext` as the first argument
to the decorated function when called while rendering a template.
See :ref:`eval-context`.
@@ -62,7 +62,7 @@ def pass_eval_context(f: F) -> F:
def pass_environment(f: F) -> F:
"""Pass the :class:`~jinja2.Environment` as the first argument to
"""Pass the :class:`~_vendoring.jinja2.Environment` as the first argument to
the decorated function when called while rendering a template.
Can be used on functions, filters, and tests.
@@ -104,7 +104,7 @@ def contextfunction(f: F) -> F:
"""Pass the context as the first argument to the decorated function.
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use :func:`~jinja2.pass_context`
Will be removed in Jinja 3.1. Use :func:`~_vendoring.jinja2.pass_context`
instead.
"""
warnings.warn(
@@ -122,7 +122,7 @@ def evalcontextfunction(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
:func:`~jinja2.pass_eval_context` instead.
:func:`~_vendoring.jinja2.pass_eval_context` instead.
.. versionadded:: 2.4
"""
@@ -141,7 +141,7 @@ def environmentfunction(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
:func:`~jinja2.pass_environment` instead.
:func:`~_vendoring.jinja2.pass_environment` instead.
"""
warnings.warn(
"'environmentfunction' is renamed to 'pass_environment', the"
@@ -335,9 +335,9 @@ def trim_url(x: str) -> str:
def trim_url(x: str) -> str:
return x
words = re.split(r"(\s+)", str(markupsafe.escape(text)))
rel_attr = f' rel="{markupsafe.escape(rel)}"' if rel else ""
target_attr = f' target="{markupsafe.escape(target)}"' if target else ""
words = re.split(r"(\s+)", str(_vendoring.markupsafe.escape(text)))
rel_attr = f' rel="{_vendoring.markupsafe.escape(rel)}"' if rel else ""
target_attr = f' target="{_vendoring.markupsafe.escape(target)}"' if target else ""
for i, word in enumerate(words):
head, middle, tail = "", word, ""
@@ -455,8 +455,8 @@ def generate_lorem_ipsum(
if not html:
return "\n\n".join(result)
return markupsafe.Markup(
"\n".join(f"<p>{markupsafe.escape(x)}</p>" for x in result)
return _vendoring.markupsafe.Markup(
"\n".join(f"<p>{_vendoring.markupsafe.escape(x)}</p>" for x in result)
)
@@ -658,7 +658,7 @@ def select_autoescape(
If you want to enable it for all templates created from strings or
for all templates with `.html` and `.xml` extensions::
from jinja2 import Environment, select_autoescape
from _vendoring.jinja2 import Environment, select_autoescape
env = Environment(autoescape=select_autoescape(
enabled_extensions=('html', 'xml'),
default_for_string=True,
@@ -667,7 +667,7 @@ def select_autoescape(
Example configuration to turn it on at all times except if the template
ends with `.txt`::
from jinja2 import Environment, select_autoescape
from _vendoring.jinja2 import Environment, select_autoescape
env = Environment(autoescape=select_autoescape(
disabled_extensions=('txt',),
default_for_string=True,
@@ -703,10 +703,10 @@ def autoescape(template_name: t.Optional[str]) -> bool:
def htmlsafe_json_dumps(
obj: t.Any, dumps: t.Optional[t.Callable[..., str]] = None, **kwargs: t.Any
) -> markupsafe.Markup:
) -> _vendoring.markupsafe.Markup:
"""Serialize an object to a string of JSON with :func:`json.dumps`,
then replace HTML-unsafe characters with Unicode escapes and mark
the result safe with :class:`~markupsafe.Markup`.
the result safe with :class:`~_vendoring.markupsafe.Markup`.
This is available in templates as the ``|tojson`` filter.
@@ -732,7 +732,7 @@ def htmlsafe_json_dumps(
if dumps is None:
dumps = json.dumps
return markupsafe.Markup(
return _vendoring.markupsafe.Markup(
dumps(obj, **kwargs)
.replace("<", "\\u003c")
.replace(">", "\\u003e")
@@ -833,11 +833,11 @@ def __repr__(self) -> str:
return f"<Namespace {self.__attrs!r}>"
class Markup(markupsafe.Markup):
class Markup(_vendoring.markupsafe.Markup):
def __new__(cls, base="", encoding=None, errors="strict"): # type: ignore
warnings.warn(
"'jinja2.Markup' is deprecated and will be removed in Jinja"
" 3.1. Import 'markupsafe.Markup' instead.",
"'_vendoring.jinja2.Markup' is deprecated and will be removed in Jinja"
" 3.1. Import '_vendoring.markupsafe.Markup' instead.",
DeprecationWarning,
stacklevel=2,
)
@@ -846,9 +846,9 @@ def __new__(cls, base="", encoding=None, errors="strict"): # type: ignore
def escape(s: t.Any) -> str:
warnings.warn(
"'jinja2.escape' is deprecated and will be removed in Jinja"
" 3.1. Import 'markupsafe.escape' instead.",
"'_vendoring.jinja2.escape' is deprecated and will be removed in Jinja"
" 3.1. Import '_vendoring.markupsafe.escape' instead.",
DeprecationWarning,
stacklevel=2,
)
return markupsafe.escape(s)
return _vendoring.markupsafe.escape(s)

View File

@@ -6,7 +6,7 @@
from .nodes import Node
if t.TYPE_CHECKING:
import typing_extensions as te
import _vendoring.typing_extensions as te
class VisitCallable(te.Protocol):
def __call__(self, node: Node, *args: t.Any, **kwargs: t.Any) -> t.Any:

View File

@@ -1 +0,0 @@
from jsonschema import *

View File

@@ -8,18 +8,18 @@
instance under a schema, and will create a validator for you.
"""
from jsonschema.exceptions import (
from _vendoring.jsonschema.exceptions import (
ErrorTree, FormatError, RefResolutionError, SchemaError, ValidationError
)
from jsonschema._format import (
from _vendoring.jsonschema._format import (
FormatChecker,
draft3_format_checker,
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
)
from jsonschema._types import TypeChecker
from jsonschema.validators import (
from _vendoring.jsonschema._types import TypeChecker
from _vendoring.jsonschema.validators import (
Draft3Validator,
Draft4Validator,
Draft6Validator,

View File

@@ -1,2 +1,2 @@
from jsonschema.cli import main
from _vendoring.jsonschema.cli import main
main()

View File

@@ -3,8 +3,8 @@
import socket
import struct
from jsonschema.compat import str_types
from jsonschema.exceptions import FormatError
from _vendoring.jsonschema.compat import str_types
from _vendoring.jsonschema.exceptions import FormatError
class FormatChecker(object):

View File

@@ -1,6 +1,6 @@
from jsonschema import _utils
from jsonschema.compat import iteritems
from jsonschema.exceptions import ValidationError
from _vendoring.jsonschema import _utils
from _vendoring.jsonschema.compat import iteritems
from _vendoring.jsonschema.exceptions import ValidationError
def dependencies_draft3(validator, dependencies, instance, schema):

View File

@@ -9,7 +9,7 @@
import sys
from jsonschema.compat import PY3
from _vendoring.jsonschema.compat import PY3
class _NoModuleFound(Exception):

View File

@@ -1,10 +1,10 @@
import numbers
from pyrsistent import pmap
import attr
from _vendoring.pyrsistent import pmap
import _vendoring.attr
from jsonschema.compat import int_types, str_types
from jsonschema.exceptions import UndefinedTypeCheck
from _vendoring.jsonschema.compat import int_types, str_types
from _vendoring.jsonschema.exceptions import UndefinedTypeCheck
def is_array(checker, instance):
@@ -45,7 +45,7 @@ def is_any(checker, instance):
return True
@attr.s(frozen=True)
@_vendoring.attr.s(frozen=True)
class TypeChecker(object):
"""
A ``type`` property checker.
@@ -61,7 +61,7 @@ class TypeChecker(object):
The initial mapping of types to their checking functions.
"""
_type_checkers = attr.ib(default=pmap(), converter=pmap)
_type_checkers = _vendoring.attr.ib(default=pmap(), converter=pmap)
def is_type(self, instance, type):
"""
@@ -131,7 +131,7 @@ def redefine_many(self, definitions=()):
A new `TypeChecker` instance.
"""
return attr.evolve(
return _vendoring.attr.evolve(
self, type_checkers=self._type_checkers.update(definitions),
)
@@ -162,7 +162,7 @@ def remove(self, *types):
checkers = checkers.remove(each)
except KeyError:
raise UndefinedTypeCheck(each)
return attr.evolve(self, type_checkers=checkers)
return _vendoring.attr.evolve(self, type_checkers=checkers)
draft3_type_checker = TypeChecker(

View File

@@ -3,7 +3,7 @@
import pkgutil
import re
from jsonschema.compat import MutableMapping, str_types, urlsplit
from _vendoring.jsonschema.compat import MutableMapping, str_types, urlsplit
class URIDict(MutableMapping):
@@ -51,7 +51,7 @@ def load_schema(name):
Load a schema from ./schemas/``name``.json and return it.
"""
data = pkgutil.get_data("jsonschema", "schemas/{0}.json".format(name))
data = pkgutil.get_data("_vendoring.jsonschema", "schemas/{0}.json".format(name))
return json.loads(data.decode("utf-8"))

View File

@@ -1,6 +1,6 @@
import re
from jsonschema._utils import (
from _vendoring.jsonschema._utils import (
ensure_list,
equal,
extras_msg,
@@ -9,8 +9,8 @@
unbool,
uniq,
)
from jsonschema.exceptions import FormatError, ValidationError
from jsonschema.compat import iteritems
from _vendoring.jsonschema.exceptions import FormatError, ValidationError
from _vendoring.jsonschema.compat import iteritems
def patternProperties(validator, patternProperties, instance, schema):

View File

@@ -6,10 +6,10 @@
"""
from twisted.python.filepath import FilePath
from pyperf import Runner
from pyrsistent import m
from _vendoring.pyrsistent import m
from jsonschema.tests._suite import Version
import jsonschema
from _vendoring.jsonschema.tests._suite import Version
import _vendoring.jsonschema
issue232 = Version(

View File

@@ -7,7 +7,7 @@
"""
from pyperf import Runner
from jsonschema.tests._suite import Suite
from _vendoring.jsonschema.tests._suite import Suite
if __name__ == "__main__":

View File

@@ -6,9 +6,9 @@
import json
import sys
from jsonschema import __version__
from jsonschema._reflect import namedAny
from jsonschema.validators import validator_for
from _vendoring.jsonschema import __version__
from _vendoring.jsonschema._reflect import namedAny
from _vendoring.jsonschema.validators import validator_for
def _namedAnyWithDefault(name):

View File

@@ -6,10 +6,10 @@
import pprint
import textwrap
import attr
import _vendoring.attr
from jsonschema import _utils
from jsonschema.compat import PY3, iteritems
from _vendoring.jsonschema import _utils
from _vendoring.jsonschema.compat import PY3, iteritems
WEAK_MATCHES = frozenset(["anyOf", "oneOf"])
@@ -149,13 +149,13 @@ class SchemaError(_Error):
_word_for_instance_in_error_message = "schema"
@attr.s(hash=True)
@_vendoring.attr.s(hash=True)
class RefResolutionError(Exception):
"""
A ref could not be resolved.
"""
_cause = attr.ib()
_cause = _vendoring.attr.ib()
def __str__(self):
return str(self._cause)

View File

@@ -1,5 +0,0 @@
def bug(issue=None):
message = "A known bug."
if issue is not None:
message += " See issue #{issue}.".format(issue=issue)
return message

View File

@@ -1,239 +0,0 @@
"""
Python representations of the JSON Schema Test Suite tests.
"""
from functools import partial
import json
import os
import re
import subprocess
import sys
import unittest
from twisted.python.filepath import FilePath
import attr
from jsonschema.compat import PY3
from jsonschema.validators import validators
import jsonschema
def _find_suite():
root = os.environ.get("JSON_SCHEMA_TEST_SUITE")
if root is not None:
return FilePath(root)
root = FilePath(jsonschema.__file__).parent().sibling("json")
if not root.isdir(): # pragma: no cover
raise ValueError(
(
"Can't find the JSON-Schema-Test-Suite directory. "
"Set the 'JSON_SCHEMA_TEST_SUITE' environment "
"variable or run the tests from alongside a checkout "
"of the suite."
),
)
return root
@attr.s(hash=True)
class Suite(object):
_root = attr.ib(default=attr.Factory(_find_suite))
def _remotes(self):
jsonschema_suite = self._root.descendant(["bin", "jsonschema_suite"])
remotes = subprocess.check_output(
[sys.executable, jsonschema_suite.path, "remotes"],
)
return {
"http://localhost:1234/" + name: schema
for name, schema in json.loads(remotes.decode("utf-8")).items()
}
def benchmark(self, runner): # pragma: no cover
for name in validators:
self.version(name=name).benchmark(runner=runner)
def version(self, name):
return Version(
name=name,
path=self._root.descendant(["tests", name]),
remotes=self._remotes(),
)
@attr.s(hash=True)
class Version(object):
_path = attr.ib()
_remotes = attr.ib()
name = attr.ib()
def benchmark(self, runner, **kwargs): # pragma: no cover
for suite in self.tests():
for test in suite:
runner.bench_func(
test.fully_qualified_name,
partial(test.validate_ignoring_errors, **kwargs),
)
def tests(self):
return (
test
for child in self._path.globChildren("*.json")
for test in self._tests_in(
subject=child.basename()[:-5],
path=child,
)
)
def format_tests(self):
path = self._path.descendant(["optional", "format"])
return (
test
for child in path.globChildren("*.json")
for test in self._tests_in(
subject=child.basename()[:-5],
path=child,
)
)
def tests_of(self, name):
return self._tests_in(
subject=name,
path=self._path.child(name + ".json"),
)
def optional_tests_of(self, name):
return self._tests_in(
subject=name,
path=self._path.descendant(["optional", name + ".json"]),
)
def to_unittest_testcase(self, *suites, **kwargs):
name = kwargs.pop("name", "Test" + self.name.title())
methods = {
test.method_name: test.to_unittest_method(**kwargs)
for suite in suites
for tests in suite
for test in tests
}
cls = type(name, (unittest.TestCase,), methods)
try:
cls.__module__ = _someone_save_us_the_module_of_the_caller()
except Exception: # pragma: no cover
# We're doing crazy things, so if they go wrong, like a function
# behaving differently on some other interpreter, just make them
# not happen.
pass
return cls
def _tests_in(self, subject, path):
for each in json.loads(path.getContent().decode("utf-8")):
yield (
_Test(
version=self,
subject=subject,
case_description=each["description"],
schema=each["schema"],
remotes=self._remotes,
**test
) for test in each["tests"]
)
@attr.s(hash=True, repr=False)
class _Test(object):
version = attr.ib()
subject = attr.ib()
case_description = attr.ib()
description = attr.ib()
data = attr.ib()
schema = attr.ib(repr=False)
valid = attr.ib()
_remotes = attr.ib()
def __repr__(self): # pragma: no cover
return "<Test {}>".format(self.fully_qualified_name)
@property
def fully_qualified_name(self): # pragma: no cover
return " > ".join(
[
self.version.name,
self.subject,
self.case_description,
self.description,
]
)
@property
def method_name(self):
delimiters = r"[\W\- ]+"
name = "test_%s_%s_%s" % (
re.sub(delimiters, "_", self.subject),
re.sub(delimiters, "_", self.case_description),
re.sub(delimiters, "_", self.description),
)
if not PY3: # pragma: no cover
name = name.encode("utf-8")
return name
def to_unittest_method(self, skip=lambda test: None, **kwargs):
if self.valid:
def fn(this):
self.validate(**kwargs)
else:
def fn(this):
with this.assertRaises(jsonschema.ValidationError):
self.validate(**kwargs)
fn.__name__ = self.method_name
reason = skip(self)
return unittest.skipIf(reason is not None, reason)(fn)
def validate(self, Validator, **kwargs):
resolver = jsonschema.RefResolver.from_schema(
schema=self.schema,
store=self._remotes,
id_of=Validator.ID_OF,
)
jsonschema.validate(
instance=self.data,
schema=self.schema,
cls=Validator,
resolver=resolver,
**kwargs
)
def validate_ignoring_errors(self, Validator): # pragma: no cover
try:
self.validate(Validator=Validator)
except jsonschema.ValidationError:
pass
def _someone_save_us_the_module_of_the_caller():
"""
The FQON of the module 2nd stack frames up from here.
This is intended to allow us to dynamicallly return test case classes that
are indistinguishable from being defined in the module that wants them.
Otherwise, trial will mis-print the FQON, and copy pasting it won't re-run
the class that really is running.
Save us all, this is all so so so so so terrible.
"""
return sys._getframe(2).f_globals["__name__"]

View File

@@ -1,151 +0,0 @@
from unittest import TestCase
import json
import subprocess
import sys
from jsonschema import Draft4Validator, ValidationError, cli, __version__
from jsonschema.compat import NativeIO
from jsonschema.exceptions import SchemaError
def fake_validator(*errors):
errors = list(reversed(errors))
class FakeValidator(object):
def __init__(self, *args, **kwargs):
pass
def iter_errors(self, instance):
if errors:
return errors.pop()
return []
def check_schema(self, schema):
pass
return FakeValidator
class TestParser(TestCase):
FakeValidator = fake_validator()
instance_file = "foo.json"
schema_file = "schema.json"
def setUp(self):
cli.open = self.fake_open
self.addCleanup(delattr, cli, "open")
def fake_open(self, path):
if path == self.instance_file:
contents = ""
elif path == self.schema_file:
contents = {}
else: # pragma: no cover
self.fail("What is {!r}".format(path))
return NativeIO(json.dumps(contents))
def test_find_validator_by_fully_qualified_object_name(self):
arguments = cli.parse_args(
[
"--validator",
"jsonschema.tests.test_cli.TestParser.FakeValidator",
"--instance", self.instance_file,
self.schema_file,
]
)
self.assertIs(arguments["validator"], self.FakeValidator)
def test_find_validator_in_jsonschema(self):
arguments = cli.parse_args(
[
"--validator", "Draft4Validator",
"--instance", self.instance_file,
self.schema_file,
]
)
self.assertIs(arguments["validator"], Draft4Validator)
class TestCLI(TestCase):
def test_draft3_schema_draft4_validator(self):
stdout, stderr = NativeIO(), NativeIO()
with self.assertRaises(SchemaError):
cli.run(
{
"validator": Draft4Validator,
"schema": {
"anyOf": [
{"minimum": 20},
{"type": "string"},
{"required": True},
],
},
"instances": [1],
"error_format": "{error.message}",
},
stdout=stdout,
stderr=stderr,
)
def test_successful_validation(self):
stdout, stderr = NativeIO(), NativeIO()
exit_code = cli.run(
{
"validator": fake_validator(),
"schema": {},
"instances": [1],
"error_format": "{error.message}",
},
stdout=stdout,
stderr=stderr,
)
self.assertFalse(stdout.getvalue())
self.assertFalse(stderr.getvalue())
self.assertEqual(exit_code, 0)
def test_unsuccessful_validation(self):
error = ValidationError("I am an error!", instance=1)
stdout, stderr = NativeIO(), NativeIO()
exit_code = cli.run(
{
"validator": fake_validator([error]),
"schema": {},
"instances": [1],
"error_format": "{error.instance} - {error.message}",
},
stdout=stdout,
stderr=stderr,
)
self.assertFalse(stdout.getvalue())
self.assertEqual(stderr.getvalue(), "1 - I am an error!")
self.assertEqual(exit_code, 1)
def test_unsuccessful_validation_multiple_instances(self):
first_errors = [
ValidationError("9", instance=1),
ValidationError("8", instance=1),
]
second_errors = [ValidationError("7", instance=2)]
stdout, stderr = NativeIO(), NativeIO()
exit_code = cli.run(
{
"validator": fake_validator(first_errors, second_errors),
"schema": {},
"instances": [1, 2],
"error_format": "{error.instance} - {error.message}\t",
},
stdout=stdout,
stderr=stderr,
)
self.assertFalse(stdout.getvalue())
self.assertEqual(stderr.getvalue(), "1 - 9\t1 - 8\t2 - 7\t")
self.assertEqual(exit_code, 1)
def test_version(self):
version = subprocess.check_output(
[sys.executable, "-m", "jsonschema", "--version"],
stderr=subprocess.STDOUT,
)
version = version.decode("utf-8").strip()
self.assertEqual(version, __version__)

View File

@@ -1,462 +0,0 @@
from unittest import TestCase
import textwrap
from jsonschema import Draft4Validator, exceptions
from jsonschema.compat import PY3
class TestBestMatch(TestCase):
def best_match(self, errors):
errors = list(errors)
best = exceptions.best_match(errors)
reversed_best = exceptions.best_match(reversed(errors))
msg = "Didn't return a consistent best match!\nGot: {0}\n\nThen: {1}"
self.assertEqual(
best._contents(), reversed_best._contents(),
msg=msg.format(best, reversed_best),
)
return best
def test_shallower_errors_are_better_matches(self):
validator = Draft4Validator(
{
"properties": {
"foo": {
"minProperties": 2,
"properties": {"bar": {"type": "object"}},
},
},
},
)
best = self.best_match(validator.iter_errors({"foo": {"bar": []}}))
self.assertEqual(best.validator, "minProperties")
def test_oneOf_and_anyOf_are_weak_matches(self):
"""
A property you *must* match is probably better than one you have to
match a part of.
"""
validator = Draft4Validator(
{
"minProperties": 2,
"anyOf": [{"type": "string"}, {"type": "number"}],
"oneOf": [{"type": "string"}, {"type": "number"}],
}
)
best = self.best_match(validator.iter_errors({}))
self.assertEqual(best.validator, "minProperties")
def test_if_the_most_relevant_error_is_anyOf_it_is_traversed(self):
"""
If the most relevant error is an anyOf, then we traverse its context
and select the otherwise *least* relevant error, since in this case
that means the most specific, deep, error inside the instance.
I.e. since only one of the schemas must match, we look for the most
relevant one.
"""
validator = Draft4Validator(
{
"properties": {
"foo": {
"anyOf": [
{"type": "string"},
{"properties": {"bar": {"type": "array"}}},
],
},
},
},
)
best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
self.assertEqual(best.validator_value, "array")
def test_if_the_most_relevant_error_is_oneOf_it_is_traversed(self):
"""
If the most relevant error is an oneOf, then we traverse its context
and select the otherwise *least* relevant error, since in this case
that means the most specific, deep, error inside the instance.
I.e. since only one of the schemas must match, we look for the most
relevant one.
"""
validator = Draft4Validator(
{
"properties": {
"foo": {
"oneOf": [
{"type": "string"},
{"properties": {"bar": {"type": "array"}}},
],
},
},
},
)
best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
self.assertEqual(best.validator_value, "array")
def test_if_the_most_relevant_error_is_allOf_it_is_traversed(self):
"""
Now, if the error is allOf, we traverse but select the *most* relevant
error from the context, because all schemas here must match anyways.
"""
validator = Draft4Validator(
{
"properties": {
"foo": {
"allOf": [
{"type": "string"},
{"properties": {"bar": {"type": "array"}}},
],
},
},
},
)
best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
self.assertEqual(best.validator_value, "string")
def test_nested_context_for_oneOf(self):
validator = Draft4Validator(
{
"properties": {
"foo": {
"oneOf": [
{"type": "string"},
{
"oneOf": [
{"type": "string"},
{
"properties": {
"bar": {"type": "array"},
},
},
],
},
],
},
},
},
)
best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
self.assertEqual(best.validator_value, "array")
def test_one_error(self):
validator = Draft4Validator({"minProperties": 2})
error, = validator.iter_errors({})
self.assertEqual(
exceptions.best_match(validator.iter_errors({})).validator,
"minProperties",
)
def test_no_errors(self):
validator = Draft4Validator({})
self.assertIsNone(exceptions.best_match(validator.iter_errors({})))
class TestByRelevance(TestCase):
def test_short_paths_are_better_matches(self):
shallow = exceptions.ValidationError("Oh no!", path=["baz"])
deep = exceptions.ValidationError("Oh yes!", path=["foo", "bar"])
match = max([shallow, deep], key=exceptions.relevance)
self.assertIs(match, shallow)
match = max([deep, shallow], key=exceptions.relevance)
self.assertIs(match, shallow)
def test_global_errors_are_even_better_matches(self):
shallow = exceptions.ValidationError("Oh no!", path=[])
deep = exceptions.ValidationError("Oh yes!", path=["foo"])
errors = sorted([shallow, deep], key=exceptions.relevance)
self.assertEqual(
[list(error.path) for error in errors],
[["foo"], []],
)
errors = sorted([deep, shallow], key=exceptions.relevance)
self.assertEqual(
[list(error.path) for error in errors],
[["foo"], []],
)
def test_weak_validators_are_lower_priority(self):
weak = exceptions.ValidationError("Oh no!", path=[], validator="a")
normal = exceptions.ValidationError("Oh yes!", path=[], validator="b")
best_match = exceptions.by_relevance(weak="a")
match = max([weak, normal], key=best_match)
self.assertIs(match, normal)
match = max([normal, weak], key=best_match)
self.assertIs(match, normal)
def test_strong_validators_are_higher_priority(self):
weak = exceptions.ValidationError("Oh no!", path=[], validator="a")
normal = exceptions.ValidationError("Oh yes!", path=[], validator="b")
strong = exceptions.ValidationError("Oh fine!", path=[], validator="c")
best_match = exceptions.by_relevance(weak="a", strong="c")
match = max([weak, normal, strong], key=best_match)
self.assertIs(match, strong)
match = max([strong, normal, weak], key=best_match)
self.assertIs(match, strong)
class TestErrorTree(TestCase):
def test_it_knows_how_many_total_errors_it_contains(self):
# FIXME: https://github.com/Julian/jsonschema/issues/442
errors = [
exceptions.ValidationError("Something", validator=i)
for i in range(8)
]
tree = exceptions.ErrorTree(errors)
self.assertEqual(tree.total_errors, 8)
def test_it_contains_an_item_if_the_item_had_an_error(self):
errors = [exceptions.ValidationError("a message", path=["bar"])]
tree = exceptions.ErrorTree(errors)
self.assertIn("bar", tree)
def test_it_does_not_contain_an_item_if_the_item_had_no_error(self):
errors = [exceptions.ValidationError("a message", path=["bar"])]
tree = exceptions.ErrorTree(errors)
self.assertNotIn("foo", tree)
def test_validators_that_failed_appear_in_errors_dict(self):
error = exceptions.ValidationError("a message", validator="foo")
tree = exceptions.ErrorTree([error])
self.assertEqual(tree.errors, {"foo": error})
def test_it_creates_a_child_tree_for_each_nested_path(self):
errors = [
exceptions.ValidationError("a bar message", path=["bar"]),
exceptions.ValidationError("a bar -> 0 message", path=["bar", 0]),
]
tree = exceptions.ErrorTree(errors)
self.assertIn(0, tree["bar"])
self.assertNotIn(1, tree["bar"])
def test_children_have_their_errors_dicts_built(self):
e1, e2 = (
exceptions.ValidationError("1", validator="foo", path=["bar", 0]),
exceptions.ValidationError("2", validator="quux", path=["bar", 0]),
)
tree = exceptions.ErrorTree([e1, e2])
self.assertEqual(tree["bar"][0].errors, {"foo": e1, "quux": e2})
def test_multiple_errors_with_instance(self):
e1, e2 = (
exceptions.ValidationError(
"1",
validator="foo",
path=["bar", "bar2"],
instance="i1"),
exceptions.ValidationError(
"2",
validator="quux",
path=["foobar", 2],
instance="i2"),
)
exceptions.ErrorTree([e1, e2])
def test_it_does_not_contain_subtrees_that_are_not_in_the_instance(self):
error = exceptions.ValidationError("123", validator="foo", instance=[])
tree = exceptions.ErrorTree([error])
with self.assertRaises(IndexError):
tree[0]
def test_if_its_in_the_tree_anyhow_it_does_not_raise_an_error(self):
"""
If a validator is dumb (like :validator:`required` in draft 3) and
refers to a path that isn't in the instance, the tree still properly
returns a subtree for that path.
"""
error = exceptions.ValidationError(
"a message", validator="foo", instance={}, path=["foo"],
)
tree = exceptions.ErrorTree([error])
self.assertIsInstance(tree["foo"], exceptions.ErrorTree)
class TestErrorInitReprStr(TestCase):
def make_error(self, **kwargs):
defaults = dict(
message=u"hello",
validator=u"type",
validator_value=u"string",
instance=5,
schema={u"type": u"string"},
)
defaults.update(kwargs)
return exceptions.ValidationError(**defaults)
def assertShows(self, expected, **kwargs):
if PY3: # pragma: no cover
expected = expected.replace("u'", "'")
expected = textwrap.dedent(expected).rstrip("\n")
error = self.make_error(**kwargs)
message_line, _, rest = str(error).partition("\n")
self.assertEqual(message_line, error.message)
self.assertEqual(rest, expected)
def test_it_calls_super_and_sets_args(self):
error = self.make_error()
self.assertGreater(len(error.args), 1)
def test_repr(self):
self.assertEqual(
repr(exceptions.ValidationError(message="Hello!")),
"<ValidationError: %r>" % "Hello!",
)
def test_unset_error(self):
error = exceptions.ValidationError("message")
self.assertEqual(str(error), "message")
kwargs = {
"validator": "type",
"validator_value": "string",
"instance": 5,
"schema": {"type": "string"},
}
# Just the message should show if any of the attributes are unset
for attr in kwargs:
k = dict(kwargs)
del k[attr]
error = exceptions.ValidationError("message", **k)
self.assertEqual(str(error), "message")
def test_empty_paths(self):
self.assertShows(
"""
Failed validating u'type' in schema:
{u'type': u'string'}
On instance:
5
""",
path=[],
schema_path=[],
)
def test_one_item_paths(self):
self.assertShows(
"""
Failed validating u'type' in schema:
{u'type': u'string'}
On instance[0]:
5
""",
path=[0],
schema_path=["items"],
)
def test_multiple_item_paths(self):
self.assertShows(
"""
Failed validating u'type' in schema[u'items'][0]:
{u'type': u'string'}
On instance[0][u'a']:
5
""",
path=[0, u"a"],
schema_path=[u"items", 0, 1],
)
def test_uses_pprint(self):
self.assertShows(
"""
Failed validating u'maxLength' in schema:
{0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8,
9: 9,
10: 10,
11: 11,
12: 12,
13: 13,
14: 14,
15: 15,
16: 16,
17: 17,
18: 18,
19: 19}
On instance:
[0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24]
""",
instance=list(range(25)),
schema=dict(zip(range(20), range(20))),
validator=u"maxLength",
)
def test_str_works_with_instances_having_overriden_eq_operator(self):
"""
Check for https://github.com/Julian/jsonschema/issues/164 which
rendered exceptions unusable when a `ValidationError` involved
instances with an `__eq__` method that returned truthy values.
"""
class DontEQMeBro(object):
def __eq__(this, other): # pragma: no cover
self.fail("Don't!")
def __ne__(this, other): # pragma: no cover
self.fail("Don't!")
instance = DontEQMeBro()
error = exceptions.ValidationError(
"a message",
validator="foo",
instance=instance,
validator_value="some",
schema="schema",
)
self.assertIn(repr(instance), str(error))
class TestHashable(TestCase):
def test_hashable(self):
set([exceptions.ValidationError("")])
set([exceptions.SchemaError("")])

View File

@@ -1,89 +0,0 @@
"""
Tests for the parts of jsonschema related to the :validator:`format` property.
"""
from unittest import TestCase
from jsonschema import FormatError, ValidationError, FormatChecker
from jsonschema.validators import Draft4Validator
BOOM = ValueError("Boom!")
BANG = ZeroDivisionError("Bang!")
def boom(thing):
if thing == "bang":
raise BANG
raise BOOM
class TestFormatChecker(TestCase):
def test_it_can_validate_no_formats(self):
checker = FormatChecker(formats=())
self.assertFalse(checker.checkers)
def test_it_raises_a_key_error_for_unknown_formats(self):
with self.assertRaises(KeyError):
FormatChecker(formats=["o noes"])
def test_it_can_register_cls_checkers(self):
original = dict(FormatChecker.checkers)
self.addCleanup(FormatChecker.checkers.pop, "boom")
FormatChecker.cls_checks("boom")(boom)
self.assertEqual(
FormatChecker.checkers,
dict(original, boom=(boom, ())),
)
def test_it_can_register_checkers(self):
checker = FormatChecker()
checker.checks("boom")(boom)
self.assertEqual(
checker.checkers,
dict(FormatChecker.checkers, boom=(boom, ()))
)
def test_it_catches_registered_errors(self):
checker = FormatChecker()
checker.checks("boom", raises=type(BOOM))(boom)
with self.assertRaises(FormatError) as cm:
checker.check(instance=12, format="boom")
self.assertIs(cm.exception.cause, BOOM)
self.assertIs(cm.exception.__cause__, BOOM)
# Unregistered errors should not be caught
with self.assertRaises(type(BANG)):
checker.check(instance="bang", format="boom")
def test_format_error_causes_become_validation_error_causes(self):
checker = FormatChecker()
checker.checks("boom", raises=ValueError)(boom)
validator = Draft4Validator({"format": "boom"}, format_checker=checker)
with self.assertRaises(ValidationError) as cm:
validator.validate("BOOM")
self.assertIs(cm.exception.cause, BOOM)
self.assertIs(cm.exception.__cause__, BOOM)
def test_format_checkers_come_with_defaults(self):
# This is bad :/ but relied upon.
# The docs for quite awhile recommended people do things like
# validate(..., format_checker=FormatChecker())
# We should change that, but we can't without deprecation...
checker = FormatChecker()
with self.assertRaises(FormatError):
checker.check(instance="not-an-ipv4", format="ipv4")
def test_repr(self):
checker = FormatChecker(formats=())
checker.checks("foo")(lambda thing: True)
checker.checks("bar")(lambda thing: True)
checker.checks("baz")(lambda thing: True)
self.assertEqual(
repr(checker),
"<FormatChecker checkers=['bar', 'baz', 'foo']>",
)

View File

@@ -1,277 +0,0 @@
"""
Test runner for the JSON Schema official test suite
Tests comprehensive correctness of each draft's validator.
See https://github.com/json-schema-org/JSON-Schema-Test-Suite for details.
"""
import sys
import warnings
from jsonschema import (
Draft3Validator,
Draft4Validator,
Draft6Validator,
Draft7Validator,
draft3_format_checker,
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
)
from jsonschema.tests._helpers import bug
from jsonschema.tests._suite import Suite
from jsonschema.validators import _DEPRECATED_DEFAULT_TYPES, create
SUITE = Suite()
DRAFT3 = SUITE.version(name="draft3")
DRAFT4 = SUITE.version(name="draft4")
DRAFT6 = SUITE.version(name="draft6")
DRAFT7 = SUITE.version(name="draft7")
def skip(message, **kwargs):
def skipper(test):
if all(value == getattr(test, attr) for attr, value in kwargs.items()):
return message
return skipper
def missing_format(checker):
def missing_format(test):
schema = test.schema
if schema is True or schema is False or "format" not in schema:
return
if schema["format"] not in checker.checkers:
return "Format checker {0!r} not found.".format(schema["format"])
return missing_format
is_narrow_build = sys.maxunicode == 2 ** 16 - 1
if is_narrow_build: # pragma: no cover
message = "Not running surrogate Unicode case, this Python is narrow."
def narrow_unicode_build(test): # pragma: no cover
return skip(
message=message,
description="one supplementary Unicode code point is not long enough",
)(test) or skip(
message=message,
description="two supplementary Unicode code points is long enough",
)(test)
else:
def narrow_unicode_build(test): # pragma: no cover
return
TestDraft3 = DRAFT3.to_unittest_testcase(
DRAFT3.tests(),
DRAFT3.optional_tests_of(name="bignum"),
DRAFT3.optional_tests_of(name="format"),
DRAFT3.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft3Validator,
format_checker=draft3_format_checker,
skip=lambda test: (
narrow_unicode_build(test)
or missing_format(draft3_format_checker)(test)
or skip(
message="Upstream bug in strict_rfc3339",
subject="format",
description="case-insensitive T and Z",
)(test)
),
)
TestDraft4 = DRAFT4.to_unittest_testcase(
DRAFT4.tests(),
DRAFT4.optional_tests_of(name="bignum"),
DRAFT4.optional_tests_of(name="format"),
DRAFT4.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft4Validator,
format_checker=draft4_format_checker,
skip=lambda test: (
narrow_unicode_build(test)
or missing_format(draft4_format_checker)(test)
or skip(
message=bug(),
subject="ref",
case_description="Recursive references between schemas",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description="Location-independent identifier",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with absolute URI"
),
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with base URI change in subschema"
),
)(test)
or skip(
message=bug(),
subject="refRemote",
case_description="base URI change - change folder in subschema",
)(test)
or skip(
message="Upstream bug in strict_rfc3339",
subject="format",
description="case-insensitive T and Z",
)(test)
),
)
TestDraft6 = DRAFT6.to_unittest_testcase(
DRAFT6.tests(),
DRAFT6.optional_tests_of(name="bignum"),
DRAFT6.optional_tests_of(name="format"),
DRAFT6.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft6Validator,
format_checker=draft6_format_checker,
skip=lambda test: (
narrow_unicode_build(test)
or missing_format(draft6_format_checker)(test)
or skip(
message=bug(),
subject="ref",
case_description="Recursive references between schemas",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description="Location-independent identifier",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with absolute URI"
),
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with base URI change in subschema"
),
)(test)
or skip(
message=bug(),
subject="refRemote",
case_description="base URI change - change folder in subschema",
)(test)
or skip(
message="Upstream bug in strict_rfc3339",
subject="format",
description="case-insensitive T and Z",
)(test)
),
)
TestDraft7 = DRAFT7.to_unittest_testcase(
DRAFT7.tests(),
DRAFT7.format_tests(),
DRAFT7.optional_tests_of(name="bignum"),
DRAFT7.optional_tests_of(name="content"),
DRAFT7.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft7Validator,
format_checker=draft7_format_checker,
skip=lambda test: (
narrow_unicode_build(test)
or missing_format(draft7_format_checker)(test)
or skip(
message=bug(),
subject="ref",
case_description="Recursive references between schemas",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description="Location-independent identifier",
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with absolute URI"
),
)(test)
or skip(
message=bug(371),
subject="ref",
case_description=(
"Location-independent identifier with base URI change in subschema"
),
)(test)
or skip(
message=bug(),
subject="refRemote",
case_description="base URI change - change folder in subschema",
)(test)
or skip(
message="Upstream bug in strict_rfc3339",
subject="date-time",
description="case-insensitive T and Z",
)(test)
or skip(
message=bug(593),
subject="content",
case_description=(
"validation of string-encoded content based on media type"
),
)(test)
or skip(
message=bug(593),
subject="content",
case_description="validation of binary string-encoding",
)(test)
or skip(
message=bug(593),
subject="content",
case_description=(
"validation of binary-encoded media type documents"
),
)(test)
),
)
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
TestDraft3LegacyTypeCheck = DRAFT3.to_unittest_testcase(
# Interestingly the any part couldn't really be done w/the old API.
(
(test for test in each if test.schema != {"type": "any"})
for each in DRAFT3.tests_of(name="type")
),
name="TestDraft3LegacyTypeCheck",
Validator=create(
meta_schema=Draft3Validator.META_SCHEMA,
validators=Draft3Validator.VALIDATORS,
default_types=_DEPRECATED_DEFAULT_TYPES,
),
)
TestDraft4LegacyTypeCheck = DRAFT4.to_unittest_testcase(
DRAFT4.tests_of(name="type"),
name="TestDraft4LegacyTypeCheck",
Validator=create(
meta_schema=Draft4Validator.META_SCHEMA,
validators=Draft4Validator.VALIDATORS,
default_types=_DEPRECATED_DEFAULT_TYPES,
),
)

View File

@@ -1,190 +0,0 @@
"""
Tests on the new type interface. The actual correctness of the type checking
is handled in test_jsonschema_test_suite; these tests check that TypeChecker
functions correctly and can facilitate extensions to type checking
"""
from collections import namedtuple
from unittest import TestCase
from jsonschema import ValidationError, _validators
from jsonschema._types import TypeChecker
from jsonschema.exceptions import UndefinedTypeCheck
from jsonschema.validators import Draft4Validator, extend
def equals_2(checker, instance):
return instance == 2
def is_namedtuple(instance):
return isinstance(instance, tuple) and getattr(instance, "_fields", None)
def is_object_or_named_tuple(checker, instance):
if Draft4Validator.TYPE_CHECKER.is_type(instance, "object"):
return True
return is_namedtuple(instance)
def coerce_named_tuple(fn):
def coerced(validator, value, instance, schema):
if is_namedtuple(instance):
instance = instance._asdict()
return fn(validator, value, instance, schema)
return coerced
required = coerce_named_tuple(_validators.required)
properties = coerce_named_tuple(_validators.properties)
class TestTypeChecker(TestCase):
def test_is_type(self):
checker = TypeChecker({"two": equals_2})
self.assertEqual(
(
checker.is_type(instance=2, type="two"),
checker.is_type(instance="bar", type="two"),
),
(True, False),
)
def test_is_unknown_type(self):
with self.assertRaises(UndefinedTypeCheck) as context:
TypeChecker().is_type(4, "foobar")
self.assertIn("foobar", str(context.exception))
def test_checks_can_be_added_at_init(self):
checker = TypeChecker({"two": equals_2})
self.assertEqual(checker, TypeChecker().redefine("two", equals_2))
def test_redefine_existing_type(self):
self.assertEqual(
TypeChecker().redefine("two", object()).redefine("two", equals_2),
TypeChecker().redefine("two", equals_2),
)
def test_remove(self):
self.assertEqual(
TypeChecker({"two": equals_2}).remove("two"),
TypeChecker(),
)
def test_remove_unknown_type(self):
with self.assertRaises(UndefinedTypeCheck) as context:
TypeChecker().remove("foobar")
self.assertIn("foobar", str(context.exception))
def test_redefine_many(self):
self.assertEqual(
TypeChecker().redefine_many({"foo": int, "bar": str}),
TypeChecker().redefine("foo", int).redefine("bar", str),
)
def test_remove_multiple(self):
self.assertEqual(
TypeChecker({"foo": int, "bar": str}).remove("foo", "bar"),
TypeChecker(),
)
def test_type_check_can_raise_key_error(self):
"""
Make sure no one writes:
try:
self._type_checkers[type](...)
except KeyError:
ignoring the fact that the function itself can raise that.
"""
error = KeyError("Stuff")
def raises_keyerror(checker, instance):
raise error
with self.assertRaises(KeyError) as context:
TypeChecker({"foo": raises_keyerror}).is_type(4, "foo")
self.assertIs(context.exception, error)
class TestCustomTypes(TestCase):
def test_simple_type_can_be_extended(self):
def int_or_str_int(checker, instance):
if not isinstance(instance, (int, str)):
return False
try:
int(instance)
except ValueError:
return False
return True
CustomValidator = extend(
Draft4Validator,
type_checker=Draft4Validator.TYPE_CHECKER.redefine(
"integer", int_or_str_int,
),
)
validator = CustomValidator({"type": "integer"})
validator.validate(4)
validator.validate("4")
with self.assertRaises(ValidationError):
validator.validate(4.4)
def test_object_can_be_extended(self):
schema = {"type": "object"}
Point = namedtuple("Point", ["x", "y"])
type_checker = Draft4Validator.TYPE_CHECKER.redefine(
u"object", is_object_or_named_tuple,
)
CustomValidator = extend(Draft4Validator, type_checker=type_checker)
validator = CustomValidator(schema)
validator.validate(Point(x=4, y=5))
def test_object_extensions_require_custom_validators(self):
schema = {"type": "object", "required": ["x"]}
type_checker = Draft4Validator.TYPE_CHECKER.redefine(
u"object", is_object_or_named_tuple,
)
CustomValidator = extend(Draft4Validator, type_checker=type_checker)
validator = CustomValidator(schema)
Point = namedtuple("Point", ["x", "y"])
# Cannot handle required
with self.assertRaises(ValidationError):
validator.validate(Point(x=4, y=5))
def test_object_extensions_can_handle_custom_validators(self):
schema = {
"type": "object",
"required": ["x"],
"properties": {"x": {"type": "integer"}},
}
type_checker = Draft4Validator.TYPE_CHECKER.redefine(
u"object", is_object_or_named_tuple,
)
CustomValidator = extend(
Draft4Validator,
type_checker=type_checker,
validators={"required": required, "properties": properties},
)
validator = CustomValidator(schema)
Point = namedtuple("Point", ["x", "y"])
# Can now process required and properties
validator.validate(Point(x=4, y=5))
with self.assertRaises(ValidationError):
validator.validate(Point(x="not an integer", y=5))

File diff suppressed because it is too large Load Diff

View File

@@ -8,16 +8,16 @@
import json
import numbers
from six import add_metaclass
from _vendoring.six import add_metaclass
from jsonschema import (
from _vendoring.jsonschema import (
_legacy_validators,
_types,
_utils,
_validators,
exceptions,
)
from jsonschema.compat import (
from _vendoring.jsonschema.compat import (
Sequence,
int_types,
iteritems,
@@ -33,7 +33,7 @@
# Sigh. https://gitlab.com/pycqa/flake8/issues/280
# https://github.com/pyga/ebb-lint/issues/7
# Imported for backwards compatibility.
from jsonschema.exceptions import ErrorTree
from _vendoring.jsonschema.exceptions import ErrorTree
ErrorTree

View File

@@ -1 +0,0 @@
from macholib import *

View File

@@ -7,7 +7,7 @@
import struct
import sys
from macholib.util import fileview
from _vendoring.macholib.util import fileview
from .mach_o import (
FAT_MAGIC,
@@ -41,7 +41,7 @@
from .ptypes import sizeof
try:
from macholib.compat import bytes
from _vendoring.macholib.compat import bytes
except ImportError:
pass

View File

@@ -5,11 +5,11 @@
import os
import sys
from altgraph.ObjectGraph import ObjectGraph
from _vendoring.altgraph.ObjectGraph import ObjectGraph
from macholib.dyld import dyld_find
from macholib.itergraphreport import itergraphreport
from macholib.MachO import MachO
from _vendoring.macholib.dyld import dyld_find
from _vendoring.macholib.itergraphreport import itergraphreport
from _vendoring.macholib.MachO import MachO
__all__ = ["MachOGraph"]

View File

@@ -1,9 +1,9 @@
import os
from collections import deque
from macholib.dyld import framework_info
from macholib.MachOGraph import MachOGraph, MissingMachO
from macholib.util import (
from _vendoring.macholib.dyld import framework_info
from _vendoring.macholib.MachOGraph import MachOGraph, MissingMachO
from _vendoring.macholib.util import (
flipwritable,
has_filename_filter,
in_system_path,

View File

@@ -5,7 +5,7 @@
import sys
from macholib.mach_o import (
from _vendoring.macholib.mach_o import (
MH_CIGAM_64,
MH_MAGIC_64,
dylib_module,

View File

@@ -3,8 +3,8 @@
import os
import sys
from macholib import macho_dump, macho_standalone
from macholib.util import is_platform_file
from _vendoring.macholib import macho_dump, macho_standalone
from _vendoring.macholib.util import is_platform_file
gCommand = None
@@ -43,10 +43,10 @@ def walk_tree(callback, paths):
def print_usage(fp):
print("Usage:", file=fp)
print(" python -mmacholib [help|--help]", file=fp)
print(" python -mmacholib dump FILE ...", file=fp)
print(" python -mmacholib find DIR ...", file=fp)
print(" python -mmacholib standalone DIR ...", file=fp)
print(" python -m_vendoring.macholib [help|--help]", file=fp)
print(" python -m_vendoring.macholib dump FILE ...", file=fp)
print(" python -m_vendoring.macholib find DIR ...", file=fp)
print(" python -m_vendoring.macholib standalone DIR ...", file=fp)
def main():

Some files were not shown because too many files have changed in this diff Show More