diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..aed1b806 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,31 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.feature] +indent_size = 2 + +[*.json] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +trim_trailing_whitespace = false + +[.github/workflows/*.yml] +indent_size = 2 + +[composer.json] +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..c0b9fee2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +data export-ignore +tests export-ignore +.editorconfig export-ignore +.php_cs.dist export-ignore +.travis.yml export-ignore +box.json.dist export-ignore +composer.lock export-ignore +CONTRIBUTING.md export-ignore +phpstan.neon export-ignore +phpunit.xml.dist export-ignore +scoper.inc.php export-ignore diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 00000000..e993f44f --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,9 @@ +version: 2 +updates: + - + package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + commit-message: + prefix: ci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..b504cf2a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,84 @@ +name: CI + +on: + push: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + name: Build and Test + runs-on: ubuntu-latest + strategy: + matrix: + php: + - '8.2' + - '8.3' + - '8.4' + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + ini-values: memory_limit=-1 + coverage: pcov + tools: composer, cs2pr, php-cs-fixer + + - name: Get Composer Cache Directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install prerequisites + run: | + wget -O box.phar https://github.com/humbug/box/releases/download/4.6.2/box.phar + echo "BOX_BIN=$(pwd)/box.phar" >> $GITHUB_ENV + sudo chown -R $(whoami):$(whoami) . + + - name: Install dependencies + if: "matrix.php == '8.4'" + run: composer install --prefer-dist --no-interaction --no-progress --ansi + + - name: Update dependencies + if: "matrix.php != '8.4'" + run: composer update --no-interaction --no-progress --ansi + + - name: Enable code coverage + if: "matrix.php == '8.4'" + run: echo "COVERAGE=1" >> $GITHUB_ENV + + - name: Run PHPUnit + run: vendor/bin/phpunit ${{ matrix.php == '8.4' && '--coverage-clover build/logs/phpunit/clover.xml' || '' }} + + - name: Run PHP CS Fixer + if: "matrix.php == '8.3'" + run: php-cs-fixer fix --dry-run --format=checkstyle --ansi | cs2pr + + - name: Run PHPStan + if: "matrix.php == '8.4'" + run: vendor/bin/phpstan analyse --ansi + + - name: Run e2e tests + if: "matrix.php == '8.4'" + run: bin/compile + + - name: Upload coverage results to Coveralls + if: "matrix.php == '8.4'" + env: + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + composer global require --prefer-dist --no-interaction --no-progress --ansi php-coveralls/php-coveralls + export PATH="$PATH:$HOME/.composer/vendor/bin" + php-coveralls --coverage_clover=build/logs/phpunit/clover.xml -v + continue-on-error: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..1eb8235e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,40 @@ +on: + push: + tags: + - 'v*' + +name: Create Release and Upload Release Asset + +jobs: + build: + name: Create Release and Upload Release Asset + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + extensions: json + ini-values: memory_limit=-1 + tools: composer + + - name: Install dependencies + run: composer install --prefer-dist --no-interaction --no-progress --ansi + + - name: Download box.phar + run: wget -O box.phar https://github.com/humbug/box/releases/download/4.6.2/box.phar + + - name: Compile project + run: php ./box.phar compile + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + name: Release ${{ github.ref_name }} + body: '' + draft: false + prerelease: false + files: schema.phar diff --git a/.gitignore b/.gitignore index 452993de..fbfa32af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ -composer.phar -vendor -build/ -.couscous +/box.json +/build/ +/vendor/ +/*.phar +/.phpunit.result.cache +/.php-cs-fixer.cache +/tmp diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 00000000..06c22e6f --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +$header = <<<'HEADER' +This file is part of the API Platform project. + +(c) Kévin Dunglas + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +HEADER; + +$finder = PhpCsFixer\Finder::create() + ->in(__DIR__) + ->exclude('tests/Fixtures/app/cache') + ->exclude('build') + ->exclude('tmp') + ->exclude('tests/e2e'); + +$config = new PhpCsFixer\Config(); + +return $config + ->setRiskyAllowed(true) + ->setRules([ + '@Symfony' => true, + '@Symfony:risky' => true, + 'array_syntax' => [ + 'syntax' => 'short', + ], + 'braces' => [ + 'allow_single_line_closure' => true, + ], + 'declare_strict_types' => true, + 'header_comment' => [ + 'header' => $header, + 'location' => 'after_open', + ], + 'modernize_types_casting' => true, + // 'native_function_invocation' => true, + 'no_extra_blank_lines' => [ + 'tokens' => [ + 'break', + 'continue', + 'curly_brace_block', + 'extra', + 'parenthesis_brace_block', + 'return', + 'square_brace_block', + 'throw', + 'use', + ], + ], + 'no_unreachable_default_argument_value' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'ordered_imports' => true, + // 'phpdoc_add_missing_param_annotation' => [ + // 'only_untyped' => false, + // ], + 'phpdoc_order' => true, + 'psr_autoloading' => true, + 'semicolon_after_instruction' => true, + 'strict_comparison' => true, + 'strict_param' => true, + 'ternary_to_null_coalescing' => true, + ]) + ->setFinder($finder); diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 73de4556..00000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: php - -sudo: false - -cache: - directories: - - $HOME/.composer/cache - -php: - - 5.5 - - 5.6 - - nightly - - hhvm - - hhvm-nightly - -matrix: - allow_failures: - - php: nightly - - php: hhvm-nightly - fast_finish: true - -before_script: - - composer self-update - - composer install - -script: - - tests/run-tests.sh diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..1122fda1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,210 @@ +# Changelog + +## 5.2.4 + +* feat: compatibility with PHP 8.4 + +## 5.2.3 + +* feat: compatibility with Symfony 7 +* fix: replace of GoodRelations OWL file (#431) + +## 5.2.2 + +* fix: detect enum detection when an ancestor is an enum + +## 5.2.1 + +* fix: allow declaring multiple operations using the same class + +## 5.2.0 + +* feat: improve type detection + +## 5.1.1 + +* fix: missing unique for self-referencing relations + +## 5.1.0 + +* feat: repeatable attributes support + +## 5.0.0 + +* feat: add OpenAPI support +* feat: add API Platform 2.7/3 attributes generation +* feat: custom attributes and custom attribute arguments +* feat: add Doctrine ORM inheritance support (discriminator) +* feat: manage association overrides for Doctrine ORM +* feat: add `defaultCardinality` configuration for relations +* feat: add `defaultValue` in property configuration +* feat: add `resolveTypes` and `allTypes` parameters +* refactor: better handling of data type (including lang string) +* fix: self-referencing relations (Doctrine ORM) +* fix: update reserved keywords +* fix: remove simple in ODM attributes + +## 4.0.1 + +* fix: use FQCN when using an enum in callback constraint and remove ApiResource from the enum +* fix: make sure relations are generated +* fix: inheritance from Intangible should not create warning + +## 4.0.0 + +* feat: support updating existing files +* feat: generate PHP 8 attributes +* feat: generate API Platform Core `security` properties for classes and properties +* feat: support for HTTPS URLs of Schema.org +* feat: add YAML support for Doctrine ORM "resolve entity" +* feat: support for interface namespaces +* feat: compatibility with Symfony 6 +* feat: compatibility with PHP 8.1 +* feat: now uses Nette generator +* fix: the whole code base has been refactored, a log of bugs have been fixed + +## 3.0.0 + +* Support for [the Web Ontology Language (OWL)](https://en.wikipedia.org/wiki/Web_Ontology_Language) (including for [the ActivityStream vocabulary](https://www.w3.org/TR/activitystreams-core/)) +* Support for [XML Schema](https://en.wikipedia.org/wiki/XML_Schema_(W3C)) types +* Compatibility with the latest version of Schema.org +* Improved PHP type hints generation (including support for typed properties) +* Improved PHPDoc support +* Upgrade to EasyRDF 1 and Doctrine Inflector 2 +* More flexible configuration +* The `generate-types` command has been renamed `generate` + +## 2.2.2 + +* Update to Symfony 5 +* Fix an issue preventing to install the tool when using Symfony Flex +* Fix a singularization issue with some words such as `sameAs` + +## 2.2.1 + +* Allow `symfony/config` 5.0 + +## 2.2.0 + +* Symfony 5 compatibility +* Add support for custom Twig templates +* Add support for operations in API Platform annotations +* Add support for custom `columnPrefix` +* Use superseding props over which they superseded +* Fix implicit and explicit property inheritance +* Use nullable property for custom fields +* Add `inversedBy` and `mappedBy` Doctrine attributes +* Fix annotation generation + +## 2.1.0 + +* Allow to use a PSR-4 namespace's prefix +* Autodetect Flex-like directory structure +* Improve the message when using 1st type in range + +## 2.0.2 + +* Use PHPScoper build the PHAR (to prevent conflicts with libraries installed in the project) +* Add E2E tests + +## 2.0.1 + +* The generator now relies on embedded schema file to prevent issues with online XML files and allow offline usage +* An issue regarding the Inflector namespace has been fixed + +## 2.0.0 + +* Generated classes include scalar typehints and return type +* New options to generate autoincremented IDs, UUIDs, custom IDs or to not generate IDs at all (DTO) +* Nullable typehints are generated instead of a default `null` value +* Add new `readable` and `writable` options to fields to skip getter or mutator generation. +* A fluent interface isn't generated anymore by default unless you set the `fluentMutatorMethods` config flag to `true` +* Useless PHPDoc (`@param` and `@return` annotations when a typehint exist and mutator description) isn't generated anymore +* `DateTimeInterface` is used instead of `DateTime` when possible +* Add the ability to not generate accessor methods (useful when generating public properties) +* The annotation generator for API Platform v1 has been dropped. Only API Platform v2 is now supported +* Parent class is not generated by default anymore (using inheritance for entity is discouraged) +* `SerializerGroupsAnnotationGenerator` is enabled by default +* The property name is pluralized for `to-many` relations and singularized for `to-one` relations +* Adder and remover methods are always singularized to be compatible with the Symfony Property Accessor +* If a config file called `schema.yaml` is found in the current directory and no 2nd argument is passed to `generate-types`, this file will be used +* The code has been modernized to use PHP 7 and 7.1's new features (typehints, strict types), PHP 7.1 is now a requirement +* PHP CS Fixer has ben upgraded to its version 2 +* The `extract-cardinalities` gains two new options: one to configure the Schema.org's file to use, the other for the GoodRelations one + +## 1.2.0 + +* The default config now match the Symfony's and API Platform's Best Practices (namespaces) +* The API Platform's annotation generator is enabled by default +* Use HTTPS to retrieve vocabularies by default +* Properties are generated in the order of the config file +* Properties and constants are separated by an empty line + +## 1.1.2 + +* Fix a bug when generating enumerations + +## 1.1.1 + +* Use the new PHP CS Fixer package + +## 1.1.0 + +* MongoDB support +* API Platform Core v2 support +* Schema Generator is now available as PHAR +* Support any RDF vocabulary (was previously limited to Schema.org) +* Support for custom classes +* Support for [Doctrine Embeddables](http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/tutorials/embeddables.html) +* Support for serialization groups +* Support for the `nullable` option +* Support for the `unique` option +* Support for custom Doctine `@Column` annotations +* Symfony 3.0 compatibility +* Various bug fixes and improved tests + +## 1.0.0 + +* Rename the package API Platform Schema Generator (formerly PHP Schema) +* Support for external and custom RDFa schemas +* Support custom name for relation tables +* Allow to use properties from parent classes +* Allow to create custom fields +* Improve code quality and tests + +## 0.4.3 + +* Fix compatibility with [API Platform Core](https://github.com/api-platform/core) v1 (formerly DunglasJsonLdApiBundle) + +## 0.4.2 + +* Fix compatibility with [API Platform Core](https://github.com/api-platform/core) v1 (formerly DunglasJsonLdApiBundle) + +## 0.4.1 + +* Make CS fixer working again + +## 0.4.0 + +* [API Platform Core](https://github.com/api-platform/core) v1 (formerly DunglasJsonLdApiBundle) support + +## 0.3.2 + +* Fixed Doctrine relations handling +* Better `null` value handling + +## 0.3.1 + +* Fix a bug when using Doctrine `ArrayCollection` +* Don't call `parent::__construct()`` when the parent constructor doesn't exist + +## 0.3.0 + +* Symfony / Doctrine's ResolveTragetEntityListener config mapping generation +* Refactored Doctrine config +* Removed deprecated call to `YAML::parse()`` + +## 0.2.0 + +* Better generated PHPDoc +* Removed `@type` support diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 781d144a..3505778e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,17 +1,103 @@ -# Contributing +# Contributing to API Platform -## License +First of all, thank you for contributing, you're awesome! -Before you start, you must know that all the patches you are going to submit must be released under the MIT license. +To have your code integrated in the API Platform project, there is some rules to follow, but don't panic, it's easy! -## Run tests +## Reporting bugs -Run the following command: `tests/run-tests.sh` +If you happen to find a bug, we kindly request you to report it. However, before submitting it, please: -## Make a Pull Request + * Check the [project documentation available online](https://api-platform.com/docs/) -All Pull Requests must be open on [the GitHub project page](https://github.com/dunglas/php-schema.org-model). +Then, if it appears that it's a real bug, you may report it using GitHub by following these 3 points: -## Going further + * Check if the bug is not already reported! + * A clear title to resume the issue + * A description of the workflow needed to reproduce the bug + +> _NOTE:_ Don’t hesitate giving as much information as you can (OS, PHP version extensions...) + +## Pull requests + +### Writing a Pull Request + +First of all, you must decide on what branch your changes will be based. If the changes your are going to make are +fully backward-compatible, you should base your changes on the latest stable branch (`1.0` at the moment). +Otherwise, you should base your changes on the `master` branch. + +### Matching coding standards + +The API Platform project follows [Symfony coding standards](https://symfony.com/doc/current/contributing/code/standards.html). +But don't worry, you can fix CS issues automatically using the [PHP CS Fixer](http://cs.sensiolabs.org/) tool + +```bash +php-cs-fixer.phar fix +``` + +And then, add fixed file to your commit before push. +Be sure to add only **your modified files**. If another files are fixed by cs tools, just revert it before commit. + +### Sending a Pull Request + +When you send a PR, just make sure that: + +* You add valid test cases (Behat and PHPUnit). +* Tests are green. +* You make a PR on the related documentation in the [api-platform/doc](https://github.com/api-platform/doc) repository. +* You make the PR on the same branch you based your changes on. If you see commits +that you did not make in your PR, you're doing it wrong. +* Squash your commits into one commit. (see the next chapter) + +All Pull Requests must include the following header: + +```markdown +| Q | A +| ------------- | --- +| Bug fix? | yes/no +| New feature? | yes/no +| BC breaks? | no +| Deprecations? | no +| Tests pass? | yes +| Fixed tickets | #1234, #5678 +| License | MIT +| Doc PR | api-platform/doc#1234 +``` + +## Squash your commits + +If you have 3 commits. So start with: + +```bash +git rebase -i HEAD~3 +``` + +An editor will be opened with your 3 commits, all prefixed by `pick`. + +Replace all `pick` prefixes by `fixup` (or `f`) **except the first commit** of the list. + +Save and quit the editor. + +After that, all your commits where squashed into the first one and the commit message of the first commit. + +If you would like to rename your commit message type: + +```bash +git commit --amend +``` + +Now force push to update your PR: + +```bash +git push --force +``` + +# License and copyright attribution + +When you open a Pull Request to the API Platform project, you agree to license your code under the [MIT license](LICENSE) +and to transfer the copyright on the submitted code to Kévin Dunglas. + +Be sure to you have the right to do that (if you are a professional, ask your company)! + +If you include code from another project, please mention it in the Pull Request description and credit the original author. -Read [the Symfony documentation about contributing code](http://symfony.com/doc/current/contributing/code/patches.html). diff --git a/README.md b/README.md index dae3e3d3..0f3b266c 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,18 @@ -# PHP Schema.org Model Scaffolding +# API Platform Schema Generator -The [PHP Schema](http://php-schema.dunglas.com/) command line tool instantly generates a PHP data model from the [Schema.org](http://schema.org) -vocabulary. Browse Schema.org, choose the types and properties you need, run our code generator and you're done! You get -a fully featured PHP data model including: -* A set of PHP entities with properties, constants (enum values), getters, setters, adders and removers. The class -hierarchy provided by Schema.org will be translated to a PHP class hierarchy with parents as `abstract` classes. The generated -code complies with [PSR](http://www.php-fig.org/) coding standards. -* Full high-quality PHPDoc for classes, properties, constants and methods extracted from Schema.org. -* Doctrine ORM annotation mapping including database columns with type guessing, relations with cardinality guessing, class -inheritance (through the `@AbstractSuperclass` annotation). -* Data validation through [Symfony Validator](http://symfony.com/doc/current/book/validation.html) annotations including -data type validation, enum support (choices) and check for required properties. -* Interfaces and [Doctrine `ResolveTargetEntityListener`](http://doctrine-orm.readthedocs.org/en/latest/cookbook/resolve-target-entity-listener.html) -support. -* Custom PHP namespace support. -* List of values provided by Schema.org with [PHP Enum](https://github.com/myclabs/php-enum) classes. +`schema` is a command line tool part of [the API Platform framework](https://api-platform.com) that instantly generates a set +of PHP classes from vocabularies such as (but not limited to) [Schema.org](https://schema.org) +or [ActivityStreams](https://www.w3.org/TR/activitystreams-core/) or from an [OpenAPI](https://www.openapis.org/) documentation. -Bonus: -* The code generator is fully configurable and extensible: all features can be deactivated (e.g.: the Doctrine mapping generator) -and custom generator can be added (e.g.: a Doctrine ODM mapping generator). -* The generated code can be used as is in a [Symfony](http://symfony.com) app (but it will work too in a raw PHP project -or any other framework including [Laravel](http://laravel.com) and [Zend Framework](http://framework.zend.com/)). - -[![Build Status](https://travis-ci.org/dunglas/php-schema.svg?branch=master)](https://travis-ci.org/dunglas/php-schema) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/87ec89e6-57cd-4ac0-9ab1-d4549c5425c5/mini.png)](https://insight.sensiolabs.com/projects/87ec89e6-57cd-4ac0-9ab1-d4549c5425c5) - -## What is Schema.org? - -Schema.org is a vocabulary representing common data structures and their relations. Schema.org can be exposed as [JSON-LD](http://en.wikipedia.org/wiki/JSON-LD), -[microdata](http://en.wikipedia.org/wiki/Microdata_(HTML)) and [RDFa](http://en.wikipedia.org/wiki/RDFa). -Extracting semantical data exposed in the Schema.org vocabulary is supported by a growing number of companies including -Google (Search, Gmail), Yahoo!, Bing and Yandex. - -## Why use Schema.org data to generate a PHP model? - -### Don't Reinvent The Wheel - -Data models provided by Schema.org are popular and have been proved efficient. They cover a broad spectrum of topics including -creative work, e-commerce, event, medicine, social networking, people, postal address, organization, place or review. -Schema.org has its root in [a ton of preexisting well designed vocabularies](http://schema.rdfs.org/mappings.html) and is -successfully used by more and more website and applications. - -Pick up schemas applicable to your application, generate your PHP model, then customize and specialize it to fit your needs. - -### Improve SEO and user experience - -Adding Schema.org markup to websites and apps increase their ranking in search engines results and enable awesome features -such as [Google Rich Snippets](https://support.google.com/webmasters/answer/99170?hl=en) and [Gmail markup](https://developers.google.com/gmail/markup/overview). - -Mapping your app data model to Schema.org structures can be a tedious task. Using the generator, your data model will be -a derived from Schema.org. Adding microdata markup to your templates or serializing your data as JSON-LD will not require -specific mapping nor adaptation. It's a matter of minutes. - -### Be ready for the future - -Schema.org improves the interoperability of your applications. Used with hypermedia technologies such as [Hydra](http://www.hydra-cg.com/) -it's a big step towards the semantic and machine readable web. -It opens the way to generic web API clients able to extract and process data from any website or app using such technologies. +[![GitHub Actions](https://github.com/api-platform/schema-generator/workflows/CI/badge.svg?branch=main)](https://github.com/api-platform/schema-generator/actions?query=workflow%3ACI+branch%3Amain) +[![Coverage Status](https://coveralls.io/repos/github/api-platform/schema-generator/badge.svg?branch=main)](https://coveralls.io/github/api-platform/schema-generator?branch=main) ## Documentation -* [Getting Started](doc/getting-started.md) -* [Configuration](doc/configuration.md) +* [Introduction](https://api-platform.com/docs/schema-generator/) +* [Getting Started](https://api-platform.com/docs/schema-generator/getting-started) +* [Configuration](https://api-platform.com/docs/schema-generator/configuration) ## Credits -This project has been created by [Kévin Dunglas](http://dunglas.fr) and is sponsored by [Les-Tilleuls.coop](http://les-tilleuls.coop). +This project was created by [Kévin Dunglas](https://dunglas.fr) and is sponsored by [Les-Tilleuls.coop](https://les-tilleuls.coop). diff --git a/bin/compile b/bin/compile new file mode 100755 index 00000000..4c71351f --- /dev/null +++ b/bin/compile @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -eox pipefail + +php "$BOX_BIN" compile; + +rm -rf tmp/original + +php schema.phar generate tmp/original tests/e2e/schema.yml -n -vv --ansi; + +diff tests/e2e/original/App/Schema/Entity/Brand.php tmp/original/App/Schema/Entity/Brand.php; +diff tests/e2e/original/App/Schema/Entity/ContactPoint.php tmp/original/App/Schema/Entity/ContactPoint.php; +diff tests/e2e/original/App/Schema/Entity/Person.php tmp/original/App/Schema/Entity/Person.php; +diff tests/e2e/original/App/Schema/Entity/PostalAddress.php tmp/original/App/Schema/Entity/PostalAddress.php; +diff tests/e2e/original/App/Schema/Entity/Thing.php tmp/original/App/Schema/Entity/Thing.php; +diff tests/e2e/original/App/Schema/Enum/GenderType.php tmp/original/App/Schema/Enum/GenderType.php; + +# Already generated files + +cp -r tests/e2e/customized tmp/ + +php schema.phar generate tmp/customized tests/e2e/schema.yml -n -vv --ansi; + +diff tests/e2e/customized/App/Schema/Entity/Brand.php tmp/customized/App/Schema/Entity/Brand.php; +diff tests/e2e/customized/App/Schema/Entity/ContactPoint.php tmp/customized/App/Schema/Entity/ContactPoint.php; +diff tests/e2e/customized/App/Schema/Entity/Person.php tmp/customized/App/Schema/Entity/Person.php; +diff tests/e2e/customized/App/Schema/Entity/PostalAddress.php tmp/customized/App/Schema/Entity/PostalAddress.php; +diff tests/e2e/customized/App/Schema/Entity/Thing.php tmp/customized/App/Schema/Entity/Thing.php; +diff tests/e2e/customized/App/Schema/Enum/GenderType.php tmp/customized/App/Schema/Enum/GenderType.php; + +php schema.phar generate tmp/original tests/e2e/schema_openapi.yml -n -vv --ansi; + +diff tests/e2e/original/App/OpenApi/Entity/Book.php tmp/original/App/OpenApi/Entity/Book.php; +diff tests/e2e/original/App/OpenApi/Entity/Parchment.php tmp/original/App/OpenApi/Entity/Parchment.php; +diff tests/e2e/original/App/OpenApi/Entity/Review.php tmp/original/App/OpenApi/Entity/Review.php; +diff tests/e2e/original/App/OpenApi/Entity/TopBook.php tmp/original/App/OpenApi/Entity/TopBook.php; + +php schema.phar generate tmp/original tests/e2e/schema_openapi_ref.yml -n -vv --ansi; + +diff tests/e2e/original/App/OpenApi/Entity/Order.php tmp/original/App/OpenApi/Entity/Order.php; +diff tests/e2e/original/App/OpenApi/Entity/Pet.php tmp/original/App/OpenApi/Entity/Pet.php; +diff tests/e2e/original/App/OpenApi/Entity/User.php tmp/original/App/OpenApi/Entity/User.php; + +php schema.phar generate tmp/original tests/e2e/schema_open_education_api.yml -n -vv --ansi; + +diff tests/e2e/original/App/OpenApi/Entity/AcademicSession.php tmp/original/App/OpenApi/Entity/AcademicSession.php; +diff tests/e2e/original/App/OpenApi/Entity/Association.php tmp/original/App/OpenApi/Entity/Association.php; diff --git a/bin/schema b/bin/schema index dd5172df..0a820ba6 100755 --- a/bin/schema +++ b/bin/schema @@ -16,12 +16,12 @@ if (file_exists(__DIR__ . '/../../../autoload.php')) { } use Symfony\Component\Console\Application; -use SchemaOrgModel\Command\ExtractCardinalitiesCommand; -use SchemaOrgModel\Command\DumpConfigurationCommand; -use SchemaOrgModel\Command\GenerateTypesCommand; +use ApiPlatform\SchemaGenerator\Command\ExtractCardinalitiesCommand; +use ApiPlatform\SchemaGenerator\Command\DumpConfigurationCommand; +use ApiPlatform\SchemaGenerator\Command\GenerateCommand; $application = new Application(); $application->add(new ExtractCardinalitiesCommand()); $application->add(new DumpConfigurationCommand()); -$application->add(new GenerateTypesCommand()); +$application->add(new GenerateCommand()); $application->run(); diff --git a/box.json.dist b/box.json.dist new file mode 100644 index 00000000..3a14f713 --- /dev/null +++ b/box.json.dist @@ -0,0 +1,31 @@ +{ + "banner": [ + "This file is part of the API Platform project.", + "", + "(c) Kévin Dunglas ", + "", + "For the full copyright and license information, please view the LICENSE", + "file that was distributed with this source code." + ], + + "directories-bin": [ + "templates/" + ], + "files": [ + "vendor/twig/twig/src/TwigTest.php" + ], + "directories": [ + "vendor/devizzent/cebe-php-openapi/src/spec" + ], + "force-autodiscovery": true, + + "compression": "GZ", + "compactors": [ + "KevinGH\\Box\\Compactor\\Json", + "KevinGH\\Box\\Compactor\\Php" + ], + + "git-version": "package_version", + + "output": "schema.phar" +} diff --git a/composer.json b/composer.json index c6d1fa8b..9e3d285c 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,19 @@ { - "name": "dunglas/php-schema", + "name": "api-platform/schema-generator", "type": "library", "description": "Various tools to generate a data model based on Schema.org vocables", - "keywords": ["schema.org", "semantic", "model", "doctrine", "symfony", "entity", "enum"], - "homepage": "http://dunglas.fr/", + "keywords": [ + "rdf", + "owl", + "schema.org", + "semantic", + "model", + "doctrine", + "symfony", + "entity", + "enum" + ], + "homepage": "https://api-platform.com/docs/schema-generator/", "license": "MIT", "authors": [ { @@ -12,33 +22,51 @@ } ], "autoload": { - "psr-0": { - "SchemaOrgModel": "src/" + "psr-4": { + "ApiPlatform\\SchemaGenerator\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "ApiPlatform\\SchemaGenerator\\Tests\\": "tests/" } }, "require": { - "php": ">=5.4", + "php": ">=7.4", "ext-json": "*", - "symfony/console": "~2.5", - "symfony/yaml": "~2.4", - "symfony/config": "~2.4", - "twig/twig": "~1.0", - "psr/log": "~1.0", - "easyrdf/easyrdf": "~0.9.0", - "nickcernis/html-to-markdown": "~2.1", - "fabpot/php-cs-fixer": "~1.0" + "doctrine/inflector": "^1.4.3 || ^2.0", + "sweetrdf/easyrdf": "^1.6", + "friendsofphp/php-cs-fixer": "^2.15 || ^3.0", + "league/html-to-markdown": "^5.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/config": "^5.4 || ^6.4 || ^7.0" , + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "twig/twig": "^3.0", + "nette/php-generator": "^3.6 || ^4.0", + "nikic/php-parser": "^4.13 || ^5.0", + "devizzent/cebe-php-openapi": "^1.0.3", + "symfony/string": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "doctrine/orm": "~2.2", - "symfony/validator": "~2.6", - "symfony/serializer": "~2.7@dev", - "dunglas/json-ld-api-bundle": "dev-master" + "api-platform/core": "^3.0 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "myclabs/php-enum": "^1.7", + "symfony/doctrine-bridge": "^5.4 || ^6.4 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.4 || ^7.0", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0", + "symfony/validator": "^5.4 || ^6.4 || ^7.0", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^2.1", + "symfony/finder": "^5.4 || ^6.4 || ^7.0" }, - "suggest": { - "myclabs/php-enum": "For enumerations", - "doctrine/collections": "For Doctrine collections", - "doctrine/orm": "For Doctrine annotations", - "symfony/validator": "For constraint annotations" - }, - "bin": ["bin/schema"] + "bin": [ + "bin/schema" + ], + "config": { + "allow-plugins": { + "composer/package-versions-deprecated": true + } + } } diff --git a/composer.lock b/composer.lock index 66cdb188..42a0fb5b 100644 --- a/composer.lock +++ b/composer.lock @@ -1,107 +1,114 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "hash": "370daf89e5091cc3d21a846596f7dd85", + "content-hash": "472049b60481f3b6d841700bcd23b751", "packages": [ { - "name": "easyrdf/easyrdf", - "version": "0.9.1", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/njh/easyrdf.git", - "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/njh/easyrdf/zipball/acd09dfe0555fbcfa254291e433c45fdd4652566", - "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", "shasum": "" }, "require": { - "ext-mbstring": "*", - "ext-pcre": "*", - "php": ">=5.2.8" + "php": ">=5.3", + "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "~3.5", - "sami/sami": "~1.4", - "squizlabs/php_codesniffer": "~1.4.3" - }, - "suggest": { - "ml/json-ld": "~1.0" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" }, "type": "library", "autoload": { - "psr-0": { - "EasyRdf_": "lib/" + "psr-4": { + "Clue\\React\\NDJson\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nicholas Humfrey", - "email": "njh@aelius.com", - "homepage": "http://www.aelius.com/njh/", - "role": "Developer" - }, - { - "name": "Alexey Zakhlestin", - "email": "indeyets@gmail.com", - "role": "Developer" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.", - "homepage": "http://www.easyrdf.org/", + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", "keywords": [ - "Linked Data", - "RDF", - "Semantic Web", - "Turtle", - "rdfa", - "sparql" + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } ], - "time": "2015-02-27 09:45:49" + "time": "2022-12-23T10:58:28+00:00" }, { - "name": "fabpot/php-cs-fixer", - "version": "v1.6", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "81a46f8a0f92f1ba64587b384a275d0766cf2c70" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/81a46f8a0f92f1ba64587b384a275d0766cf2c70", - "reference": "81a46f8a0f92f1ba64587b384a275d0766cf2c70", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "php": ">=5.3.6", - "sebastian/diff": "~1.1", - "symfony/console": "~2.1", - "symfony/event-dispatcher": "~2.1", - "symfony/filesystem": "~2.1", - "symfony/finder": "~2.1", - "symfony/process": "~2.3", - "symfony/stopwatch": "~2.5" + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "satooshi/php-coveralls": "0.7.*@dev" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", "autoload": { "psr-4": { - "Symfony\\CS\\": "Symfony/CS/" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -110,43 +117,69 @@ ], "authors": [ { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be/" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "description": "A script to automatically fix Symfony Coding Standard", - "time": "2015-03-26 21:09:59" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "nickcernis/html-to-markdown", - "version": "2.2.1", + "name": "composer/semver", + "version": "3.4.3", "source": { "type": "git", - "url": "https://github.com/nickcernis/html-to-markdown.git", - "reference": "7263d2ce65011b050fa7ecda0cbe09b23e84271d" + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nickcernis/html-to-markdown/zipball/7263d2ce65011b050fa7ecda0cbe09b23e84271d", - "reference": "7263d2ce65011b050fa7ecda0cbe09b23e84271d", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { - "php": ">=5.3" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "php": ">=5.3.3", - "phpunit/phpunit": "4.*" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { - "classmap": [ - "HTML_To_Markdown.php" - ] + "psr-4": { + "Composer\\Semver\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -154,37 +187,77 @@ ], "authors": [ { - "name": "Nick Cernis", - "email": "nick@cern.is", - "homepage": "http://modernnerd.net/" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de/" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be/" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl/" } ], - "description": "An HTML-to-markdown conversion helper for PHP", - "homepage": "https://github.com/nickcernis/html-to-markdown", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "html", - "markdown" + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2015-02-22 12:59:02" + "time": "2024-09-19T14:15:21+00:00" }, { - "name": "psr/log", - "version": "1.0.0", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, "type": "library", "autoload": { - "psr-0": { - "Psr\\Log\\": "" + "psr-4": { + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -193,101 +266,141 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "Common interface for logging libraries", + "description": "Restarts a process without Xdebug.", "keywords": [ - "log", - "psr", - "psr-3" + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2012-12-21 11:40:51" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "sebastian/diff", - "version": "1.3.0", + "name": "devizzent/cebe-php-openapi", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + "url": "https://github.com/DEVizzent/cebe-php-openapi.git", + "reference": "af42b77f339b6b2920b65bae5df748e47391e11d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "url": "https://api.github.com/repos/DEVizzent/cebe-php-openapi/zipball/af42b77f339b6b2920b65bae5df748e47391e11d", + "reference": "af42b77f339b6b2920b65bae5df748e47391e11d", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-json": "*", + "justinrainbow/json-schema": "^5.2 || ^6.0", + "php": ">=7.1.0", + "symfony/yaml": "^3.4 || ^4 || ^5 || ^6 || ^7" + }, + "conflict": { + "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" + }, + "replace": { + "cebe/php-openapi": "1.7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "apis-guru/openapi-directory": "1.0.0", + "cebe/indent": "*", + "mermade/openapi3-examples": "1.0.0", + "oai/openapi-specification-3.0": "3.0.3", + "oai/openapi-specification-3.1": "3.1.0", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4 || ^11.4" }, + "bin": [ + "bin/php-openapi" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "cebe\\openapi\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "https://cebe.cc/", + "role": "Creator" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Vicent Valls", + "email": "vizzent@gmail.com" } ], - "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", + "description": "Read and write OpenAPI yaml/json files and make the content accessable in PHP objects.", + "homepage": "https://github.com/DEVizzent/cebe-php-openapi#readme", "keywords": [ - "diff" + "openapi" ], - "time": "2015-02-22 15:13:53" + "support": { + "issues": "https://github.com/DEVizzent/cebe-php-openapi/issues", + "source": "https://github.com/DEVizzent/cebe-php-openapi" + }, + "time": "2025-01-16T11:12:34+00:00" }, { - "name": "symfony/config", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Config", + "name": "doctrine/inflector", + "version": "2.0.10", "source": { "type": "git", - "url": "https://github.com/symfony/Config.git", - "reference": "d91be01336605db8da21b79bc771e46a7276d1bc" + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/d91be01336605db8da21b79bc771e46a7276d1bc", - "reference": "d91be01336605db8da21b79bc771e46a7276d1bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/filesystem": "~2.3" + "php": "^7.2 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Config\\": "" + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -296,56 +409,84 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" } ], - "description": "Symfony Config Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "time": "2024-02-18T20:23:39+00:00" }, { - "name": "symfony/console", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Console", + "name": "evenement/evenement", + "version": "v3.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "5b91dc4ed5eb08553f57f6df04c4730a73992667" + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/5b91dc4ed5eb08553f57f6df04c4730a73992667", - "reference": "5b91dc4ed5eb08553f57f6df04c4730a73992667", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.1" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" + "phpunit/phpunit": "^9 || ^6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Console\\": "" + "psr-4": { + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -354,57 +495,53 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" } ], - "description": "Symfony Console Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v2.6.6", - "target-dir": "Symfony/Component/EventDispatcher", + "name": "fidry/cpu-core-counter", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/70f7c8478739ad21e3deef0d977b38c77f1fb284", - "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.2 || ^8.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -413,98 +550,159 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/theofidry", + "type": "github" } ], - "description": "Symfony EventDispatcher Component", - "homepage": "http://symfony.com/", - "time": "2015-03-13 17:37:22" + "time": "2024-08-06T10:04:20+00:00" }, { - "name": "symfony/filesystem", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Filesystem", + "name": "friendsofphp/php-cs-fixer", + "version": "v3.68.3", "source": { "type": "git", - "url": "https://github.com/symfony/Filesystem.git", - "reference": "4983964b3693e4f13449cb3800c64a9112c301b4" + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "85fd31cced824749a732e697acdd1a3d657312f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/4983964b3693e4f13449cb3800c64a9112c301b4", - "reference": "4983964b3693e4f13449cb3800c64a9112c301b4", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/85fd31cced824749a732e697acdd1a3d657312f0", + "reference": "85fd31cced824749a732e697acdd1a3d657312f0", "shasum": "" }, "require": { - "php": ">=5.3.3" + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2", + "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", "autoload": { - "psr-0": { - "Symfony\\Component\\Filesystem\\": "" - } + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.3" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" } ], - "description": "Symfony Filesystem Component", - "homepage": "http://symfony.com/", - "time": "2015-03-22 16:55:57" + "time": "2025-01-27T16:37:32+00:00" }, { - "name": "symfony/finder", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Finder", + "name": "icecave/parity", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "5dbe2e73a580618f5b4880fda93406eed25de251" + "url": "https://github.com/icecave/parity.git", + "reference": "0109fef58b3230d23b20b2ac52ecdf477218d300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/5dbe2e73a580618f5b4880fda93406eed25de251", - "reference": "5dbe2e73a580618f5b4880fda93406eed25de251", + "url": "https://api.github.com/repos/icecave/parity/zipball/0109fef58b3230d23b20b2ac52ecdf477218d300", + "reference": "0109fef58b3230d23b20b2ac52ecdf477218d300", "shasum": "" }, "require": { - "php": ">=5.3.3" + "icecave/repr": "~1", + "php": ">=5.3" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "eloquent/liberator": "~1", + "icecave/archer": "~1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } + "suggest": { + "eloquent/asplode": "Drop-in exception-based error handling." }, + "type": "library", "autoload": { "psr-0": { - "Symfony\\Component\\Finder\\": "" + "Icecave\\Parity": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -513,48 +711,56 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" } ], - "description": "Symfony Finder Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" - }, - { - "name": "symfony/process", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Process", + "description": "A customizable deep comparison library.", + "homepage": "https://github.com/IcecaveStudios/parity", + "keywords": [ + "compare", + "comparison", + "equal", + "equality", + "greater", + "less", + "sort", + "sorting" + ], + "support": { + "issues": "https://github.com/icecave/parity/issues", + "source": "https://github.com/icecave/parity/tree/1.0.0" + }, + "time": "2014-01-17T05:56:27+00:00" + }, + { + "name": "icecave/repr", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "a8bebaec1a9dc6cde53e0250e32917579b0be552" + "url": "https://github.com/icecave/repr.git", + "reference": "8a3d2953adf5f464a06e3e2587aeacc97e2bed07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/a8bebaec1a9dc6cde53e0250e32917579b0be552", - "reference": "a8bebaec1a9dc6cde53e0250e32917579b0be552", + "url": "https://api.github.com/repos/icecave/repr/zipball/8a3d2953adf5f464a06e3e2587aeacc97e2bed07", + "reference": "8a3d2953adf5f464a06e3e2587aeacc97e2bed07", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "icecave/archer": "~1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } + "suggest": { + "eloquent/asplode": "Drop-in exception-based error handling." }, + "type": "library", "autoload": { - "psr-0": { - "Symfony\\Component\\Process\\": "" + "psr-4": { + "Icecave\\Repr\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -563,48 +769,62 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" } ], - "description": "Symfony Process Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "description": "A library for generating string representations of any value, inspired by Python's reprlib library.", + "homepage": "https://github.com/IcecaveStudios/repr", + "keywords": [ + "human", + "readable", + "repr", + "representation", + "string" + ], + "support": { + "issues": "https://github.com/icecave/repr/issues", + "source": "https://github.com/icecave/repr/tree/1.0.1" + }, + "time": "2014-07-25T05:44:41+00:00" }, { - "name": "symfony/stopwatch", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Stopwatch", + "name": "justinrainbow/json-schema", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/Stopwatch.git", - "reference": "5f196e84b5640424a166d2ce9cca161ce1e9d912" + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/5f196e84b5640424a166d2ce9cca161ce1e9d912", - "reference": "5f196e84b5640424a166d2ce9cca161ce1e9d912", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/a38c6198d53b09c0702f440585a4f4a5d9137bd9", + "reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9", "shasum": "" }, "require": { + "icecave/parity": "1.0.0", + "marc-mabe/php-enum": "^2.0 || ^3.0 || ^4.0", "php": ">=5.3.3" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "friendsofphp/php-cs-fixer": "~2.2.20 || ~2.19.0", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" }, + "bin": [ + "bin/validate-json" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "6.x-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\Stopwatch\\": "" + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", @@ -613,48 +833,73 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" } ], - "description": "Symfony Stopwatch Component", - "homepage": "http://symfony.com/", - "time": "2015-03-22 16:55:57" + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.0.0" + }, + "time": "2024-07-30T17:49:21+00:00" }, { - "name": "symfony/yaml", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Yaml", + "name": "league/html-to-markdown", + "version": "5.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "174f009ed36379a801109955fc5a71a49fe62dd4" + "url": "https://github.com/thephpleague/html-to-markdown.git", + "reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/174f009ed36379a801109955fc5a71a49fe62dd4", - "reference": "174f009ed36379a801109955fc5a71a49fe62dd4", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0b4066eede55c48f38bcee4fb8f0aa85654390fd", + "reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-dom": "*", + "ext-xml": "*", + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "mikehaertl/php-shellcommand": "^1.1.0", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^8.5 || ^9.2", + "scrutinizer/ocular": "^1.6", + "unleashedtech/php-coding-standard": "^2.7 || ^3.0", + "vimeo/psalm": "^4.22 || ^5.0" }, + "bin": [ + "bin/html-to-markdown" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "5.2-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" + "psr-4": { + "League\\HTMLToMarkdown\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -663,45 +908,86 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com/", + "role": "Lead Developer" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nick Cernis", + "email": "nick@cern.is", + "homepage": "http://modernnerd.net/", + "role": "Original Author" + } + ], + "description": "An HTML-to-markdown conversion helper for PHP", + "homepage": "https://github.com/thephpleague/html-to-markdown", + "keywords": [ + "html", + "markdown" + ], + "support": { + "issues": "https://github.com/thephpleague/html-to-markdown/issues", + "source": "https://github.com/thephpleague/html-to-markdown/tree/5.1.1" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/html-to-markdown", + "type": "tidelift" } ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "time": "2023-07-12T21:21:09+00:00" }, { - "name": "twig/twig", - "version": "v1.18.0", + "name": "marc-mabe/php-enum", + "version": "v4.7.1", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf" + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/4cf7464348e7f9893a93f7096a90b73722be99cf", - "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", "shasum": "" }, "require": { - "php": ">=5.2.4" + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" } }, "autoload": { - "psr-0": { - "Twig_": "lib/" - } + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -709,271 +995,273 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org/", - "role": "Lead Developer" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - }, - { - "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", - "role": "Contributors" + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org/", + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", "keywords": [ - "templating" + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" ], - "time": "2015-01-25 17:32:08" - } - ], - "packages-dev": [ + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + }, + "time": "2024-11-28T04:54:44+00:00" + }, { - "name": "doctrine/annotations", - "version": "v1.2.3", + "name": "nette/php-generator", + "version": "v4.1.7", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4" + "url": "https://github.com/nette/php-generator.git", + "reference": "d201c9bc217e0969d1b678d286be49302972fb56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/eeda578cbe24a170331a1cfdf78be723412df7a4", - "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4", + "url": "https://api.github.com/repos/nette/php-generator/zipball/d201c9bc217e0969d1b678d286be49302972fb56", + "reference": "d201c9bc217e0969d1b678d286be49302972fb56", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", - "php": ">=5.3.2" + "nette/utils": "^3.2.9 || ^4.0", + "php": "8.0 - 8.4" }, "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "4.*" + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "nikic/php-parser": "^4.18 || ^5.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "4.1-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "David Grudl", + "homepage": "https://davidgrudl.com/" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org/", + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.4 features.", + "homepage": "https://nette.org/", "keywords": [ - "annotations", - "docblock", - "parser" + "code", + "nette", + "php", + "scaffolding" ], - "time": "2014-12-20 20:49:38" + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.1.7" + }, + "time": "2024-11-29T01:41:18+00:00" }, { - "name": "doctrine/cache", - "version": "v1.4.0", + "name": "nette/utils", + "version": "v4.0.5", "source": { "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8" + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/2346085d2b027b233ae1d5de59b07440b9f288c8", - "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "8.0 - 8.4" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "phpunit/phpunit": ">=3.7", - "predis/predis": "~0.8", - "satooshi/php-coveralls": "~0.6" + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Cache\\": "lib/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "David Grudl", + "homepage": "https://davidgrudl.com/" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org/", + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org/", "keywords": [ - "cache", - "caching" + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" ], - "time": "2015-01-15 20:38:55" + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" }, { - "name": "doctrine/collections", - "version": "v1.2", + "name": "nikic/php-parser", + "version": "v5.4.0", "source": { "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/b99c5c46c87126201899afe88ec490a25eedd6a2", - "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { - "php": ">=5.3.2" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "5.0-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" + "psr-4": { + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com/" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" + "name": "Nikita Popov" } ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org/", + "description": "A PHP parser written in PHP", "keywords": [ - "array", - "collections", - "iterator" + "parser", + "php" ], - "time": "2014-02-03 23:07:43" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" }, { - "name": "doctrine/common", - "version": "v2.5.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/cd8daf2501e10c63dced7b8b9b905844316ae9d3", - "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~3.7" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\": "lib/" + "psr-4": { + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -982,74 +1270,51 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org/", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2015-04-02 19:55:44" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "doctrine/dbal", - "version": "v2.5.1", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "doctrine/common": ">=2.4,<2.6-dev", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "symfony/console": "2.*" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." + "php": ">=7.2.0" }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" + "psr-4": { + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1058,75 +1323,48 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org/", + "description": "Standard interfaces for event handling.", "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" + "events", + "psr", + "psr-14" ], - "time": "2015-01-12 21:52:47" + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "doctrine/doctrine-bundle", - "version": "v1.4.0", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "1986ff3a945b584c6505d07eae92d77e41131078" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/1986ff3a945b584c6505d07eae92d77e41131078", - "reference": "1986ff3a945b584c6505d07eae92d77e41131078", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "doctrine/dbal": "~2.3", - "doctrine/doctrine-cache-bundle": "~1.0", - "jdorn/sql-formatter": "~1.1", - "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2", - "symfony/framework-bundle": "~2.3" + "php": "^7.2 || ^8.0" }, - "require-dev": { - "doctrine/orm": "~2.3", - "phpunit/phpunit": "~4", - "satooshi/php-coveralls": "~0.6.1", - "symfony/validator": "~2.2", - "symfony/yaml": "~2.2", - "twig/twig": "~1.10" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "to use the data collector" - }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1135,76 +1373,51 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org/", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "database", - "dbal", - "orm", - "persistence" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], - "time": "2015-02-28 11:04:45" + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "doctrine/doctrine-cache-bundle", - "version": "v1.0.1", - "target-dir": "Doctrine/Bundle/DoctrineCacheBundle", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/doctrine/DoctrineCacheBundle.git", - "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", - "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "doctrine/cache": "~1.3", - "doctrine/inflector": "~1.0", - "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2", - "symfony/framework-bundle": "~2.2", - "symfony/security": "~2.2" - }, - "require-dev": { - "instaclick/coding-standard": "~1.1", - "instaclick/object-calisthenics-sniffs": "dev-master", - "instaclick/symfony2-coding-standard": "dev-remaster", - "phpunit/phpunit": "~3.7", - "satooshi/php-coveralls": "~0.6.1", - "squizlabs/php_codesniffer": "dev-master", - "symfony/console": "~2.2", - "symfony/finder": "~2.2", - "symfony/validator": "~2.2", - "symfony/yaml": "~2.2" + "php": ">=8.0.0" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Bundle\\DoctrineCacheBundle": "" + "psr-4": { + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1213,67 +1426,47 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Fabio B. Silva", - "email": "fabio.bat.silva@gmail.com" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@hotmail.com" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Symfony2 Bundle for Doctrine Cache", - "homepage": "http://www.doctrine-project.org/", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "cache", - "caching" + "log", + "psr", + "psr-3" ], - "time": "2014-11-28 09:43:36" + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "doctrine/inflector", - "version": "v1.0.1", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604", - "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "React\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1282,69 +1475,74 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org/", + "description": "Async, Promise-based cache interface for ReactPHP", "keywords": [ - "inflection", - "pluralize", - "singularize", - "string" + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2014-12-20 21:24:13" + "time": "2022-11-30T15:59:55+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.0.4", + "name": "react/child-process", + "version": "v0.6.6", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "url": "https://github.com/reactphp/child-process.git", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "React\\ChildProcess\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1353,45 +1551,73 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "description": "Event-driven library for executing child processes with ReactPHP.", "keywords": [ - "constructor", - "instantiate" + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2014-10-13 12:58:55" + "time": "2025-01-01T16:37:48+00:00" }, { - "name": "doctrine/lexer", - "version": "v1.0.1", + "name": "react/dns", + "version": "v1.13.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" }, + "type": "library", "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" + "psr-4": { + "React\\Dns\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1400,71 +1626,72 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org/", + "description": "Async DNS resolver for ReactPHP", "keywords": [ - "lexer", - "parser" + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2014-09-09 13:34:57" + "time": "2024-06-13T14:18:03+00:00" }, { - "name": "doctrine/orm", - "version": "v2.5.0", + "name": "react/event-loop", + "version": "v1.5.0", "source": { "type": "git", - "url": "https://github.com/doctrine/doctrine2.git", - "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe" + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", - "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "shasum": "" }, "require": { - "doctrine/cache": "~1.4", - "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.6-dev", - "doctrine/dbal": ">=2.5-dev,<2.6-dev", - "doctrine/instantiator": "~1.0.1", - "ext-pdo": "*", - "php": ">=5.4", - "symfony/console": "~2.5" + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", - "symfony/yaml": "~2.1" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, - "bin": [ - "bin/doctrine", - "bin/doctrine.php" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev" - } - }, "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" + "psr-4": { + "React\\EventLoop\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1473,78 +1700,71 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org/", + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", "keywords": [ - "database", - "orm" + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2015-04-02 20:40:18" + "time": "2023-11-13T13:48:05+00:00" }, { - "name": "dunglas/json-ld-api-bundle", - "version": "dev-master", + "name": "react/promise", + "version": "v3.2.0", "source": { "type": "git", - "url": "https://github.com/dunglas/DunglasJsonLdApiBundle.git", - "reference": "b0ccbb3131c711539752d183ffc35803b5cb5584" + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dunglas/DunglasJsonLdApiBundle/zipball/b0ccbb3131c711539752d183ffc35803b5cb5584", - "reference": "b0ccbb3131c711539752d183ffc35803b5cb5584", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "~1.2", - "doctrine/inflector": "~1.0", - "doctrine/orm": "~2.2,>=2.2.3", - "dunglas/php-property-info": "~0.2", - "php": ">=5.5", - "phpdocumentor/reflection": "^1.0.7", - "symfony/framework-bundle": "~2.6|~3.0", - "symfony/serializer": "~3.0|~2.7@dev", - "symfony/validator": "~2.5|~3.0" + "php": ">=7.1.0" }, "require-dev": { - "behat/behat": "~3.0", - "behat/mink": "~1.5", - "behat/mink-browserkit-driver": "~1.1", - "behat/mink-extension": "~2.0", - "behat/symfony2-extension": "~2.0", - "behatch/contexts": "~2.2", - "friendsofsymfony/user-bundle": "dev-master", - "phpspec/phpspec": "~2.0", - "symfony/symfony": "~2.7@dev" - }, - "suggest": { - "friendsofsymfony/user-bundle": "To use the FOSUserBundle bridge." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, + "type": "library", "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Dunglas\\JsonLdApiBundle\\": "" + "React\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1553,53 +1773,75 @@ ], "authors": [ { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com", - "homepage": "http://dunglas.fr/" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "JSON-LD / Hydra REST API for Symfony", - "homepage": "http://api-platform.com/", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "Hydra", - "JSON-LD", - "api", - "json", - "rest" + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2015-04-06 11:35:01" + "time": "2024-05-24T10:39:05+00:00" }, { - "name": "dunglas/php-property-info", - "version": "v0.2.1", + "name": "react/socket", + "version": "v1.16.0", "source": { "type": "git", - "url": "https://github.com/dunglas/php-property-info.git", - "reference": "f378ad895f64885dcfcedfd198ad5aa1b19f6c97" + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dunglas/php-property-info/zipball/f378ad895f64885dcfcedfd198ad5aa1b19f6c97", - "reference": "f378ad895f64885dcfcedfd198ad5aa1b19f6c97", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { - "php": ">=5.4" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { - "doctrine/orm": "~2.3", - "phpdocumentor/reflection": "~1.0", - "phpspec/phpspec": "~2.1" - }, - "suggest": { - "doctrine/orm": "To use Doctrine metadata", - "phpdocumentor/reflection": "To use the PHPDoc", - "symfony/validator": "To use Symfony validator metadata" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { - "psr-0": { - "PropertyInfo\\": "src/" + "psr-4": { + "React\\Socket\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1608,52 +1850,74 @@ ], "authors": [ { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Retrieve type and description of PHP properties using various sources ", - "homepage": "http://dunglas.fr/", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", "keywords": [ - "doctrine", - "phpdoc", - "property", - "symfony", - "type", - "validator" + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2015-04-03 17:49:18" + "time": "2024-07-26T10:38:09+00:00" }, { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", + "name": "react/stream", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { - "php": ">=5.2.4" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" }, "require-dev": { - "phpunit/phpunit": "3.7.*" + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, "autoload": { - "classmap": [ - "lib" - ] + "psr-4": { + "React\\Stream\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1661,47 +1925,80 @@ ], "authors": [ { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ - "highlight", - "sql" + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2014-01-12 16:20:24" + "time": "2024-06-11T12:45:25+00:00" }, { - "name": "nikic/php-parser", - "version": "v0.9.5", + "name": "sebastian/diff", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ef70767475434bdb3615b43c327e2cae17ef12eb", - "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=5.2" + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.9-dev" + "dev-main": "6.0-dev" } }, "autoload": { - "psr-0": { - "PHPParser": "lib/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1709,105 +2006,194 @@ ], "authors": [ { - "name": "Nikita Popov" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "A PHP parser written in PHP", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "parser", - "php" + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2014-07-23 18:24:17" + "time": "2024-07-03T04:53:05+00:00" }, { - "name": "phpdocumentor/reflection", - "version": "1.0.7", + "name": "sweetrdf/easyrdf", + "version": "1.16.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "fc40c3f604ac2287eb5c314174d5109b2c699372" + "url": "https://github.com/sweetrdf/easyrdf.git", + "reference": "f42130dc7188f89f5fc9539e3be0dc854145dd77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/fc40c3f604ac2287eb5c314174d5109b2c699372", - "reference": "fc40c3f604ac2287eb5c314174d5109b2c699372", + "url": "https://api.github.com/repos/sweetrdf/easyrdf/zipball/f42130dc7188f89f5fc9539e3be0dc854145dd77", + "reference": "f42130dc7188f89f5fc9539e3be0dc854145dd77", "shasum": "" }, "require": { - "nikic/php-parser": "~0.9.4", - "php": ">=5.3.3", - "phpdocumentor/reflection-docblock": "~2.0", - "psr/log": "~1.0" + "ext-dom": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-xmlreader": "*", + "lib-libxml": "*", + "php": "^8.0", + "sweetrdf/rdf-helpers": "^2.0" + }, + "replace": { + "easyrdf/easyrdf": "1.1.*" }, "require-dev": { - "behat/behat": "~2.4", - "mockery/mockery": "~0.8", - "phpunit/phpunit": "~4.0" + "friendsofphp/php-cs-fixer": "^3.0", + "laminas/laminas-http": "^2", + "ml/json-ld": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5.0|^10.0.0", + "semsol/arc2": "^3", + "zendframework/zend-http": "^2" + }, + "suggest": { + "ml/json-ld": "^1.0", + "semsol/arc2": "^3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/", - "tests/unit/", - "tests/mocks/" - ] + "psr-4": { + "EasyRdf\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "description": "Reflection library to do Static Analysis for PHP Projects", - "homepage": "http://www.phpdoc.org/", + "authors": [ + { + "name": "Nicholas Humfrey", + "email": "njh@aelius.com", + "homepage": "http://www.aelius.com/njh/", + "role": "Developer" + }, + { + "name": "Alexey Zakhlestin", + "email": "indeyets@gmail.com", + "homepage": "http://indeyets.ru/", + "role": "Developer" + }, + { + "name": "Konrad Abicht", + "email": "hi@inspirito.de", + "homepage": "http://inspirito.de/", + "role": "Maintainer, Developer" + } + ], + "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.", "keywords": [ - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "Linked Data", + "RDF", + "Semantic Web", + "Turtle", + "rdfa", + "sparql" ], - "time": "2014-11-14 11:43:04" + "support": { + "issues": "https://github.com/sweetrdf/easyrdf/issues", + "source": "https://github.com/sweetrdf/easyrdf/tree/1.16.1" + }, + "time": "2025-01-28T18:31:07+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "name": "sweetrdf/rdf-helpers", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "url": "https://github.com/sweetrdf/rdfHelpers.git", + "reference": "3c2cb15e86053fcf5c52235da75c2b141218e3f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/sweetrdf/rdfHelpers/zipball/3c2cb15e86053fcf5c52235da75c2b141218e3f8", + "reference": "3c2cb15e86053fcf5c52235da75c2b141218e3f8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.0", + "sweetrdf/rdf-interface": "^2", + "zozlak/rdf-constants": "^1.1" }, "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "phpstan/phpstan": "^1", + "phpunit/phpunit": "^10" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" + "autoload": { + "psr-4": { + "rdfHelpers\\": "src/rdfHelpers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mateusz Żółtak", + "email": "zozlak@zozlak.org", + "role": "Developer" } + ], + "description": "Set of low level helpers for implementing rdfInterface", + "homepage": "https://github.com/sweetrdf/rdfHelpers", + "support": { + "issues": "https://github.com/sweetrdf/rdfHelpers/issues", + "source": "https://github.com/sweetrdf/rdfHelpers/tree/2.0.0" + }, + "time": "2024-02-13T12:03:47+00:00" + }, + { + "name": "sweetrdf/rdf-interface", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sweetrdf/rdfInterface.git", + "reference": "eeee78832fe87c3ee6834df67b5b0cfb73eb503b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sweetrdf/rdfInterface/zipball/eeee78832fe87c3ee6834df67b5b0cfb73eb503b", + "reference": "eeee78832fe87c3ee6834df67b5b0cfb73eb503b", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/http-message": "^1.0 || ^2.0", + "zozlak/rdf-constants": "*" }, + "require-dev": { + "phpstan/phpstan": "*" + }, + "type": "library", "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] + "psr-4": { + "rdfInterface\\": "src/rdfInterface" } }, "notification-url": "https://packagist.org/downloads/", @@ -1816,184 +2202,365 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "name": "Mateusz Żółtak", + "email": "zozlak@zozlak.org", + "role": "Developer" } ], - "time": "2015-02-03 12:10:50" + "description": "A common RDF interface for PHP RDF libraries.", + "homepage": "https://github.com/sweetrdf/rdfInterface", + "support": { + "issues": "https://github.com/sweetrdf/rdfInterface/issues", + "source": "https://github.com/sweetrdf/rdfInterface/tree/2.1.0" + }, + "time": "2024-11-22T19:09:12+00:00" }, { - "name": "symfony/debug", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Debug", + "name": "symfony/config", + "version": "v7.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/Debug.git", - "reference": "d49a46a20a8f0544aedac54466750ad787d3d3e3" + "url": "https://github.com/symfony/config.git", + "reference": "7716594aaae91d9141be080240172a92ecca4d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/d49a46a20a8f0544aedac54466750ad787d3d3e3", - "reference": "d49a46a20a8f0544aedac54466750ad787d3d3e3", + "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", + "reference": "7716594aaae91d9141be080240172a92ecca4d44", "shasum": "" }, "require": { - "php": ">=5.3.3", - "psr/log": "~1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/class-loader": "~2.2", - "symfony/http-foundation": "~2.1", - "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2", - "symfony/phpunit-bridge": "~2.7" - }, - "suggest": { - "symfony/http-foundation": "", - "symfony/http-kernel": "" + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Debug\\": "" - } + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/config/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Debug Component", - "homepage": "http://symfony.com/", - "time": "2015-03-22 16:55:57" + "time": "2025-01-22T12:07:01+00:00" }, { - "name": "symfony/dependency-injection", - "version": "v2.6.6", - "target-dir": "Symfony/Component/DependencyInjection", + "name": "symfony/console", + "version": "v7.2.1", "source": { "type": "git", - "url": "https://github.com/symfony/DependencyInjection.git", - "reference": "8e9007012226b4bd41f8afed855c452cf5edc3a6" + "url": "https://github.com/symfony/console.git", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/8e9007012226b4bd41f8afed855c452cf5edc3a6", - "reference": "8e9007012226b4bd41f8afed855c452cf5edc3a6", + "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/expression-language": "<2.6" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "symfony/config": "~2.2", - "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", - "symfony/yaml": "~2.1" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, - "suggest": { - "symfony/config": "", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com/", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-11T03:49:26+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "2.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\DependencyInjection\\": "" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony DependencyInjection Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/doctrine-bridge", - "version": "v2.6.6", - "target-dir": "Symfony/Bridge/Doctrine", + "name": "symfony/event-dispatcher", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/DoctrineBridge.git", - "reference": "6233098ffcafffeeb83225be8b8b0a496af8b16e" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/6233098ffcafffeeb83225be8b8b0a496af8b16e", - "reference": "6233098ffcafffeeb83225be8b8b0a496af8b16e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { - "doctrine/common": "~2.3", - "php": ">=5.3.3" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.2", - "doctrine/orm": "~2.2,>=2.2.3", - "symfony/dependency-injection": "~2.2", - "symfony/expression-language": "~2.2", - "symfony/form": "~2.3,>=2.3.8", - "symfony/http-kernel": "~2.2", - "symfony/phpunit-bridge": "~2.7", - "symfony/property-access": "~2.3", - "symfony/security": "~2.2", - "symfony/stopwatch": "~2.2", - "symfony/translation": "~2.0,>=2.0.5", - "symfony/validator": "~2.5,>=2.5.5" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/validator": "" + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "symfony-bridge", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "2.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Bridge\\Doctrine\\": "" + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2001,137 +2568,4916 @@ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Doctrine Bridge", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/framework-bundle", - "version": "v2.6.6", - "target-dir": "Symfony/Bundle/FrameworkBundle", + "name": "symfony/filesystem", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/FrameworkBundle.git", - "reference": "34f0ea802a125ff1d28ed3923886127df31c8ee6" + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/34f0ea802a125ff1d28ed3923886127df31c8ee6", - "reference": "34f0ea802a125ff1d28ed3923886127df31c8ee6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", "shasum": "" }, "require": { - "doctrine/annotations": "~1.0", - "php": ">=5.3.3", - "symfony/config": "~2.4", - "symfony/dependency-injection": "~2.6,>=2.6.2", - "symfony/event-dispatcher": "~2.5", - "symfony/filesystem": "~2.3", - "symfony/http-foundation": "~2.4.9|~2.5,>=2.5.4", - "symfony/http-kernel": "~2.6", - "symfony/routing": "~2.3.26|~2.6,>=2.6.5", - "symfony/security-core": "~2.6", - "symfony/security-csrf": "~2.6", - "symfony/stopwatch": "~2.3", - "symfony/templating": "~2.1", - "symfony/translation": "~2.6" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/browser-kit": "~2.4", - "symfony/class-loader": "~2.1", - "symfony/console": "~2.5,>=2.5.2", - "symfony/css-selector": "~2.0,>=2.0.5", - "symfony/dom-crawler": "~2.0,>=2.0.5", - "symfony/expression-language": "~2.6", - "symfony/finder": "~2.0,>=2.0.5", - "symfony/form": "~2.6", - "symfony/intl": "~2.3", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.0,>=2.0.5", - "symfony/security": "~2.6", - "symfony/validator": "~2.5", - "symfony/yaml": "~2.0,>=2.0.5" - }, - "suggest": { - "doctrine/cache": "For using alternative cache drivers", - "symfony/console": "For using the console commands", - "symfony/finder": "For using the translation loader and cache warmer", - "symfony/form": "For using forms", - "symfony/validator": "For using validation", - "symfony/yaml": "For using the debug:config and yaml:lint commands" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } + "symfony/process": "^6.4|^7.0" }, + "type": "library", "autoload": { - "psr-0": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - } + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:15:23+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-30T19:00:17+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com/", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-20T11:17:29+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/process/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T14:24:19+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-18T14:28:33+00:00" + }, + { + "name": "symfony/string", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com/", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:26+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-07T12:55:42+00:00" + }, + { + "name": "twig/twig", + "version": "v3.19.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e", + "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org/", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com/", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.19.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2025-01-29T07:06:14+00:00" + }, + { + "name": "zozlak/rdf-constants", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zozlak/RdfConstants.git", + "reference": "a8de0b50d23b213a68784ec2cec22b4ad838012b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zozlak/RdfConstants/zipball/a8de0b50d23b213a68784ec2cec22b4ad838012b", + "reference": "a8de0b50d23b213a68784ec2cec22b4ad838012b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "zozlak\\": "src/zozlak" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mateusz Żółtak", + "email": "zozlak@zozlak.org" + } + ], + "description": "A set of commonly used RDF and XSD constants", + "homepage": "https://github.com/zozlak/RdfConstants", + "support": { + "issues": "https://github.com/zozlak/RdfConstants/issues", + "source": "https://github.com/zozlak/RdfConstants/tree/1.2.1" + }, + "time": "2022-08-05T12:50:50+00:00" + } + ], + "packages-dev": [ + { + "name": "api-platform/core", + "version": "v4.0.16", + "source": { + "type": "git", + "url": "https://github.com/api-platform/core.git", + "reference": "6cc70d3bc9695cb323a7117c90d992c8ca959ec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/core/zipball/6cc70d3bc9695cb323a7117c90d992c8ca959ec1", + "reference": "6cc70d3bc9695cb323a7117c90d992c8ca959ec1", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.0 || ^2.0", + "php": ">=8.2", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^3.1", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/translation-contracts": "^3.3", + "symfony/web-link": "^6.4 || ^7.0", + "willdurand/negotiation": "^3.1" + }, + "conflict": { + "doctrine/common": "<3.2.2", + "doctrine/dbal": "<2.10", + "doctrine/mongodb-odm": "<2.4", + "doctrine/orm": "<2.14.0", + "doctrine/persistence": "<1.3", + "phpspec/prophecy": "<1.15", + "phpunit/phpunit": "<9.5", + "symfony/framework-bundle": "6.4.6 || 7.0.6", + "symfony/var-exporter": "<6.1.1" + }, + "replace": { + "api-platform/doctrine-common": "self.version", + "api-platform/doctrine-odm": "self.version", + "api-platform/doctrine-orm": "self.version", + "api-platform/documentation": "self.version", + "api-platform/elasticsearch": "self.version", + "api-platform/graphql": "self.version", + "api-platform/http-cache": "self.version", + "api-platform/hydra": "self.version", + "api-platform/json-api": "self.version", + "api-platform/json-hal": "self.version", + "api-platform/json-schema": "self.version", + "api-platform/jsonld": "self.version", + "api-platform/laravel": "self.version", + "api-platform/metadata": "self.version", + "api-platform/openapi": "self.version", + "api-platform/parameter-validator": "self.version", + "api-platform/ramsey-uuid": "self.version", + "api-platform/serializer": "self.version", + "api-platform/state": "self.version", + "api-platform/symfony": "self.version", + "api-platform/validator": "self.version" + }, + "require-dev": { + "behat/behat": "^3.11", + "behat/mink": "^1.9", + "doctrine/cache": "^1.11 || ^2.1", + "doctrine/common": "^3.2.2", + "doctrine/dbal": "^4.0", + "doctrine/doctrine-bundle": "^2.11", + "doctrine/mongodb-odm": "^2.6", + "doctrine/mongodb-odm-bundle": "^4.0 || ^5.0", + "doctrine/orm": "^2.17 || ^3.0", + "elasticsearch/elasticsearch": "^8.4", + "friends-of-behat/mink-browserkit-driver": "^1.3.1", + "friends-of-behat/mink-extension": "^2.2", + "friends-of-behat/symfony-extension": "^2.1", + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "illuminate/config": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/database": "^11.0", + "illuminate/http": "^11.0", + "illuminate/pagination": "^11.0", + "illuminate/routing": "^11.0", + "illuminate/support": "^11.0", + "jangregor/phpstan-prophecy": "^1.0", + "justinrainbow/json-schema": "^5.2.11", + "laravel/framework": "^11.0", + "orchestra/testbench": "^9.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpdoc-parser": "^1.13|^2.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-doctrine": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpunit/phpunit": "^11.2", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "ramsey/uuid": "^4.0", + "ramsey/uuid-doctrine": "^2.0", + "soyuka/contexts": "^3.3.10", + "soyuka/pmu": "^0.0.15", + "soyuka/stubs-mongodb": "^1.0", + "symfony/asset": "^6.4 || ^7.0", + "symfony/browser-kit": "^6.4 || ^7.0", + "symfony/cache": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/css-selector": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/doctrine-bridge": "^6.4.2 || ^7.0.2", + "symfony/dom-crawler": "^6.4 || ^7.0", + "symfony/error-handler": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/finder": "^6.4 || ^7.0", + "symfony/form": "^6.4 || ^7.0", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/http-client": "^6.4 || ^7.0", + "symfony/intl": "^6.4 || ^7.0", + "symfony/maker-bundle": "^1.24", + "symfony/mercure-bundle": "*", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/security-core": "^6.4 || ^7.0", + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/string": "^6.4 || ^7.0", + "symfony/twig-bundle": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/web-profiler-bundle": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", + "twig/twig": "^1.42.3 || ^2.12 || ^3.0", + "webonyx/graphql-php": "^15.0" + }, + "suggest": { + "doctrine/mongodb-odm-bundle": "To support MongoDB. Only versions 4.0 and later are supported.", + "elasticsearch/elasticsearch": "To support Elasticsearch.", + "ocramius/package-versions": "To display the API Platform's version in the debug bar.", + "phpstan/phpdoc-parser": "To support extracting metadata from PHPDoc.", + "psr/cache-implementation": "To use metadata caching.", + "ramsey/uuid": "To support Ramsey's UUID identifiers.", + "symfony/cache": "To have metadata caching when using Symfony integration.", + "symfony/config": "To load XML configuration files.", + "symfony/expression-language": "To use authorization features.", + "symfony/http-client": "To use the HTTP cache invalidation system.", + "symfony/messenger": "To support messenger integration.", + "symfony/security": "To use authorization features.", + "symfony/twig-bundle": "To use the Swagger UI integration.", + "symfony/uid": "To support Symfony UUID/ULID identifiers.", + "symfony/web-profiler-bundle": "To use the data collector.", + "webonyx/graphql-php": "To support GraphQL." + }, + "type": "library", + "extra": { + "pmu": { + "projects": [ + "./src/*/composer.json", + "src/Doctrine/*/composer.json" + ] + }, + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.1" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/JsonLd/HydraContext.php" + ], + "psr-4": { + "ApiPlatform\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr/" + } + ], + "description": "Build a fully-featured hypermedia or GraphQL API in minutes!", + "homepage": "https://api-platform.com/", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "laravel", + "openapi", + "rest", + "swagger", + "symfony" + ], + "support": { + "issues": "https://github.com/api-platform/core/issues", + "source": "https://github.com/api-platform/core/tree/v4.0.16" + }, + "time": "2025-01-17T14:21:29+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-04-18T06:56:21+00:00" + }, + { + "name": "doctrine/dbal", + "version": "4.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "19a2b7deb5fe8c2df0ff817ecea305e50acb62ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/19a2b7deb5fe8c2df0ff817ecea305e50acb62ec", + "reference": "19a2b7deb5fe8c2df0ff817ecea305e50acb62ec", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3|^1", + "php": "^8.1", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "10.5.39", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-01-16T08:40:56+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "doctrine/orm", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/b1f8253105aa5382c495e5f9f8ef34e297775428", + "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", + "ext-ctype": "*", + "php": "^8.1", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.3.9 || ^7.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0", + "phpbench/phpbench": "^1.0", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.0.3", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.4.0", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/3.3.1" + }, + "time": "2024-12-19T07:08:14+00:00" + }, + { + "name": "doctrine/persistence", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "45004aca79189474f113cbe3a53847c2115a55fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", + "reference": "45004aca79189474f113cbe3a53847c2115a55fa", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^8.1", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "1.12.7", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^9.6", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/4.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2024-11-01T21:49:07+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.5", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "e7be26966b7398204a234f8673fdad5ac6277802" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/e7be26966b7398204a234f8673fdad5ac6277802", + "reference": "e7be26966b7398204a234f8673fdad5ac6277802", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2 || ^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "https://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.5" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2025-01-14T11:49:03+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org/", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" + }, + "time": "2024-12-07T09:39:29+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/a0165c648cab6a80311c74ffc708a07bb53ecc93", + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2 || ^2.0", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.40", + "phpspec/phpspec": "^6.0 || ^7.0", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com/" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "dev", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.20.0" + }, + "time": "2024-11-19T13:12:41+00:00" + }, + { + "name": "phpspec/prophecy-phpunit", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy-phpunit.git", + "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/8819516c1b489ecee4c60db5f5432fac1ea8ac6f", + "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "phpspec/prophecy": "^1.18", + "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\PhpUnit\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + } + ], + "description": "Integrating the Prophecy mocking library in PHPUnit test cases", + "homepage": "http://phpspec.net/", + "keywords": [ + "phpunit", + "prophecy" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy-phpunit/issues", + "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.3.0" + }, + "time": "2024-11-19T13:24:17+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" + }, + "time": "2024-10-13T11:29:49+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "7d08f569e582ade182a375c366cbd896eccadd3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7d08f569e582ade182a375c366cbd896eccadd3a", + "reference": "7d08f569e582ade182a375c366cbd896eccadd3a", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2025-01-21T14:54:06+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.3.1", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.0" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-11T12:34:27+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b9a975972f580c0491f834eb0818ad2b32fd8bba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b9a975972f580c0491f834eb0818ad2b32fd8bba", + "reference": "b9a975972f580c0491f834eb0818ad2b32fd8bba", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.8", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.2", + "sebastian/comparator": "^6.3.0", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.0", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.5" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-01-29T14:01:11+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/link", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link.git", + "reference": "84b159194ecfd7eaa472280213976e96415433f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link/zipball/84b159194ecfd7eaa472280213976e96415433f7", + "reference": "84b159194ecfd7eaa472280213976e96415433f7", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "suggest": { + "fig/link-util": "Provides some useful PSR-13 utilities" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for HTTP links", + "homepage": "https://github.com/php-fig/link", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "support": { + "source": "https://github.com/php-fig/link/tree/2.0.1" + }, + "time": "2021-03-11T23:00:27+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-12T09:59:06+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-01-06T10:28:19+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:54:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:10:34+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-09-17T13:12:04+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "7a183fdfb472c5487480baa128a41ed47367723e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/7a183fdfb472c5487480baa128a41ed47367723e", + "reference": "7a183fdfb472c5487480baa128a41ed47367723e", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1|^4", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/collections": "<1.8", + "doctrine/dbal": "<3.6", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.15", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.8|^2.0", + "doctrine/data-fixtures": "^1.1|^2", + "doctrine/dbal": "^3.6|^4", + "doctrine/orm": "^2.15|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/doctrine-messenger": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-27T11:08:17+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/959a74d044a6db21f4caa6d695648dcb5584cb49", + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-07T09:39:55+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-17T10:56:55+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-29T07:40:13+00:00" + }, + { + "name": "symfony/phpunit-bridge", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2bbde92ab25a0e2c88160857af7be9db5da0d145", + "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T16:15:23+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/property-access", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "b28732e315d81fbec787f838034de7d6c9b2b902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902", + "reference": "b28732e315d81fbec787f838034de7d6c9b2b902", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" + }, + "require-dev": { + "symfony/cache": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com/", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-17T10:56:55+00:00" + }, + { + "name": "symfony/property-info", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "dedb118fd588a92f226b390250b384d25f4192fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/dedb118fd588a92f226b390250b384d25f4192fe", + "reference": "dedb118fd588a92f226b390250b384d25f4192fe", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "~7.1.9|^7.2.2" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com/", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v7.2.3" + }, + "funding": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony FrameworkBundle", - "homepage": "http://symfony.com/", - "time": "2015-03-27 10:19:51" + "time": "2025-01-27T11:08:17+00:00" }, { - "name": "symfony/http-foundation", - "version": "v2.6.6", - "target-dir": "Symfony/Component/HttpFoundation", + "name": "symfony/serializer", + "version": "v7.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "8a6337233f08f7520de97f4ffd6f00e947d892f9" + "url": "https://github.com/symfony/serializer.git", + "reference": "320f30beb419ce4f96363ada5e225c41f1ef08ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/8a6337233f08f7520de97f4ffd6f00e947d892f9", - "reference": "8a6337233f08f7520de97f4ffd6f00e947d892f9", + "url": "https://api.github.com/repos/symfony/serializer/zipball/320f30beb419ce4f96363ada5e225c41f1ef08ab", + "reference": "320f30beb419ce4f96363ada5e225c41f1ef08ab", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "symfony/expression-language": "~2.4", - "symfony/phpunit-bridge": "~2.7" + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^7.2", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" + "psr-4": { + "Symfony\\Component\\Serializer\\": "" }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2139,141 +7485,143 @@ "MIT" ], "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/serializer/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony HttpFoundation Component", - "homepage": "http://symfony.com/", - "time": "2015-04-01 16:50:12" + "time": "2025-01-29T07:13:55+00:00" }, { - "name": "symfony/http-kernel", - "version": "v2.6.6", - "target-dir": "Symfony/Component/HttpKernel", + "name": "symfony/translation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/HttpKernel.git", - "reference": "3829cacfe21eaf3f73604a62d79183d1f6e792c4" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/3829cacfe21eaf3f73604a62d79183d1f6e792c4", - "reference": "3829cacfe21eaf3f73604a62d79183d1f6e792c4", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "php": ">=5.3.3", - "psr/log": "~1.0", - "symfony/debug": "~2.6,>=2.6.2", - "symfony/event-dispatcher": "~2.5.9|~2.6,>=2.6.2", - "symfony/http-foundation": "~2.5,>=2.5.4" - }, - "require-dev": { - "symfony/browser-kit": "~2.3", - "symfony/class-loader": "~2.1", - "symfony/config": "~2.0,>=2.0.5", - "symfony/console": "~2.3", - "symfony/css-selector": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.2", - "symfony/dom-crawler": "~2.0,>=2.0.5", - "symfony/expression-language": "~2.4", - "symfony/finder": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.0,>=2.0.5", - "symfony/routing": "~2.2", - "symfony/stopwatch": "~2.3", - "symfony/templating": "~2.2", - "symfony/translation": "~2.0,>=2.0.5", - "symfony/var-dumper": "~2.6" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "2.6-dev" + "dev-main": "3.5-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\HttpKernel\\": "" - } + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony HttpKernel Component", - "homepage": "http://symfony.com/", - "time": "2015-04-01 16:55:26" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/routing", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Routing", + "name": "symfony/type-info", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "4e173a645b63ff60a124f3741b4f15feebd908fa" + "url": "https://github.com/symfony/type-info.git", + "reference": "3b5a17470fff0034f25fd4287cbdaa0010d2f749" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/4e173a645b63ff60a124f3741b4f15feebd908fa", - "reference": "4e173a645b63ff60a124f3741b4f15feebd908fa", + "url": "https://api.github.com/repos/symfony/type-info/zipball/3b5a17470fff0034f25fd4287cbdaa0010d2f749", + "reference": "3b5a17470fff0034f25fd4287cbdaa0010d2f749", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.2", + "psr/container": "^1.1|^2.0" }, "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", - "psr/log": "~1.0", - "symfony/config": "~2.2", - "symfony/expression-language": "~2.4", - "symfony/http-foundation": "~2.3", - "symfony/phpunit-bridge": "~2.7", - "symfony/yaml": "~2.0,>=2.0.5" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/yaml": "For using the YAML loader" + "phpstan/phpdoc-parser": "^1.0|^2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2281,368 +7629,468 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", - "homepage": "http://symfony.com/", + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com/", "keywords": [ - "router", - "routing", - "uri", - "url" + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2015-03-30 15:54:10" + "time": "2024-12-20T13:38:37+00:00" }, { - "name": "symfony/security", - "version": "v2.3.27", - "target-dir": "Symfony/Component/Security", + "name": "symfony/validator", + "version": "v7.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/Security.git", - "reference": "25e914f2b63d4021af1fb0e510ac0843f1bdb3ee" + "url": "https://github.com/symfony/validator.git", + "reference": "6faf9f671d522b76ce87e46a1d2d7740b4385c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Security/zipball/25e914f2b63d4021af1fb0e510ac0843f1bdb3ee", - "reference": "25e914f2b63d4021af1fb0e510ac0843f1bdb3ee", + "url": "https://api.github.com/repos/symfony/validator/zipball/6faf9f671d522b76ce87e46a1d2d7740b4385c6f", + "reference": "6faf9f671d522b76ce87e46a1d2d7740b4385c6f", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/event-dispatcher": "~2.2", - "symfony/http-foundation": "~2.1", - "symfony/http-kernel": "~2.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" }, - "require-dev": { - "doctrine/common": "~2.2", - "doctrine/dbal": "~2.2", - "ircmaxell/password-compat": "~1.0", - "psr/log": "~1.0", - "symfony/form": "~2.0,>=2.0.5", - "symfony/intl": "~2.3", - "symfony/phpunit-bridge": "~2.7", - "symfony/routing": "~2.2", - "symfony/validator": "~2.2" + "conflict": { + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<6.4" }, - "suggest": { - "doctrine/dbal": "to use the built-in ACL implementation", - "ircmaxell/password-compat": "", - "symfony/class-loader": "", - "symfony/finder": "", - "symfony/form": "", - "symfony/routing": "", - "symfony/validator": "" + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\": "" - } + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com/", + "support": { + "source": "https://github.com/symfony/validator/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Security Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:33:35" + "time": "2025-01-28T15:51:35+00:00" }, { - "name": "symfony/security-core", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Security/Core", + "name": "symfony/var-dumper", + "version": "v7.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "d25c17db741f58c0f615e52006a47f6fb23cd9b3" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/d25c17db741f58c0f615e52006a47f6fb23cd9b3", - "reference": "d25c17db741f58c0f615e52006a47f6fb23cd9b3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" }, - "require-dev": { - "ircmaxell/password-compat": "1.0.*", - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/expression-language": "~2.6", - "symfony/http-foundation": "~2.4", - "symfony/phpunit-bridge": "~2.7", - "symfony/translation": "~2.0,>=2.0.5", - "symfony/validator": "~2.5,>=2.5.5" + "conflict": { + "symfony/console": "<6.4" }, - "suggest": { - "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/validator": "For using the user password constraint" + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\Core\\": "" - } + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com/", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Security Component - Core Library", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "time": "2025-01-17T11:39:41+00:00" }, { - "name": "symfony/security-csrf", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Security/Csrf", + "name": "symfony/var-exporter", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/security-csrf.git", - "reference": "7cc85bffcb0f3a68cd8be8d2c91da0cc962f152a" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/7cc85bffcb0f3a68cd8be8d2c91da0cc962f152a", - "reference": "7cc85bffcb0f3a68cd8be8d2c91da0cc962f152a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d", + "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/security-core": "~2.4" + "php": ">=8.2" }, "require-dev": { - "symfony/http-foundation": "~2.1", - "symfony/phpunit-bridge": "~2.7" - }, - "suggest": { - "symfony/http-foundation": "For using the class SessionTokenStorage." + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\Csrf\\": "" - } + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com/", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Security Component - CSRF Library", - "homepage": "http://symfony.com/", - "time": "2015-02-24 11:52:21" + "time": "2024-10-18T07:58:17+00:00" }, { - "name": "symfony/serializer", - "version": "2.7.x-dev", - "target-dir": "Symfony/Component/Serializer", + "name": "symfony/web-link", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/Serializer.git", - "reference": "d8295ddc10069a4e146e2503f4fc31053ff86be3" + "url": "https://github.com/symfony/web-link.git", + "reference": "f537556a885e14a1d28f6c759d41e57e93d0a532" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Serializer/zipball/d8295ddc10069a4e146e2503f4fc31053ff86be3", - "reference": "d8295ddc10069a4e146e2503f4fc31053ff86be3", + "url": "https://api.github.com/repos/symfony/web-link/zipball/f537556a885e14a1d28f6c759d41e57e93d0a532", + "reference": "f537556a885e14a1d28f6c759d41e57e93d0a532", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=8.2", + "psr/link": "^1.1|^2.0" }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "symfony/config": "~2.2|~3.0.0", - "symfony/phpunit-bridge": "~2.7|~3.0.0", - "symfony/property-access": "~2.3|~3.0.0", - "symfony/yaml": "~2.0|~3.0.0" + "conflict": { + "symfony/http-kernel": "<6.4" }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", - "symfony/config": "For using the XML mapping loader.", - "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/yaml": "For using the default YAML mapping loader." + "provide": { + "psr/link-implementation": "1.0|2.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } + "require-dev": { + "symfony/http-kernel": "^6.4|^7.0" }, + "type": "library", "autoload": { - "psr-0": { - "Symfony\\Component\\Serializer\\": "" - } + "psr-4": { + "Symfony\\Component\\WebLink\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages links between resources", + "homepage": "https://symfony.com/", + "keywords": [ + "dns-prefetch", + "http", + "http2", + "link", + "performance", + "prefetch", + "preload", + "prerender", + "psr13", + "push" + ], + "support": { + "source": "https://github.com/symfony/web-link/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Serializer Component", - "homepage": "http://symfony.com/", - "time": "2015-03-22 16:57:18" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "symfony/templating", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Templating", + "name": "theseer/tokenizer", + "version": "1.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/Templating.git", - "reference": "bc4879a794c1fa51fd7bd4bbc5bea33b7071b776" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Templating/zipball/bc4879a794c1fa51fd7bd4bbc5bea33b7071b776", - "reference": "bc4879a794c1fa51fd7bd4bbc5bea33b7071b776", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/phpunit-bridge": "~2.7" - }, - "suggest": { - "psr/log": "For using debug logging in loaders" + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, "autoload": { - "psr-0": { - "Symfony\\Component\\Templating\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "Symfony Templating Component", - "homepage": "http://symfony.com/", - "time": "2015-03-13 17:37:22" + "time": "2024-03-03T12:36:25+00:00" }, { - "name": "symfony/translation", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Translation", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/Translation.git", - "reference": "bd939f05cdaca128f4ddbae1b447d6f0203b60af" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/bd939f05cdaca128f4ddbae1b447d6f0203b60af", - "reference": "bd939f05cdaca128f4ddbae1b447d6f0203b60af", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.3,>=2.3.12", - "symfony/intl": "~2.3", - "symfony/phpunit-bridge": "~2.7", - "symfony/yaml": "~2.2" + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" }, - "suggest": { - "psr/log": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "require-dev": { + "phpunit/phpunit": "^8.5.13" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "1.10-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\Translation\\": "" + "psr-4": { + "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2651,70 +8099,51 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Symfony Translation Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" }, { - "name": "symfony/validator", - "version": "v2.6.6", - "target-dir": "Symfony/Component/Validator", + "name": "willdurand/negotiation", + "version": "3.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/Validator.git", - "reference": "85d9b42fe71bf88e7a1e5dec2094605dc9fbff28" + "url": "https://github.com/willdurand/Negotiation.git", + "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Validator/zipball/85d9b42fe71bf88e7a1e5dec2094605dc9fbff28", - "reference": "85d9b42fe71bf88e7a1e5dec2094605dc9fbff28", + "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", + "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/translation": "~2.0,>=2.0.5" + "php": ">=7.1.0" }, "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "doctrine/common": "~2.3", - "egulias/email-validator": "~1.2,>=1.2.1", - "symfony/config": "~2.2", - "symfony/expression-language": "~2.4", - "symfony/http-foundation": "~2.1", - "symfony/intl": "~2.3", - "symfony/phpunit-bridge": "~2.7", - "symfony/property-access": "~2.3", - "symfony/yaml": "~2.0,>=2.0.5" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", - "egulias/email-validator": "Strict (RFC compliant) email validation", - "symfony/config": "", - "symfony/expression-language": "For using the 2.4 Expression validator", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/property-access": "For using the 2.4 Validator API", - "symfony/yaml": "" + "symfony/phpunit-bridge": "^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "3.0-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\Validator\\": "" + "psr-4": { + "Negotiation\\": "src/Negotiation" } }, "notification-url": "https://packagist.org/downloads/", @@ -2723,30 +8152,35 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "William Durand", + "email": "will+git@drnd.me" } ], - "description": "Symfony Validator Component", - "homepage": "http://symfony.com/", - "time": "2015-03-30 15:54:10" + "description": "Content Negotiation tools for PHP provided as a standalone library.", + "homepage": "http://williamdurand.fr/Negotiation/", + "keywords": [ + "accept", + "content", + "format", + "header", + "negotiation" + ], + "support": { + "issues": "https://github.com/willdurand/Negotiation/issues", + "source": "https://github.com/willdurand/Negotiation/tree/3.1.0" + }, + "time": "2022-01-30T20:08:53+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "symfony/serializer": 20, - "dunglas/json-ld-api-bundle": 20 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.4", + "php": ">=7.4", "ext-json": "*" }, - "platform-dev": [] + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/couscous.yml b/couscous.yml deleted file mode 100644 index 747f1dfe..00000000 --- a/couscous.yml +++ /dev/null @@ -1,23 +0,0 @@ -baseUrl: http://php-schema.dunglas.com - -github: - user: dunglas - repo: php-schema - -title: PHP Schema -subTitle: Generate PHP data model from Schema.org vocabulary - -menu: - items: - home: - text: Home - relativeUrl: ~ - getting-started: - text: Getting started - relativeUrl: doc/getting-started.html - configuration: - text: Configuration - relativeUrl: doc/configuration.html - github: - text: " GitHub" - absoluteUrl: http://github.com/dunglas/php-schema diff --git a/doc/configuration.md b/doc/configuration.md deleted file mode 100644 index 10ba9cac..00000000 --- a/doc/configuration.md +++ /dev/null @@ -1,333 +0,0 @@ -# Configuration - -The following options can be used in the configuration file. - -## Customizing PHP namespaces - -Namespaces of generated PHP classes can be set globally, respectively for entities, enumerations and interfaces (if used -with Doctrine Resolve Target Entity Listener option). - -Example: - -```yaml -namespaces: - entity: "Dunglas\EcommerceBundle\Entity" - enum: "Dunglas\EcommerceBundle\Enum" - interface: "Dunglas\EcommerceBundle\Model" -``` - -Namespaces can also be specified for a specific type. It will take precedence over any globally configured namespace. - -Example: - -```yaml -types: - Thing: - namespaces: - entity: "Dunglas\CoreBundle\Entity" # Namespace for the Thing entity (works for enumerations too) - interface: "Schema\Model" # Namespace of the related interface -``` - -## Forcing a field range - -Schema.org allows a property to have several types. However, the generator allows only one type by property. If not configured, -it will use the first defined type. -The `range` option is useful to set the type of a given property. It can also be used to force a type (even if not in the -Schema.org definition). - -Example: - -```yaml -types: - Brand: - properties: - logo: { range: "ImageObject" } # Force the range of the logo propery to ImageObject (can also be URL according to Schema.org) - - PostalAddress: - properties: - addressCountry: { range: "Text" } # Force the type to Text instead of Country -``` - -## Forcing a field cardinality - -The cardinality of a property is automatically guessed. The `cardinality` option allows to override the guessed value. -Supported cardinalities are: -* `(0..1)`: scalar, not required -* `(0..*)`: array, not required -* `(1..1)`: scalar, required -* `(1..*)`: array, required - -Cardinalities are enforced by the class generator, the Doctrine ORM generator and the Symfony validation generator. - -Example: - -```yaml -types: - Product: - properties: - sku: - cardinality: "(0..1)" -``` - -## Forcing (or disabling) a class parent - -Override the guessed class hierarchy of a given type with this option. - -Example: - -```yaml - ImageObject: - parent: Thing # Force the parent to be Thing instead of CreativeWork > MediaObject - properties: ~ - Drug: - parent: false # No parent -``` - -## Forcing a class to be abstract - -Force a class to be `abstract` (or to be not). - -Example: - -```yaml - Person: - abstract: true -``` - -## Author PHPDoc - -Add a `@author` PHPDoc annotation to class' DocBlock. - -Example: - -```yaml -author: "Kévin Dunglas " -``` - -## Disabling generators and creating custom ones - -By default, all generators except the `DunglasJsonLdApi` one are enabled. You can specify the list of generators to use -with the `generators` option. - -Example (enabling only the PHPDoc generator): - -```yaml -annotationGenerators: - - SchemaOrgModel\AnnotationGenerator\PhpDocAnnotationGenerator -``` - -You can write your generators by implementing the [AnnotationGeneratorInterface](src/SchemaOrgModel/AnnotationGenerator/AnnotationGeneratorInterface). -The [AbstractAnnotationGenerator](src/SchemaOrgModel/AnnotationGenerator/AbstractAnnotationGenerator) provides helper methods -useful when creating your own generators. - -Enabling a custom generator and the PHPDoc generator: - -```yaml -annotationGenerators: - - SchemaOrgModel\AnnotationGenerator\PhpDocAnnotationGenerator - - Acme\Generators\MyGenerator -``` - -## Disabling `id` generator - -By default, the generator add a property called `id` not provided by Schema.org. This useful when using generated entity -with an ORM or an ODM. -This behavior can be disabled with the following setting: - -```yaml -generateId: false -``` - -## Disabling usage of Doctrine collection - -By default, the generator use classes provided by the [Doctrine Collections](https://github.com/doctrine/collections) library -to store collections of entities. This is useful (and required) when using Doctrine ORM or Doctrine ODM. -This behavior can be disabled (to fallback to standard arrays) with the following setting: - -```yaml -doctrine: - useCollection: false -``` - -## Custom field visibility - -Generated fields have a `private` visibility and are exposed through getters and setters. -The default visibility can be changed with the `fieldVisibility` otion. - -Example: - -```yaml -fieldVisibility: "protected" -``` - -## Forcing Doctrine inheritance mapping annotation - -The standard behavior of the generator is to use the `@MappedSuperclass` Doctrine annotation for classes with children and -`@Entity` for classes with no child. - -The inheritance annotation can be forced for a given type like the following: - -```yaml -types: - Product: - doctrine: - inheritanceMapping: "@MappedSuperclass" -``` - -*This setting is only relevant when using the Doctrine ORM generator.* - -## Interfaces and Doctrine Resolve Target Entity Listener - -[`ResolveTargetEntityListener`](http://doctrine-orm.readthedocs.org/en/latest/cookbook/resolve-target-entity-listener.html) -is a feature of Doctrine to keep modules independent. It allows to specify interfaces and `abstract` classes in relation -mappings. - -If you set the option `useInterface` to true, the generator will generate an interface corresponding to each generated -entity and will use them in relation mappings. - -To let PHP Schema generating the XML mapping file usable with Symfony add the following to your config file: - -```yaml -doctrine: - resolveTargetEntityConfigPath: path/to/doctrine.xml -``` - -## Custom schemas - -The generator can use your own schema definitions. They must be wrote in RDFa and follow the format of the [Schema.org's -definition](http://schema.org/docs/schema_org_rdfa.html). This is useful to document your [Schema.org extensions](http://schema.org/docs/extension.html) and use them -to generate the PHP data model of your application. - -Example: - -```yaml -rdfa: - - https://raw.githubusercontent.com/rvguha/schemaorg/master/data/schema.rdfa # Experimental version of Schema.org - - http://example.com/data/myschema.rfa # Additional types -``` - -*Support for other namespaces than `http://schema.org` is planned for future versions but not currently available.* - -## Checking GoodRelation compatibility - -If the `checkIsGoodRelations` option is set to `true`, the generator will emit a warning if an encountered property is not -par of the [GoodRelations](http://www.heppnetz.de/projects/goodrelations/) schema. - -This is useful when generating e-commerce data model. - -## PHP file header - -Prepend all generated PHP files with a custom comment. - -Example: - -```yaml -header: | - /* - * This file is part of the Ecommerce package. - * - * (c) Kévin Dunglas - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -``` - - -## Full configuration reference - -```yaml -# RDFa files to use -rdfa: - - # Default: - - http://schema.org/docs/schema_org_rdfa.html - -# OWL relation files to use -relations: - - # Default: - - http://purl.org/goodrelations/v1.owl - -# Debug mode -debug: false - -# Automatically add an id field to entities -generateId: true - -# Generate interfaces and use Doctrine's Resolve Target Entity feature -useInterface: false - -# Emit a warning if a property is not derived from GoodRelations -checkIsGoodRelations: false - -# A license or any text to use as header of generated files -header: false # Example: // (c) Kévin Dunglas - -# PHP namespaces -namespaces: - - # The namespace of the generated entities - entity: SchemaOrg\Entity # Example: Acme\Entity - - # The namespace of the generated enumerations - enum: SchemaOrg\Enum # Example: Acme\Enum - - # The namespace of the generated interfaces - interface: SchemaOrg\Model # Example: Acme\Model - -# Doctrine -doctrine: - - # Use Doctrine's ArrayCollection instead of standard arrays - useCollection: true - - # The Resolve Target Entity Listener config file pass - resolveTargetEntityConfigPath: null - -# The value of the phpDoc's @author annotation -author: false # Example: Kévin Dunglas - -# Visibility of entities fields -fieldVisibility: ~ # One of "private"; "protected"; "public" - -# Schema.org's types to use -types: - - # Prototype - id: - - # Type namespaces - namespaces: - - # The namespace for the generated class (override any other defined namespace) - class: null - - # The namespace for the generated interface (override any other defined namespace) - interface: null - doctrine: - - # The Doctrine inheritance mapping type (override the guessed one) - inheritanceMapping: null - - # The parent class, set to false for a top level class - parent: null - - # Properties of this type to use - properties: - - # Prototype - id: - - # The property range - range: null # Example: Offer - cardinality: ~ # One of "(0..1)"; "(0..*)"; "(1..1)"; "(1..*)"; "unknown" - -# Annotation generators to use -annotationGenerators: - - # Defaults: - - SchemaOrgModel\AnnotationGenerator\PhpDocAnnotationGenerator - - SchemaOrgModel\AnnotationGenerator\ConstraintAnnotationGenerator - - SchemaOrgModel\AnnotationGenerator\DoctrineOrmAnnotationGenerator -``` \ No newline at end of file diff --git a/doc/getting-started.md b/doc/getting-started.md deleted file mode 100644 index 3a45a83f..00000000 --- a/doc/getting-started.md +++ /dev/null @@ -1,749 +0,0 @@ -# Usage - -## Installation - -Use [Composer](http://getcomposer.org) to install the generator. In standalone mode: - - composer create-project dunglas/php-schema - -Or directly as a development dependency of your project: - - composer require --dev dunglas/php-schema - -If you want to create an API exposing Schema.org types, take a look at [Dunglas's API platform](https://github.com/dunglas/api-platform), -a all-in-one skeleton including PHP Schema and integrated with a ton of other useful packages allowing to generate JSON-LD -REST API in minutes. - -## Model scaffolding - -Start by browsing [Schema.org](http://schema.org) and pick types applicable to your application. The website provides -tons of schemas including (but not limited too) representations of people, organization, event, postal address, creative -work and e-commerce structures. -Then, write a simple YAML config file like the following (here we will generate a data model for an address book): - -`address-book.yml`: - -```yml -rdfa: - - tests/data/schema.rdfa -relations: - - tests/data/v1.owl -# The PHP namespace of generated entities -namespaces: - entity: "AddressBook\Entity" -# The list of types and properties we want to use -types: - # Parent class of Person - Thing: - properties: - name: ~ - Person: - properties: - familyName: ~ - givenName: ~ - additionalName: ~ - gender: ~ - address: ~ - birthDate: ~ - telephone: ~ - email: ~ - url: ~ - jobTitle: ~ - PostalAddress: - # Disable the generation of the class hierarchy for this type - parent: false - properties: - # Force the type of the addressCountry property to text - addressCountry: { range: "Text" } - addressLocality: ~ - addressRegion: ~ - postOfficeBoxNumber: ~ - postalCode: ~ - streetAddress: ~ -``` - -Run the generator with this config file as parameter: - - bin/schema generate-types output-directory/ address-book.yml - -The following classes will be generated: - -`output-directory/AddressBook/Entity/Thing.php`: - -```php -name = $name; - - return $this; - } - - /** - * Gets name. - * - * @return string - */ - public function getName() - { - return $this->name; - } -} - -``` - -`output-directory/AddressBook/Entity/Person.php`: - -```php -id = $id; - - return $this; - } - - /** - * Gets id. - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Sets additionalName. - * - * @param string $additionalName - * @return $this - */ - public function setAdditionalName($additionalName) - { - $this->additionalName = $additionalName; - - return $this; - } - - /** - * Gets additionalName. - * - * @return string - */ - public function getAdditionalName() - { - return $this->additionalName; - } - - /** - * Sets address. - * - * @param PostalAddress $address - * @return $this - */ - public function setAddress(PostalAddress $address) - { - $this->address = $address; - - return $this; - } - - /** - * Gets address. - * - * @return PostalAddress - */ - public function getAddress() - { - return $this->address; - } - - /** - * Sets birthDate. - * - * @param \DateTime $birthDate - * @return $this - */ - public function setBirthDate(\DateTime $birthDate) - { - $this->birthDate = $birthDate; - - return $this; - } - - /** - * Gets birthDate. - * - * @return \DateTime - */ - public function getBirthDate() - { - return $this->birthDate; - } - - /** - * Sets email. - * - * @param string $email - * @return $this - */ - public function setEmail($email) - { - $this->email = $email; - - return $this; - } - - /** - * Gets email. - * - * @return string - */ - public function getEmail() - { - return $this->email; - } - - /** - * Sets familyName. - * - * @param string $familyName - * @return $this - */ - public function setFamilyName($familyName) - { - $this->familyName = $familyName; - - return $this; - } - - /** - * Gets familyName. - * - * @return string - */ - public function getFamilyName() - { - return $this->familyName; - } - - /** - * Sets gender. - * - * @param string $gender - * @return $this - */ - public function setGender($gender) - { - $this->gender = $gender; - - return $this; - } - - /** - * Gets gender. - * - * @return string - */ - public function getGender() - { - return $this->gender; - } - - /** - * Sets givenName. - * - * @param string $givenName - * @return $this - */ - public function setGivenName($givenName) - { - $this->givenName = $givenName; - - return $this; - } - - /** - * Gets givenName. - * - * @return string - */ - public function getGivenName() - { - return $this->givenName; - } - - /** - * Sets jobTitle. - * - * @param string $jobTitle - * @return $this - */ - public function setJobTitle($jobTitle) - { - $this->jobTitle = $jobTitle; - - return $this; - } - - /** - * Gets jobTitle. - * - * @return string - */ - public function getJobTitle() - { - return $this->jobTitle; - } - - /** - * Sets telephone. - * - * @param string $telephone - * @return $this - */ - public function setTelephone($telephone) - { - $this->telephone = $telephone; - - return $this; - } - - /** - * Gets telephone. - * - * @return string - */ - public function getTelephone() - { - return $this->telephone; - } -} - -``` - -`output-directory/AddressBook/Entity/PostalAddress.php`: - -```php -id = $id; - - return $this; - } - - /** - * Gets id. - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Sets addressCountry. - * - * @param string $addressCountry - * @return $this - */ - public function setAddressCountry($addressCountry) - { - $this->addressCountry = $addressCountry; - - return $this; - } - - /** - * Gets addressCountry. - * - * @return string - */ - public function getAddressCountry() - { - return $this->addressCountry; - } - - /** - * Sets addressLocality. - * - * @param string $addressLocality - * @return $this - */ - public function setAddressLocality($addressLocality) - { - $this->addressLocality = $addressLocality; - - return $this; - } - - /** - * Gets addressLocality. - * - * @return string - */ - public function getAddressLocality() - { - return $this->addressLocality; - } - - /** - * Sets addressRegion. - * - * @param string $addressRegion - * @return $this - */ - public function setAddressRegion($addressRegion) - { - $this->addressRegion = $addressRegion; - - return $this; - } - - /** - * Gets addressRegion. - * - * @return string - */ - public function getAddressRegion() - { - return $this->addressRegion; - } - - /** - * Sets postalCode. - * - * @param string $postalCode - * @return $this - */ - public function setPostalCode($postalCode) - { - $this->postalCode = $postalCode; - - return $this; - } - - /** - * Gets postalCode. - * - * @return string - */ - public function getPostalCode() - { - return $this->postalCode; - } - - /** - * Sets postOfficeBoxNumber. - * - * @param string $postOfficeBoxNumber - * @return $this - */ - public function setPostOfficeBoxNumber($postOfficeBoxNumber) - { - $this->postOfficeBoxNumber = $postOfficeBoxNumber; - - return $this; - } - - /** - * Gets postOfficeBoxNumber. - * - * @return string - */ - public function getPostOfficeBoxNumber() - { - return $this->postOfficeBoxNumber; - } - - /** - * Sets streetAddress. - * - * @param string $streetAddress - * @return $this - */ - public function setStreetAddress($streetAddress) - { - $this->streetAddress = $streetAddress; - - return $this; - } - - /** - * Gets streetAddress. - * - * @return string - */ - public function getStreetAddress() - { - return $this->streetAddress; - } -} - -``` - -Note that the generator take care of creating directories corresponding to the namespace structure. - -Without configuration file, the tool will build the entire Schema.org vocabulary. If no properties are specified for a given -type, all its properties will be generated. - -The generator also support enumerations generation. For subclasses of [`Enumeration`](https://schema.org/Enumeration), the -generator will automatically create a class extending the Enum type provided by [myclabs/php-enum](https://github.com/myclabs/php-enum). -Don't forget to install this library in your project. Refer you to PHP Enum documentation to see how to use it. The Symfony -validation annotation generator automatically takes care of enumerations to validate choices values. - -A config file generating an enum class: - -```yml -types: - OfferItemCondition: ~ # The generator will automatically guess that OfferItemCondition is subclass of Enum -``` - -The associated PHP class: - -```php -> + } + ''' + TypeConfiguration: ''' + array{ + exclude: boolean, + vocabularyNamespace: ?string, + abstract: ?boolean, + embeddable: boolean, + namespaces: array{class: ?string, interface: ?string}, + attributes: list>, + parent: false|string, + guessFrom: string, + operations: array>, + allProperties: boolean, + properties: array + } + ''' + Configuration: ''' + array{ + vocabularies: array{uri: string, format: string, allTypes: ?boolean, attributes: list>}[], + vocabularyNamespace: string, + relations: array{uris: string[], defaultCardinality: string}, + debug: boolean, + apiPlatformOldAttributes: boolean, + id: array{generate: boolean, generationStrategy: string, writable: boolean}, + useInterface: boolean, + checkIsGoodRelations: boolean, + header: ?string, + namespaces: array{prefix: ?string, entity: string, enum: string, interface: string}, + uses: array, + doctrine: array{ + useCollection: boolean, + resolveTargetEntityConfigPath: ?string, + resolveTargetEntityConfigType: 'XML'|'yaml', + inheritanceAttributes: list>, + inheritanceType: 'JOINED'|'SINGLE_TABLE'|'SINGLE_COLLECTION'|'TABLE_PER_CLASS'|'COLLECTION_PER_CLASS'|'NONE', + maxIdentifierLength: integer + }, + validator: array{assertType: boolean}, + author: false|string, + fieldVisibility: 'private'|'protected'|'public'|null, + accessorMethods: boolean, + fluentMutatorMethods: boolean, + rangeMapping: array, + allTypes: boolean, + resolveTypes: boolean, + types: array, + annotationGenerators: class-string[], + attributeGenerators: class-string[], + generatorTemplates: string[], + output: string, + openApi: array{file: string} + } + ''' + inferPrivatePropertyTypeFromConstructor: true + ignoreErrors: + # False positive + - '#Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition::children\(\)\.#' diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 00000000..659c34b3 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,24 @@ + + + + + tests + + + + + + src + + + diff --git a/scoper.inc.php b/scoper.inc.php new file mode 100644 index 00000000..c404d2b7 --- /dev/null +++ b/scoper.inc.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +return [ + 'whitelist' => [ + ApiPlatform\Core\Annotation\ApiProperty::class, + ApiPlatform\Core\Annotation\ApiResource::class, + ], + 'patchers' => [ + function (string $filePath, string $prefix, string $content): string { + // + // PHP-CS-Fixer patch + // + + if ('vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php' === $filePath) { + return preg_replace( + '/\$fixerClass = \'PhpCsFixer(.*?\;)/', + sprintf('$fixerClass = \'%s\\PhpCsFixer$1', $prefix), + $content + ); + } + + return $content; + }, + + // TODO: Temporary patch until the issue is fixed upstream + // @link https://github.com/humbug/php-scoper/issues/285 + function (string $filePath, string $prefix, string $content): string { + if (!str_contains($content, '@')) { + return $content; + } + + $regex = sprintf( + '/\'%s\\\\\\\\(@.*?)\'/', + $prefix + ); + + return preg_replace( + $regex, + '\'$1\'', + $content + ); + }, + function (string $filePath, string $prefix, string $content): string { + if (!str_starts_with($filePath, 'src/AnnotationGenerator/')) { + return $content; + } + + $regex = sprintf( + '/\\\\%s(.*?::class)/', + $prefix + ); + + return preg_replace( + $regex, + '$1', + $content + ); + }, + ], +]; diff --git a/src/AnnotationGenerator/AbstractAnnotationGenerator.php b/src/AnnotationGenerator/AbstractAnnotationGenerator.php new file mode 100644 index 00000000..d059763d --- /dev/null +++ b/src/AnnotationGenerator/AbstractAnnotationGenerator.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AnnotationGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Constant; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\String\Inflector\InflectorInterface; + +/** + * Abstract annotation generator. + * + * @author Kévin Dunglas + */ +abstract class AbstractAnnotationGenerator implements AnnotationGeneratorInterface +{ + use LoggerAwareTrait; + + protected PhpTypeConverterInterface $phpTypeConverter; + protected InflectorInterface $inflector; + /** @var Configuration */ + protected array $config; + /** @var Class_[] */ + protected array $classes; + + /** + * @param Configuration $config + * @param Class_[] $classes + */ + public function __construct(PhpTypeConverterInterface $phpTypeConverter, InflectorInterface $inflector, array $config, array $classes) + { + $this->phpTypeConverter = $phpTypeConverter; + $this->inflector = $inflector; + $this->config = $config; + $this->classes = $classes; + } + + public function generateClassAnnotations(Class_ $class): array + { + return []; + } + + public function generateInterfaceAnnotations(Class_ $class): array + { + return []; + } + + public function generateConstantAnnotations(Constant $constant): array + { + return []; + } + + public function generatePropertyAnnotations(Property $property, string $className): array + { + return []; + } + + public function generateGetterAnnotations(Property $property): array + { + return []; + } + + public function generateSetterAnnotations(Property $property): array + { + return []; + } + + public function generateAdderAnnotations(Property $property): array + { + return []; + } + + public function generateRemoverAnnotations(Property $property): array + { + return []; + } + + public function generateUses(Class_ $class): array + { + return []; + } +} diff --git a/src/AnnotationGenerator/AnnotationGeneratorInterface.php b/src/AnnotationGenerator/AnnotationGeneratorInterface.php new file mode 100644 index 00000000..43c4448c --- /dev/null +++ b/src/AnnotationGenerator/AnnotationGeneratorInterface.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AnnotationGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Constant; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Use_; + +/** + * Annotation Generator Interface. + * + * @author Kévin Dunglas + */ +interface AnnotationGeneratorInterface +{ + /** + * Generates class's annotations. + * + * @return string[] + */ + public function generateClassAnnotations(Class_ $class): array; + + /** + * Generates interface's annotations. + * + * @return string[] + */ + public function generateInterfaceAnnotations(Class_ $class): array; + + /** + * Generates constant's annotations. + * + * @return string[] + */ + public function generateConstantAnnotations(Constant $constant): array; + + /** + * Generates field's annotation. + * + * @return string[] + */ + public function generatePropertyAnnotations(Property $property, string $className): array; + + /** + * Generates getter's annotation. + * + * @return string[] + */ + public function generateGetterAnnotations(Property $property): array; + + /** + * Generates setter's annotation. + * + * @return string[] + */ + public function generateSetterAnnotations(Property $property): array; + + /** + * Generates adder's annotation. + * + * @return string[] + */ + public function generateAdderAnnotations(Property $property): array; + + /** + * Generates remover's annotation. + * + * @return string[] + */ + public function generateRemoverAnnotations(Property $property): array; + + /** + * Generates uses. + * + * @return Use_[] + */ + public function generateUses(Class_ $class): array; +} diff --git a/src/AnnotationGenerator/PhpDocAnnotationGenerator.php b/src/AnnotationGenerator/PhpDocAnnotationGenerator.php new file mode 100644 index 00000000..4cfe6390 --- /dev/null +++ b/src/AnnotationGenerator/PhpDocAnnotationGenerator.php @@ -0,0 +1,210 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AnnotationGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Constant; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use League\HTMLToMarkdown\HtmlConverter; +use Symfony\Component\String\Inflector\InflectorInterface; + +/** + * PHPDoc annotation generator. + * + * @author Kévin Dunglas + */ +final class PhpDocAnnotationGenerator extends AbstractAnnotationGenerator +{ + private const INDENT = ' '; + + private HtmlConverter $htmlToMarkdown; + + public function __construct(PhpTypeConverterInterface $phpTypeConverter, InflectorInterface $inflector, array $config, array $classes) + { + parent::__construct($phpTypeConverter, $inflector, $config, $classes); + + $this->htmlToMarkdown = new HtmlConverter(); + } + + public function generateClassAnnotations(Class_ $class): array + { + return $this->generateDoc($class); + } + + public function generateInterfaceAnnotations(Class_ $class): array + { + return $this->generateDoc($class, true); + } + + public function generateConstantAnnotations(Constant $constant): array + { + $annotations = $this->formatDoc($constant->comment(), true); + $annotations[0] = \sprintf('@var string %s', $this->escapePhpDoc($annotations[0])); + + return $annotations; + } + + public function generatePropertyAnnotations(Property $property, string $className): array + { + $description = $this->formatDoc((string) $property->description(), true); + + $annotations = []; + if ($this->isDocUseful($property) && $phpDocType = $this->toPhpDocType($property)) { + $annotations[] = \sprintf('@var %s %s', $phpDocType, $this->escapePhpDoc($description[0])); + } else { + $annotations = $description; + $annotations[] = ''; + } + + if (null !== $property->rdfType()) { + $annotations[] = \sprintf('@see %s', $property->rdfType()); + } + + $annotations[] = ''; + + return $annotations; + } + + public function generateGetterAnnotations(Property $property): array + { + if (!$this->isDocUseful($property)) { + return []; + } + + return [\sprintf('@return %s', $this->toPhpDocType($property))]; + } + + public function generateSetterAnnotations(Property $property): array + { + if (!$this->isDocUseful($property)) { + return []; + } + + return [\sprintf('@param %s $%s', $this->toPhpDocType($property), $property->name())]; + } + + public function generateAdderAnnotations(Property $property): array + { + if (!$this->isDocUseful($property, true)) { + return []; + } + + return [\sprintf('@param %s $%s', $this->toPhpDocType($property, true), $this->inflector->singularize($property->name())[0])]; + } + + public function generateRemoverAnnotations(Property $property): array + { + if (!$this->isDocUseful($property, true)) { + return []; + } + + return [\sprintf('@param %s $%s', $this->toPhpDocType($property, true), $this->inflector->singularize($property->name())[0])]; + } + + private function isDocUseful(Property $property, bool $adderOrRemover = false): bool + { + $typeHint = $adderOrRemover ? $property->adderRemoverTypeHint : $property->typeHint; + + return \in_array($typeHint, [false, 'array', 'Collection'], true); + } + + /** + * Generates class or interface PHPDoc. + * + * @return string[] + */ + private function generateDoc(Class_ $class, bool $interface = false): array + { + $annotations = []; + + if (!$interface && null !== $class->interfaceName()) { + $annotations[] = '{@inheritdoc}'; + $annotations[] = ''; + } else { + if ($class->description()) { + $annotations = $this->formatDoc($class->description()); + $annotations[] = ''; + } + if ($class->rdfType()) { + $annotations[] = \sprintf('@see %s', $class->rdfType()); + } + } + + if ($this->config['author']) { + $annotations[] = \sprintf('@author %s', $this->config['author']); + } + + return $annotations; + } + + /** + * Converts HTML to Markdown and explode. + * + * @return string[] + */ + private function formatDoc(string $doc, bool $indent = false): array + { + $doc = explode("\n", $this->escapePhpDoc($this->htmlToMarkdown->convert($doc))); + + if ($indent) { + $count = \count($doc); + for ($i = 1; $i < $count; ++$i) { + $doc[$i] = self::INDENT.$doc[$i]; + } + } + + return $doc; + } + + protected function toPhpDocType(Property $property, bool $adderOrRemover = false): ?string + { + $suffix = $property->isNullable ? '|null' : ''; + if ($property->isEnum) { + if ($property->isArray()) { + return 'string[]'.$suffix; + } + + return 'string'.$suffix; + } + + if (!$property->reference && null !== $phpDocType = $this->phpTypeConverter->getPhpType($property)) { + if ('array' === $phpDocType && $property->type) { + $phpDocType = $property->type->getPhp(); + } + + return $phpDocType.$suffix; + } + + if (!$property->reference) { + return null; + } + + $phpDocType = $property->reference->interfaceName() ?: $property->reference->name(); + if ($adderOrRemover || !$property->isArray()) { + return $phpDocType.$suffix; + } + + if ($this->config['doctrine']['useCollection']) { + return \sprintf('Collection<%s>%s', $phpDocType, $suffix); + } + + return \sprintf('%s[]%s', $phpDocType, $suffix); + } + + private function escapePhpDoc(string $text): string + { + return str_replace('@', '\\@', $text); + } +} diff --git a/src/AttributeGenerator/AbstractAttributeGenerator.php b/src/AttributeGenerator/AbstractAttributeGenerator.php new file mode 100644 index 00000000..c972a940 --- /dev/null +++ b/src/AttributeGenerator/AbstractAttributeGenerator.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\String\Inflector\InflectorInterface; + +/** + * Abstract attribute generator. + * + * @author Kévin Dunglas + */ +abstract class AbstractAttributeGenerator implements AttributeGeneratorInterface +{ + use LoggerAwareTrait; + + protected PhpTypeConverterInterface $phpTypeConverter; + protected InflectorInterface $inflector; + /** @var Configuration */ + protected array $config; + /** @var Class_[] */ + protected array $classes; + + /** + * @param Configuration $config + * @param Class_[] $classes + */ + public function __construct(PhpTypeConverterInterface $phpTypeConverter, InflectorInterface $inflector, array $config, array $classes) + { + $this->phpTypeConverter = $phpTypeConverter; + $this->inflector = $inflector; + $this->config = $config; + $this->classes = $classes; + } + + public function generateClassAttributes(Class_ $class): array + { + return []; + } + + public function generatePropertyAttributes(Property $property, string $className): array + { + return []; + } + + public function generateLateClassAttributes(Class_ $class): array + { + return []; + } + + public function generateUses(Class_ $class): array + { + return []; + } +} diff --git a/src/AttributeGenerator/ApiPlatformCoreAttributeGenerator.php b/src/AttributeGenerator/ApiPlatformCoreAttributeGenerator.php new file mode 100644 index 00000000..f9bf1f00 --- /dev/null +++ b/src/AttributeGenerator/ApiPlatformCoreAttributeGenerator.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\Core\Annotation\ApiProperty as OldApiProperty; +use ApiPlatform\Core\Annotation\ApiResource as OldApiResource; +use ApiPlatform\Metadata\ApiProperty; +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\Delete; +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\Patch; +use ApiPlatform\Metadata\Post; +use ApiPlatform\Metadata\Put; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Use_; +use Nette\PhpGenerator\Literal; +use Symfony\Component\OptionsResolver\OptionsResolver; + +/** + * Generates API Platform core attributes. + * + * @author Kévin Dunglas + * + * @see https://github.com/api-platform/core + */ +final class ApiPlatformCoreAttributeGenerator extends AbstractAttributeGenerator +{ + public function generateClassAttributes(Class_ $class): array + { + if ($class->hasChild || $class->isEnum()) { + return []; + } + + $arguments = []; + if ($class->name() !== $localName = $class->shortName()) { + $arguments['shortName'] = $localName; + } + + if ($class->rdfType()) { + if ($this->config['apiPlatformOldAttributes']) { + $arguments['iri'] = $class->rdfType(); + } else { + $arguments['types'] = [$class->rdfType()]; + } + } + + if ($class->operations) { + if ($this->config['apiPlatformOldAttributes']) { + $operations = $this->validateClassOperations($class->operations); + foreach ($operations as $operationTarget => $targetOperations) { + $targetArguments = []; + foreach ($targetOperations ?? [] as $method => $methodConfig) { + $methodArguments = []; + if (!is_iterable($methodConfig)) { + continue; + } + foreach ($methodConfig as $key => $value) { + $methodArguments[$key] = $value; + } + $targetArguments[$method] = $methodArguments; + } + $arguments[\sprintf('%sOperations', $operationTarget)] = $targetArguments; + } + } else { + $arguments['operations'] = []; + foreach ($class->operations as $operationMetadataClass => $methodConfig) { + // https://github.com/api-platform/schema-generator/issues/405 + if (\array_key_exists('class', $methodConfig ?? [])) { + /** @var string $operationMetadataClass */ + $operationMetadataClass = $methodConfig['class']; + unset($methodConfig['class']); + } + + $arguments['operations'][] = new Literal(\sprintf('new %s(...?:)', + $operationMetadataClass, + ), [$methodConfig ?? []]); + } + } + } + + return [new Attribute('ApiResource', $arguments)]; + } + + /** + * Verifies that the operations' config is valid. + * + * @template T of array + * + * @param T $operations + * + * @return T + */ + private function validateClassOperations(array $operations): array + { + $resolver = new OptionsResolver(); + $resolver->setDefaults(['item' => [], 'collection' => []]); + $resolver->setAllowedTypes('item', 'array'); + $resolver->setAllowedTypes('collection', 'array'); + + /** + * @var T $operations + */ + $operations = $resolver->resolve($operations); + + return $operations; + } + + public function generatePropertyAttributes(Property $property, string $className): array + { + $arguments = []; + + if ($property->rdfType()) { + if ($this->config['apiPlatformOldAttributes']) { + $arguments['iri'] = $property->rdfType(); + } else { + $arguments['types'] = [$property->rdfType()]; + } + } + + return $property->isCustom ? [] : [new Attribute('ApiProperty', $arguments)]; + } + + public function generateUses(Class_ $class): array + { + if ($this->config['apiPlatformOldAttributes']) { + // @phpstan-ignore-next-line + return [new Use_(OldApiResource::class), new Use_(OldApiProperty::class)]; + } + + return [ + new Use_(ApiResource::class), + new Use_(ApiProperty::class), + new Use_(Get::class), + new Use_(Put::class), + new Use_(Patch::class), + new Use_(Delete::class), + new Use_(GetCollection::class), + new Use_(Post::class), + ]; + } +} diff --git a/src/AttributeGenerator/AttributeGeneratorInterface.php b/src/AttributeGenerator/AttributeGeneratorInterface.php new file mode 100644 index 00000000..bbf8ea8c --- /dev/null +++ b/src/AttributeGenerator/AttributeGeneratorInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Use_; + +/** + * @author Kévin Dunglas + */ +interface AttributeGeneratorInterface +{ + /** + * Generates class's attributes. + * + * @return Attribute[] + */ + public function generateClassAttributes(Class_ $class): array; + + /** + * Generates field's attributes. + * + * @return Attribute[] + */ + public function generatePropertyAttributes(Property $property, string $className): array; + + /** + * Generates class attributes once class and properties attributes for all classes have been generated. + * + * @return Attribute[] + */ + public function generateLateClassAttributes(Class_ $class): array; + + /** + * Generates uses. + * + * @return Use_[] + */ + public function generateUses(Class_ $class): array; +} diff --git a/src/AttributeGenerator/ConfigurationAttributeGenerator.php b/src/AttributeGenerator/ConfigurationAttributeGenerator.php new file mode 100644 index 00000000..e06c2dfb --- /dev/null +++ b/src/AttributeGenerator/ConfigurationAttributeGenerator.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; + +final class ConfigurationAttributeGenerator extends AbstractAttributeGenerator +{ + public function generateClassAttributes(Class_ $class): array + { + $typeAttributes = $this->config['types'][$class->name()]['attributes'] ?? [[]]; + $vocabAttributes = [[]]; + if ($class instanceof SchemaClass) { + $vocabAttributes = $this->config['vocabularies'][$class->resource()->getGraph()->getUri()]['attributes'] ?? [[]]; + } + + $getAttributesNames = static fn (array $config) => $config === [[]] + ? [] + : array_unique(array_map(fn (array $v) => array_keys($v)[0], $config)); + $typeAttributesNames = $getAttributesNames($typeAttributes); + $vocabAttributesNames = $getAttributesNames($vocabAttributes); + + $getAttribute = static fn (string $name, array $args) => new Attribute( + $name, + $args + [ + // An attribute from a vocabulary cannot be appended if a same one has not + // previously been generated or if the same one is not mergeable. + // It allows vocabulary attributes configuration to only merge the attributes args. + 'alwaysGenerate' => !\in_array($name, $vocabAttributesNames, true) + || \in_array($name, $typeAttributesNames, true), + // Custom explicitly configured attributes is not mergeable with next one + // but treated as repeated if given more than once. + 'mergeable' => false, + ] + ); + + $attributes = []; + foreach ($vocabAttributes as $configAttributes) { + foreach ($configAttributes as $attributeName => $attributeArgs) { + if (!\in_array($attributeName, $typeAttributesNames, true)) { + $attributes[] = $getAttribute($attributeName, $attributeArgs ?? []); + } + } + } + foreach ($typeAttributes as $configAttributes) { + foreach ($configAttributes as $attributeName => $attributeArgs) { + $attributes[] = $getAttribute($attributeName, $attributeArgs ?? []); + } + } + + return $attributes; + } + + public function generatePropertyAttributes(Property $property, string $className): array + { + $typeConfig = $this->config['types'][$className] ?? null; + $propertyAttributes = $typeConfig['properties'][$property->name()]['attributes'] ?? [[]]; + + $attributes = []; + foreach ($propertyAttributes as $configAttributes) { + foreach ($configAttributes as $attributeName => $attributeArgs) { + $attributes[] = new Attribute( + $attributeName, + ($attributeArgs ?? []) + ['mergeable' => false] + ); + } + } + + return $attributes; + } + + public function generateUses(Class_ $class): array + { + $uses = []; + foreach ($this->config['uses'] as $useName => $useArgs) { + $uses[] = new Use_($useName, $useArgs['alias'] ?? null); + } + + return $uses; + } +} diff --git a/src/AttributeGenerator/ConstraintAttributeGenerator.php b/src/AttributeGenerator/ConstraintAttributeGenerator.php new file mode 100644 index 00000000..a11c8fe4 --- /dev/null +++ b/src/AttributeGenerator/ConstraintAttributeGenerator.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Use_; +use Nette\PhpGenerator\Literal; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; + +/** + * Constraint attribute generator. + * + * @author Kévin Dunglas + */ +final class ConstraintAttributeGenerator extends AbstractAttributeGenerator +{ + public function generatePropertyAttributes(Property $property, string $className): array + { + if ($property->isId) { + if ('uuid' === $this->config['id']['generationStrategy']) { + return [new Attribute('Assert\Uuid')]; + } + + return []; + } + + $asserts = []; + + if ($property->type && !$property->isArray()) { + switch ((string) $property->type) { + case 'url': + $asserts[] = new Attribute('Assert\Url'); + break; + case 'date': + case 'dateTime': + case 'duration': + case 'time': + $asserts[] = new Attribute('Assert\Type', [new Literal('\DateTimeInterface::class')]); + break; + } + + if ('https://schema.org/email' === $property->rdfType()) { + $asserts[] = new Attribute('Assert\Email'); + } + + if (!$asserts && $this->config['validator']['assertType']) { + $phpType = $this->phpTypeConverter->getPhpType($property, $this->config, []); + if (\in_array($phpType, ['bool', 'float', 'int', 'string'], true)) { + $asserts[] = new Attribute('Assert\Type', [$phpType]); + } + } + } + + if (!$property->isNullable) { + $asserts[] = new Attribute('Assert\NotNull'); + } + + if ($property->isEnum && $property->reference) { + $args = ['callback' => [new Literal(\sprintf('%s::class', $property->reference->name())), 'toArray']]; + + if ($property->isArray()) { + $args['multiple'] = true; + } + + $asserts[] = new Attribute('Assert\Choice', $args); + } + + return $asserts; + } + + public function generateUses(Class_ $class): array + { + if ($class->isEnum()) { + return []; + } + + $uses = []; + $uses[] = new Use_('Symfony\Component\Validator\Constraints', 'Assert'); + $uses[] = new Use_(UniqueEntity::class); + + foreach ($class->properties() as $property) { + if ($property->isEnum && $property->reference) { + $enumName = $property->reference->name(); + $enumClass = $this->classes[$enumName]; + $enumNamespace = $enumClass->namespace ?? $this->config['namespaces']['enum']; + $use = new Use_(\sprintf('%s\%s', $enumNamespace, $enumName)); + + if (!\in_array($use, $uses, true)) { + $uses[] = $use; + } + } + } + + return $uses; + } + + public function generateClassAttributes(Class_ $class): array + { + if ($class->isEnum()) { + return []; + } + + $attributes = []; + + $uniqueProperties = $class->uniquePropertyNames(); + if (!$uniqueProperties) { + return []; + } + + if (1 === \count($uniqueProperties)) { + $attributes[] = new Attribute('UniqueEntity', [$uniqueProperties[0]]); + } else { + $attributes[] = new Attribute('UniqueEntity', ['fields' => $uniqueProperties]); + } + + return $attributes; + } +} diff --git a/src/AttributeGenerator/DoctrineMongoDBAttributeGenerator.php b/src/AttributeGenerator/DoctrineMongoDBAttributeGenerator.php new file mode 100644 index 00000000..ed0ba33e --- /dev/null +++ b/src/AttributeGenerator/DoctrineMongoDBAttributeGenerator.php @@ -0,0 +1,184 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\CompositeType; +use ApiPlatform\SchemaGenerator\Model\Use_; +use Nette\PhpGenerator\Literal; + +use function Symfony\Component\String\u; + +/** + * Doctrine MongoDB attribute generator. + * + * @author Andrew Meshchanchuk > + */ +final class DoctrineMongoDBAttributeGenerator extends AbstractAttributeGenerator +{ + public function generateClassAttributes(Class_ $class): array + { + if ($class->isEnum()) { + return []; + } + + $attributes = []; + if ($class->hasChild && ($inheritanceAttributes = $this->config['doctrine']['inheritanceAttributes'])) { + foreach ($inheritanceAttributes as $configAttributes) { + foreach ($configAttributes as $attributeName => $attributeArgs) { + $attributes[] = new Attribute($attributeName, $attributeArgs ?? []); + } + } + } elseif ($class->isAbstract) { + $attributes[] = new Attribute('MongoDB\MappedSuperclass'); + } elseif ($class->hasChild && $class->isReferencedBy) { + $parentNames = [$class->name()]; + $childNames = []; + while (!empty($parentNames)) { + $directChildren = []; + foreach ($parentNames as $parentName) { + $directChildren = array_merge($directChildren, array_filter($this->classes, fn (Class_ $childClass) => $parentName === $childClass->parent())); + } + $parentNames = array_keys($directChildren); + $childNames = array_merge($childNames, array_keys(array_filter($directChildren, fn (Class_ $childClass) => !$childClass->isAbstract))); + } + $mapNames = array_merge([$class->name()], $childNames); + + $attributes[] = new Attribute('MongoDB\Document'); + $attributes[] = new Attribute('MongoDB\InheritanceType', [\in_array($this->config['doctrine']['inheritanceType'], ['SINGLE_COLLECTION', 'COLLECTION_PER_CLASS', 'NONE'], true) ? $this->config['doctrine']['inheritanceType'] : 'SINGLE_COLLECTION']); + $attributes[] = new Attribute('MongoDB\DiscriminatorField', ['discr']); + $attributes[] = new Attribute('MongoDB\DiscriminatorMap', [array_reduce($mapNames, fn (array $map, string $mapName) => $map + [u($mapName)->camel()->toString() => new Literal(\sprintf('%s::class', $mapName))], [])]); + } else { + $attributes[] = new Attribute('MongoDB\Document'); + } + + return $attributes; + } + + public function generatePropertyAttributes(Property $property, string $className): array + { + if (null === $property->type && null === $property->reference) { + return []; + } + + if ($property->isId) { + return $this->generateIdAttributes(); + } + + $type = null; + if ($property->isEnum) { + $type = $property->isArray() ? 'simple_array' : 'string'; + } elseif (!$property->reference && $property->isArray()) { + $type = 'collection'; + } elseif ($property->type && !$property->reference && !$property->isArray() && null !== ($phpType = $this->phpTypeConverter->getPhpType($property, $this->config, []))) { + if ($property->type instanceof CompositeType) { + $type = 'raw'; + } else { + switch ((string) $property->type) { + case 'time': + $type = 'time'; + break; + case 'dateTime': + $type = 'date'; + break; + default: + $type = $phpType; + switch ($phpType) { + case 'bool': + $type = 'boolean'; + break; + case 'int': + $type = 'integer'; + break; + case '\\'.\DateTimeInterface::class: + $type = 'date'; + break; + case '\\'.\DateInterval::class: + $type = 'string'; + break; + } + break; + } + } + } + + if (null !== $type) { + return [new Attribute('MongoDB\Field', ['type' => $type])]; + } + + if (null === $relationName = $this->getRelationName($property, $className)) { + return []; + } + + if (CardinalitiesExtractor::CARDINALITY_0_1 === $property->cardinality + || CardinalitiesExtractor::CARDINALITY_1_1 === $property->cardinality + || CardinalitiesExtractor::CARDINALITY_N_0 === $property->cardinality + || CardinalitiesExtractor::CARDINALITY_N_1 === $property->cardinality) { + return [new Attribute('MongoDB\ReferenceOne', ['targetDocument' => $relationName])]; + } + + if (CardinalitiesExtractor::CARDINALITY_0_N === $property->cardinality + || CardinalitiesExtractor::CARDINALITY_1_N === $property->cardinality + || CardinalitiesExtractor::CARDINALITY_N_N === $property->cardinality) { + return [new Attribute('MongoDB\ReferenceMany', ['targetDocument' => $relationName])]; + } + + return []; + } + + public function generateUses(Class_ $class): array + { + return $class->isEnum() ? [] : [new Use_('Doctrine\ODM\MongoDB\Mapping\Annotations', 'MongoDB')]; + } + + /** + * Gets class or interface name to use in relations. + */ + private function getRelationName(Property $property, string $className): ?string + { + $reference = $property->reference; + + if (!$reference) { + $this->logger ? $this->logger->error('There is no reference for the property "{property}" from the class "{class}"', ['property' => $property->name(), 'class' => $className]) : null; + + return null; + } + + return $reference->interfaceName() ?: $reference->name(); + } + + /** + * @return Attribute[] + */ + private function generateIdAttributes(): array + { + switch ($this->config['id']['generationStrategy']) { + case 'uuid': + if ($this->config['id']['writable']) { + return [new Attribute('MongoDB\Id', ['strategy' => 'NONE', 'type' => 'bin_uuid'])]; + } + + return [new Attribute('MongoDB\Id', ['strategy' => 'UUID'])]; + case 'auto': + return [new Attribute('MongoDB\Id', ['strategy' => 'INCREMENT'])]; + case 'mongoid': + return [new Attribute('MongoDB\Id')]; + default: + return [new Attribute('MongoDB\Id', ['strategy' => 'NONE', 'type' => 'string'])]; + } + } +} diff --git a/src/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGenerator.php b/src/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGenerator.php new file mode 100644 index 00000000..f36944b7 --- /dev/null +++ b/src/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGenerator.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use Nette\PhpGenerator\Literal; + +final class DoctrineOrmAssociationOverrideAttributeGenerator extends AbstractAttributeGenerator +{ + use GenerateIdentifierNameTrait; + + public function generateLateClassAttributes(Class_ $class): array + { + if ($class->isAbstract || !($parentName = $class->parent())) { + return []; + } + + $attributes = []; + $associationOverrides = []; + + while ($parentName) { + $parent = $this->classes[$parentName] ?? null; + if (!$parent || !$parent->isAbstract) { + $parentName = null; + + continue; + } + + foreach ($parent->properties() as $property) { + if (( + $joinTableAttribute = $property->getAttributeWithName('ORM\JoinTable')) + && \is_string($joinTableName = $joinTableAttribute->args()['name'])) { + $overrideJoinTableName = $this->generateIdentifierName($joinTableName.$class->name(), 'join_table', $this->config); + $overrideArgs = [ + 'name' => $property->name(), + 'joinTable' => new Literal("new ORM\JoinTable(...?:)", [['name' => $overrideJoinTableName]]), + ]; + + $joinColumnAttribute = $property->getAttributeWithName('ORM\JoinColumn'); + $overrideArgs['joinColumns'] = [new Literal("new ORM\JoinColumn(...?:)", [$joinColumnAttribute ? $joinColumnAttribute->args() : []])]; + + $inverseJoinColumnAttribute = $property->getAttributeWithName('ORM\InverseJoinColumn'); + $overrideArgs['inverseJoinColumns'] = [new Literal("new ORM\InverseJoinColumn(...?:)", [$inverseJoinColumnAttribute ? $inverseJoinColumnAttribute->args() : []])]; + + $associationOverrides[] = new Literal( + "new ORM\AssociationOverride(...?:)", + [$overrideArgs] + ); + } + } + + $parentName = $parent->parent(); + } + + if ($associationOverrides) { + $attributes[] = new Attribute('ORM\AssociationOverrides', [$associationOverrides]); + } + + return $attributes; + } +} diff --git a/src/AttributeGenerator/DoctrineOrmAttributeGenerator.php b/src/AttributeGenerator/DoctrineOrmAttributeGenerator.php new file mode 100644 index 00000000..72938ded --- /dev/null +++ b/src/AttributeGenerator/DoctrineOrmAttributeGenerator.php @@ -0,0 +1,296 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\CompositeType; +use ApiPlatform\SchemaGenerator\Model\Use_; +use Nette\PhpGenerator\Literal; + +use function Symfony\Component\String\u; + +/** + * Doctrine attribute generator. + * + * @author Kévin Dunglas + */ +final class DoctrineOrmAttributeGenerator extends AbstractAttributeGenerator +{ + use GenerateIdentifierNameTrait; + + private const RESERVED_KEYWORDS = ['ABORT', 'ABORTSESSION', 'ABS', 'ABSOLUTE', 'ACCESS', 'ACCESSIBLE', 'ACCESS_LOCK', 'ACCOUNT', 'ACOS', 'ACOSH', 'ACTION', 'ADD', 'ADD_MONTHS', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALIAS', 'ALL', 'ALLOCATE', 'ALLOW', 'ALTER', 'ALTERAND', 'AMP', 'ANALYSE', 'ANALYZE', 'AND', 'ANSIDATE', 'ANY', 'ARE', 'ARRAY', 'ARRAY_AGG', 'ARRAY_EXISTS', 'ARRAY_MAX_CARDINALITY', 'AS', 'ASC', 'ASENSITIVE', 'ASIN', 'ASINH', 'ASSERTION', 'ASSOCIATE', 'ASUTIME', 'ASYMMETRIC', 'AT', 'ATAN', 'ATAN2', 'ATANH', 'ATOMIC', 'AUDIT', 'AUTHORIZATION', 'AUX', 'AUXILIARY', 'AVE', 'AVERAGE', 'AVG', 'BACKUP', 'BEFORE', 'BEGIN', 'BEGIN_FRAME', 'BEGIN_PARTITION', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'BOTH', 'BREADTH', 'BREAK', 'BROWSE', 'BT', 'BUFFERPOOL', 'BULK', 'BUT', 'BY', 'BYTE', 'BYTEINT', 'BYTES', 'CALL', 'CALLED', 'CAPTURE', 'CARDINALITY', 'CASCADE', 'CASCADED', 'CASE', 'CASESPECIFIC', 'CASE_N', 'CAST', 'CATALOG', 'CCSID', 'CD', 'CEIL', 'CEILING', 'CHANGE', 'CHAR', 'CHAR2HEXINT', 'CHARACTER', 'CHARACTERS', 'CHARACTER_LENGTH', 'CHARS', 'CHAR_LENGTH', 'CHECK', 'CHECKPOINT', 'CLASS', 'CLASSIFIER', 'CLOB', 'CLONE', 'CLOSE', 'CLUSTER', 'CLUSTERED', 'CM', 'COALESCE', 'COLLATE', 'COLLATION', 'COLLECT', 'COLLECTION', 'COLLID', 'COLUMN', 'COLUMN_VALUE', 'COMMENT', 'COMMIT', 'COMPLETION', 'COMPRESS', 'COMPUTE', 'CONCAT', 'CONCURRENTLY', 'CONDITION', 'CONNECT', 'CONNECTION', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRUCTOR', 'CONTAINS', 'CONTAINSTABLE', 'CONTENT', 'CONTINUE', 'CONVERT', 'CONVERT_TABLE_HEADER', 'COPY', 'CORR', 'CORRESPONDING', 'COS', 'COSH', 'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CREATE', 'CROSS', 'CS', 'CSUM', 'CT', 'CUBE', 'CUME_DIST', 'CURRENT', 'CURRENT_CATALOG', 'CURRENT_DATE', 'CURRENT_DEFAULT_TRANSFORM_GROUP', 'CURRENT_LC_CTYPE', 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_ROW', 'CURRENT_SCHEMA', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', 'CURRENT_USER', 'CURRVAL', 'CURSOR', 'CV', 'CYCLE', 'DATA', 'DATABASE', 'DATABASES', 'DATABLOCKSIZE', 'DATE', 'DATEFORM', 'DAY', 'DAYS', 'DAY_HOUR', 'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DBCC', 'DBINFO', 'DEALLOCATE', 'DEC', 'DECFLOAT', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DEFERRABLE', 'DEFERRED', 'DEFINE', 'DEGREES', 'DEL', 'DELAYED', 'DELETE', 'DENSE_RANK', 'DENY', 'DEPTH', 'DEREF', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC', 'DIAGNOSTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISABLE', 'DISABLED', 'DISALLOW', 'DISCONNECT', 'DISK', 'DISTINCT', 'DISTINCTROW', 'DISTRIBUTED', 'DIV', 'DO', 'DOCUMENT', 'DOMAIN', 'DOUBLE', 'DROP', 'DSSIZE', 'DUAL', 'DUMP', 'DYNAMIC', 'EACH', 'ECHO', 'EDITPROC', 'ELEMENT', 'ELSE', 'ELSEIF', 'EMPTY', 'ENABLED', 'ENCLOSED', 'ENCODING', 'ENCRYPTION', 'END', 'END-EXEC', 'ENDING', 'END_FRAME', 'END_PARTITION', 'EQ', 'EQUALS', 'ERASE', 'ERRLVL', 'ERROR', 'ERRORFILES', 'ERRORTABLES', 'ESCAPE', 'ESCAPED', 'ET', 'EVERY', 'EXCEPT', 'EXCEPTION', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTS', 'EXIT', 'EXP', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALLBACK', 'FALSE', 'FASTEXPORT', 'FENCED', 'FETCH', 'FIELDPROC', 'FILE', 'FILLFACTOR', 'FILTER', 'FINAL', 'FIRST', 'FIRST_VALUE', 'FLOAT', 'FLOAT4', 'FLOAT8', 'FLOOR', 'FOR', 'FORCE', 'FOREIGN', 'FORMAT', 'FOUND', 'FRAME_ROW', 'FREE', 'FREESPACE', 'FREETEXT', 'FREETEXTTABLE', 'FREEZE', 'FROM', 'FULL', 'FULLTEXT', 'FUNCTION', 'FUSION', 'GE', 'GENERAL', 'GENERATED', 'GET', 'GIVE', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRAPHIC', 'GROUP', 'GROUPING', 'GROUPS', 'GT', 'HANDLER', 'HASH', 'HASHAMP', 'HASHBAKAMP', 'HASHBUCKET', 'HASHROW', 'HAVING', 'HELP', 'HIGH_PRIORITY', 'HOLD', 'HOLDLOCK', 'HOST', 'HOUR', 'HOURS', 'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND', 'IDENTIFIED', 'IDENTITY', 'IDENTITYCOL', 'IDENTITY_INSERT', 'IF', 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IN', 'INCLUSIVE', 'INCONSISTENT', 'INCREMENT', 'INDEX', 'INDICATOR', 'INFILE', 'INHERIT', 'INITIAL', 'INITIALIZE', 'INITIALLY', 'INITIATE', 'INNER', 'INOUT', 'INPUT', 'INS', 'INSENSITIVE', 'INSERT', 'INSTEAD', 'INT', 'INT1', 'INT2', 'INT3', 'INT4', 'INT8', 'INTEGER', 'INTEGERDATE', 'INTERSECT', 'INTERSECTION', 'INTERVAL', 'INTO', 'IO_AFTER_GTIDS', 'IO_BEFORE_GTIDS', 'IS', 'ISNULL', 'ISOBID', 'ISOLATION', 'ITERATE', 'JAR', 'JOIN', 'JOURNAL', 'JSON_ARRAY', 'JSON_ARRAYAGG', 'JSON_EXISTS', 'JSON_OBJECT', 'JSON_OBJECTAGG', 'JSON_QUERY', 'JSON_TABLE', 'JSON_TABLE_PRIMITIVE', 'JSON_VALUE', 'KEEP', 'KEY', 'KEYS', 'KILL', 'KURTOSIS', 'LABEL', 'LAG', 'LANGUAGE', 'LARGE', 'LAST', 'LAST_VALUE', 'LATERAL', 'LC_CTYPE', 'LE', 'LEAD', 'LEADING', 'LEAVE', 'LEFT', 'LESS', 'LEVEL', 'LIKE', 'LIKE_REGEX', 'LIMIT', 'LINEAR', 'LINENO', 'LINES', 'LISTAGG', 'LN', 'LOAD', 'LOADING', 'LOCAL', 'LOCALE', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATOR', 'LOCATORS', 'LOCK', 'LOCKING', 'LOCKMAX', 'LOCKSIZE', 'LOG', 'LOG10', 'LOGGING', 'LOGON', 'LONG', 'LONGBLOB', 'LONGTEXT', 'LOOP', 'LOWER', 'LOW_PRIORITY', 'LT', 'MACRO', 'MAINTAINED', 'MAP', 'MASTER_BIND', 'MASTER_SSL_VERIFY_SERVER_CERT', 'MATCH', 'MATCHES', 'MATCH_NUMBER', 'MATCH_RECOGNIZE', 'MATERIALIZED', 'MAVG', 'MAX', 'MAXEXTENTS', 'MAXIMUM', 'MAXVALUE', 'MCHARACTERS', 'MDIFF', 'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', 'MEMBER', 'MERGE', 'METHOD', 'MICROSECOND', 'MICROSECONDS', 'MIDDLEINT', 'MIN', 'MINDEX', 'MINIMUM', 'MINUS', 'MINUTE', 'MINUTES', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MLINREG', 'MLOAD', 'MLSLABEL', 'MOD', 'MODE', 'MODIFIES', 'MODIFY', 'MODULE', 'MONITOR', 'MONRESOURCE', 'MONSESSION', 'MONTH', 'MONTHS', 'MSUBSTR', 'MSUM', 'MULTISET', 'NAMED', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB', 'NE', 'NESTED_TABLE_ID', 'NEW', 'NEW_TABLE', 'NEXT', 'NEXTVAL', 'NO', 'NOAUDIT', 'NOCHECK', 'NOCOMPRESS', 'NONCLUSTERED', 'NONE', 'NORMALIZE', 'NOT', 'NOTNULL', 'NOWAIT', 'NO_WRITE_TO_BINLOG', 'NTH_VALUE', 'NTILE', 'NULL', 'NULLIF', 'NULLIFZERO', 'NULLS', 'NUMBER', 'NUMERIC', 'NUMPARTS', 'OBID', 'OBJECT', 'OBJECTS', 'OCCURRENCES_REGEX', 'OCTET_LENGTH', 'OF', 'OFF', 'OFFLINE', 'OFFSET', 'OFFSETS', 'OLD', 'OLD_TABLE', 'OMIT', 'ON', 'ONE', 'ONLINE', 'ONLY', 'OPEN', 'OPENDATASOURCE', 'OPENQUERY', 'OPENROWSET', 'OPENXML', 'OPERATION', 'OPTIMIZATION', 'OPTIMIZE', 'OPTIMIZER_COSTS', 'OPTION', 'OPTIONALLY', 'OR', 'ORDER', 'ORDINALITY', 'ORGANIZATION', 'OUT', 'OUTER', 'OUTFILE', 'OUTPUT', 'OVER', 'OVERLAPS', 'OVERLAY', 'OVERRIDE', 'PACKAGE', 'PAD', 'PADDED', 'PARAMETER', 'PARAMETERS', 'PART', 'PARTIAL', 'PARTITION', 'PARTITIONED', 'PARTITIONING', 'PASSWORD', 'PATH', 'PATTERN', 'PCTFREE', 'PER', 'PERCENT', 'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PERCENT_RANK', 'PERIOD', 'PERM', 'PERMANENT', 'PIECESIZE', 'PIVOT', 'PLACING', 'PLAN', 'PORTION', 'POSITION', 'POSITION_REGEX', 'POSTFIX', 'POWER', 'PRECEDES', 'PRECISION', 'PREFIX', 'PREORDER', 'PREPARE', 'PRESERVE', 'PREVVAL', 'PRIMARY', 'PRINT', 'PRIOR', 'PRIQTY', 'PRIVATE', 'PRIVILEGES', 'PROC', 'PROCEDURE', 'PROFILE', 'PROGRAM', 'PROPORTIONAL', 'PROTECTION', 'PSID', 'PTF', 'PUBLIC', 'PURGE', 'QUALIFIED', 'QUALIFY', 'QUANTILE', 'QUERY', 'QUERYNO', 'RADIANS', 'RAISERROR', 'RANDOM', 'RANGE', 'RANGE_N', 'RANK', 'RAW', 'READ', 'READS', 'READTEXT', 'READ_WRITE', 'REAL', 'RECONFIGURE', 'RECURSIVE', 'REF', 'REFERENCES', 'REFERENCING', 'REFRESH', 'REGEXP', 'REGR_AVGX', 'REGR_AVGY', 'REGR_COUNT', 'REGR_INTERCEPT', 'REGR_R2', 'REGR_SLOPE', 'REGR_SXX', 'REGR_SXY', 'REGR_SYY', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE', 'REPLICATION', 'REPOVERRIDE', 'REQUEST', 'REQUIRE', 'RESIGNAL', 'RESOURCE', 'RESTART', 'RESTORE', 'RESTRICT', 'RESULT', 'RESULT_SET_LOCATOR', 'RESUME', 'RET', 'RETRIEVE', 'RETURN', 'RETURNING', 'RETURNS', 'REVALIDATE', 'REVERT', 'REVOKE', 'RIGHT', 'RIGHTS', 'RLIKE', 'ROLE', 'ROLLBACK', 'ROLLFORWARD', 'ROLLUP', 'ROUND_CEILING', 'ROUND_DOWN', 'ROUND_FLOOR', 'ROUND_HALF_DOWN', 'ROUND_HALF_EVEN', 'ROUND_HALF_UP', 'ROUND_UP', 'ROUTINE', 'ROW', 'ROWCOUNT', 'ROWGUIDCOL', 'ROWID', 'ROWNUM', 'ROWS', 'ROWSET', 'ROW_NUMBER', 'RULE', 'RUN', 'RUNNING', 'SAMPLE', 'SAMPLEID', 'SAVE', 'SAVEPOINT', 'SCHEMA', 'SCHEMAS', 'SCOPE', 'SCRATCHPAD', 'SCROLL', 'SEARCH', 'SECOND', 'SECONDS', 'SECOND_MICROSECOND', 'SECQTY', 'SECTION', 'SECURITY', 'SECURITYAUDIT', 'SEEK', 'SEL', 'SELECT', 'SEMANTICKEYPHRASETABLE', 'SEMANTICSIMILARITYDETAILSTABLE', 'SEMANTICSIMILARITYTABLE', 'SENSITIVE', 'SEPARATOR', 'SEQUENCE', 'SESSION', 'SESSION_USER', 'SET', 'SETRESRATE', 'SETS', 'SETSESSRATE', 'SETUSER', 'SHARE', 'SHOW', 'SHUTDOWN', 'SIGNAL', 'SIMILAR', 'SIMPLE', 'SIN', 'SINH', 'SIZE', 'SKEW', 'SKIP', 'SMALLINT', 'SOME', 'SOUNDEX', 'SOURCE', 'SPACE', 'SPATIAL', 'SPECIFIC', 'SPECIFICTYPE', 'SPOOL', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLTEXT', 'SQLWARNING', 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', 'SQRT', 'SS', 'SSL', 'STANDARD', 'START', 'STARTING', 'STARTUP', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STAY', 'STDDEV_POP', 'STDDEV_SAMP', 'STEPINFO', 'STOGROUP', 'STORED', 'STORES', 'STRAIGHT_JOIN', 'STRING_CS', 'STRUCTURE', 'STYLE', 'SUBMULTISET', 'SUBSCRIBER', 'SUBSET', 'SUBSTR', 'SUBSTRING', 'SUBSTRING_REGEX', 'SUCCEEDS', 'SUCCESSFUL', 'SUM', 'SUMMARY', 'SUSPEND', 'SYMMETRIC', 'SYNONYM', 'SYSDATE', 'SYSTEM', 'SYSTEM_TIME', 'SYSTEM_USER', 'SYSTIMESTAMP', 'TABLE', 'TABLESAMPLE', 'TABLESPACE', 'TAN', 'TANH', 'TBL_CS', 'TEMPORARY', 'TERMINATE', 'TERMINATED', 'TEXTSIZE', 'THAN', 'THEN', 'THRESHOLD', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'TITLE', 'TO', 'TOP', 'TRACE', 'TRAILING', 'TRAN', 'TRANSACTION', 'TRANSLATE', 'TRANSLATE_CHK', 'TRANSLATE_REGEX', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRIM', 'TRIM_ARRAY', 'TRUE', 'TRUNCATE', 'TRY_CONVERT', 'TSEQUAL', 'TYPE', 'UC', 'UESCAPE', 'UID', 'UNDEFINED', 'UNDER', 'UNDO', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLOCK', 'UNNEST', 'UNPIVOT', 'UNSIGNED', 'UNTIL', 'UPD', 'UPDATE', 'UPDATETEXT', 'UPPER', 'UPPERCASE', 'USAGE', 'USE', 'USER', 'USING', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'VALIDATE', 'VALIDPROC', 'VALUE', 'VALUES', 'VALUE_OF', 'VARBINARY', 'VARBYTE', 'VARCHAR', 'VARCHAR2', 'VARCHARACTER', 'VARGRAPHIC', 'VARIABLE', 'VARIADIC', 'VARIANT', 'VARYING', 'VAR_POP', 'VAR_SAMP', 'VCAT', 'VERBOSE', 'VERSIONING', 'VIEW', 'VIRTUAL', 'VOLATILE', 'VOLUMES', 'WAIT', 'WAITFOR', 'WHEN', 'WHENEVER', 'WHERE', 'WHILE', 'WIDTH_BUCKET', 'WINDOW', 'WITH', 'WITHIN', 'WITHIN_GROUP', 'WITHOUT', 'WLM', 'WORK', 'WRITE', 'WRITETEXT', 'XMLCAST', 'XMLEXISTS', 'XMLNAMESPACES', 'XOR', 'YEAR', 'YEARS', 'YEAR_MONTH', 'ZEROFILL', 'ZEROIFNULL', 'ZONE']; + + public function generateClassAttributes(Class_ $class): array + { + if ($class->isEnum()) { + return []; + } + + if ($class->isEmbeddable) { + return [new Attribute('ORM\Embeddable')]; + } + + $attributes = []; + if ($class->hasChild && ($inheritanceAttributes = $this->config['doctrine']['inheritanceAttributes'])) { + foreach ($inheritanceAttributes as $configAttributes) { + foreach ($configAttributes as $attributeName => $attributeArgs) { + $attributes[] = new Attribute($attributeName, $attributeArgs ?? []); + } + } + } elseif ($class->isAbstract) { + $attributes[] = new Attribute('ORM\MappedSuperclass'); + } elseif ($class->hasChild && $class->isReferencedBy) { + $parentNames = [$class->name()]; + $childNames = []; + while (!empty($parentNames)) { + $directChildren = []; + foreach ($parentNames as $parentName) { + $directChildren = array_merge($directChildren, array_filter($this->classes, fn (Class_ $childClass) => $parentName === $childClass->parent())); + } + $parentNames = array_keys($directChildren); + $childNames = array_merge($childNames, array_keys(array_filter($directChildren, fn (Class_ $childClass) => !$childClass->isAbstract))); + } + $mapNames = array_merge([$class->name()], $childNames); + + $attributes[] = new Attribute('ORM\Entity'); + $attributes[] = new Attribute('ORM\InheritanceType', [\in_array($this->config['doctrine']['inheritanceType'], ['JOINED', 'SINGLE_TABLE', 'TABLE_PER_CLASS', 'NONE'], true) ? $this->config['doctrine']['inheritanceType'] : 'JOINED']); + $attributes[] = new Attribute('ORM\DiscriminatorColumn', ['name' => 'discr']); + $attributes[] = new Attribute('ORM\DiscriminatorMap', [array_reduce($mapNames, fn (array $map, string $mapName) => $map + [u($mapName)->camel()->toString() => new Literal(\sprintf('%s::class', $mapName))], [])]); + } else { + $attributes[] = new Attribute('ORM\Entity'); + } + + foreach (self::RESERVED_KEYWORDS as $keyword) { + if (0 !== strcasecmp($keyword, $class->name())) { + continue; + } + + $attributes[] = new Attribute('ORM\Table', ['name' => \sprintf('`%s`', $this->generateIdentifierName($class->name(), 'table', $this->config))]); + } + + return $attributes; + } + + public function generatePropertyAttributes(Property $property, string $className): array + { + if (null === $property->type && null === $property->reference) { + return []; + } + + if ($property->isId) { + return $this->generateIdAttributes(); + } + + $type = null; + if ($property->isEnum) { + $type = $property->isArray() ? 'simple_array' : 'string'; + } elseif (!$property->reference && $property->isArray()) { + $type = 'json'; + } elseif ($property->type && !$property instanceof CompositeType && !$property->reference && !$property->isArray() && null !== ($phpType = $this->phpTypeConverter->getPhpType($property, $this->config, []))) { + switch ($property->type) { + case 'time': + $type = 'time'; + break; + case 'date': + $type = 'date'; + break; + case 'dateTime': + $type = 'datetime'; + break; + default: + $type = $phpType; + switch ($phpType) { + case 'bool': + $type = 'boolean'; + break; + case 'int': // TODO: use more precise types for int (smallint, bigint...) + $type = 'integer'; + break; + case 'string': + $type = 'text'; + break; + case '\\'.\DateTimeInterface::class: + $type = 'datetime'; + break; + case '\\'.\DateInterval::class: + $type = 'string'; + break; + } + break; + } + } + + if (null !== $type) { + $args = []; + if ('string' !== $type) { + $args['type'] = $type; + } + + if ($property->isNullable) { + $args['nullable'] = true; + } + + if ($property->isUnique) { + $args['unique'] = true; + } + + foreach (self::RESERVED_KEYWORDS as $keyword) { + if (0 === strcasecmp($keyword, $property->name())) { + $args['name'] = \sprintf('`%s`', $property->name()); + break; + } + } + + return [new Attribute('ORM\Column', $args)]; + } + + if (!$property->reference) { + $this->logger ? $this->logger->error('There is no reference for the property "{property}" from the class "{class}"', ['property' => $property->name(), 'class' => $className]) : null; + + return []; + } + + if (null === $relationName = $this->getRelationName($property)) { + return []; + } + + if ($property->isEmbedded) { + return [new Attribute('ORM\Embedded', ['class' => $relationName])]; + } + + $relationTableName = $this->generateIdentifierName($className.ucfirst($property->reference->name()).ucfirst($property->name()), 'join_table', $this->config); + + $attributes = []; + switch ($property->cardinality) { + case CardinalitiesExtractor::CARDINALITY_0_1: + $attributes[] = new Attribute('ORM\OneToOne', ['targetEntity' => $relationName]); + break; + case CardinalitiesExtractor::CARDINALITY_1_1: + $attributes[] = new Attribute('ORM\OneToOne', ['targetEntity' => $relationName]); + $attributes[] = new Attribute('ORM\JoinColumn', ['nullable' => false]); + break; + case CardinalitiesExtractor::CARDINALITY_UNKNOWN: + case CardinalitiesExtractor::CARDINALITY_N_0: + if (null !== $property->inversedBy) { + $attributes[] = new Attribute('ORM\ManyToOne', ['targetEntity' => $relationName, 'inversedBy' => $property->inversedBy]); + } else { + $attributes[] = new Attribute('ORM\ManyToOne', ['targetEntity' => $relationName]); + } + break; + case CardinalitiesExtractor::CARDINALITY_N_1: + if (null !== $property->inversedBy) { + $attributes[] = new Attribute('ORM\ManyToOne', ['targetEntity' => $relationName, 'inversedBy' => $property->inversedBy]); + } else { + $attributes[] = new Attribute('ORM\ManyToOne', ['targetEntity' => $relationName]); + } + $attributes[] = new Attribute('ORM\JoinColumn', ['nullable' => false]); + break; + case CardinalitiesExtractor::CARDINALITY_0_N: + if (null !== $property->mappedBy) { + $attributes[] = new Attribute('ORM\OneToMany', ['targetEntity' => $relationName, 'mappedBy' => $property->mappedBy]); + } else { + $attributes[] = new Attribute('ORM\ManyToMany', ['targetEntity' => $relationName]); + } + $attributes[] = new Attribute('ORM\JoinTable', ['name' => $relationTableName]); + // Self-referencing relation + if ($className === $property->reference->name()) { + $attributes[] = new Attribute('ORM\InverseJoinColumn', ['name' => $this->generateIdentifierName($this->inflector->singularize($property->name())[0].ucfirst($property->reference->name()).'Id', 'inverse_join_column', $this->config), 'unique' => true]); + } else { + $attributes[] = new Attribute('ORM\InverseJoinColumn', ['unique' => true]); + } + break; + case CardinalitiesExtractor::CARDINALITY_1_N: + if (null !== $property->mappedBy) { + $attributes[] = new Attribute('ORM\OneToMany', ['targetEntity' => $relationName, 'mappedBy' => $property->mappedBy]); + } else { + $attributes[] = new Attribute('ORM\ManyToMany', ['targetEntity' => $relationName]); + } + $attributes[] = new Attribute('ORM\JoinTable', ['name' => $relationTableName]); + // Self-referencing relation + if ($className === $property->reference->name()) { + $attributes[] = new Attribute('ORM\InverseJoinColumn', ['name' => $this->generateIdentifierName($this->inflector->singularize($property->name())[0].ucfirst($property->reference->name()).'Id', 'inverse_join_column', $this->config), 'nullable' => false, 'unique' => true]); + } else { + $attributes[] = new Attribute('ORM\InverseJoinColumn', ['nullable' => false, 'unique' => true]); + } + break; + case CardinalitiesExtractor::CARDINALITY_N_N: + $attributes[] = new Attribute('ORM\ManyToMany', ['targetEntity' => $relationName]); + $attributes[] = new Attribute('ORM\JoinTable', ['name' => $relationTableName]); + break; + } + + return $attributes; + } + + public function generateUses(Class_ $class): array + { + return $class->isEnum() ? [] : [new Use_('Doctrine\ORM\Mapping', 'ORM')]; + } + + /** + * @return Attribute[] + */ + private function generateIdAttributes(): array + { + $attributes = [new Attribute('ORM\Id')]; + if ('none' !== $this->config['id']['generationStrategy'] && !$this->config['id']['writable']) { + $attributes[] = new Attribute('ORM\GeneratedValue', ['strategy' => strtoupper($this->config['id']['generationStrategy'])]); + } + + switch ($this->config['id']['generationStrategy']) { + case 'uuid': + $type = 'guid'; + break; + case 'auto': + $type = 'integer'; + break; + default: + $type = 'string'; + break; + } + + $attributes[] = new Attribute('ORM\Column', ['type' => $type]); + + return $attributes; + } + + /** + * Gets class or interface name to use in relations. + */ + private function getRelationName(Property $property): ?string + { + $reference = $property->reference; + + if (!$reference) { + return null; + } + + if (null !== $reference->interfaceName()) { + if (isset($this->config['types'][$reference->name()]['namespaces']['interface'])) { + return \sprintf('%s\\%s', $this->config['types'][$reference->name()]['namespaces']['interface'], $reference->interfaceName()); + } + + return \sprintf('%s\\%s', $this->config['namespaces']['interface'], $reference->interfaceName()); + } + + if (isset($this->config['types'][$reference->name()]['namespaces']['class'])) { + return \sprintf('%s\\%s', $this->config['types'][$reference->name()]['namespaces']['class'], $reference->name()); + } + + return \sprintf('%s\\%s', $this->config['namespaces']['entity'], $reference->name()); + } +} diff --git a/src/AttributeGenerator/GenerateIdentifierNameTrait.php b/src/AttributeGenerator/GenerateIdentifierNameTrait.php new file mode 100644 index 00000000..a638cbf8 --- /dev/null +++ b/src/AttributeGenerator/GenerateIdentifierNameTrait.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\AttributeGenerator; + +use function Symfony\Component\String\u; + +trait GenerateIdentifierNameTrait +{ + /** + * @param Configuration $config + */ + public function generateIdentifierName(string $name, string $defaultName, array $config): string + { + $maxIdentifierLength = $config['doctrine']['maxIdentifierLength']; + + $identifierName = u($name)->snake()->toString(); + + if (\strlen($identifierName) > $maxIdentifierLength) { + $identifierName = $defaultName.'_'.hash('adler32', $name); + if (\strlen($identifierName) > $maxIdentifierLength) { + throw new \RuntimeException('Identifier name with default name exceeds maximum identifier length.'); + } + } + + return $identifierName; + } +} diff --git a/src/CardinalitiesExtractor.php b/src/CardinalitiesExtractor.php new file mode 100644 index 00000000..343b0ee4 --- /dev/null +++ b/src/CardinalitiesExtractor.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; + +/** + * Extracts cardinalities from the OWL definition, from GoodRelations or from Schema.org's comments. + * + * @author Kévin Dunglas + */ +class CardinalitiesExtractor +{ + public const CARDINALITY_0_1 = '(0..1)'; + public const CARDINALITY_0_N = '(0..*)'; + public const CARDINALITY_1_1 = '(1..1)'; + public const CARDINALITY_1_N = '(1..*)'; + public const CARDINALITY_N_0 = '(*..0)'; + public const CARDINALITY_N_1 = '(*..1)'; + public const CARDINALITY_N_N = '(*..*)'; + public const CARDINALITY_UNKNOWN = 'unknown'; + + private GoodRelationsBridge $goodRelationsBridge; + + public function __construct(GoodRelationsBridge $goodRelationsBridge) + { + $this->goodRelationsBridge = $goodRelationsBridge; + } + + /** + * Extracts cardinality of properties. + * + * @param RdfGraph[] $graphs + * + * @return array + */ + public function extract(array $graphs): array + { + $properties = []; + + foreach ($graphs as $graph) { + foreach (TypesGenerator::$propertyTypes as $propertyType) { + /** @var RdfResource $property */ + foreach ($graph->allOfType($propertyType) as $property) { + if ($property->isBNode()) { + continue; + } + + $properties[$property->getUri()] = $this->extractForProperty($property); + } + } + } + + return $properties; + } + + /** + * Extracts the cardinality of a property. + * + * Based on [Geraint Luff work](https://github.com/geraintluff/schema-org-gen). + * + * @return string The cardinality + */ + private function extractForProperty(RdfResource $property): string + { + $minCardinality = $property->get('owl:minCardinality'); + $maxCardinality = $property->get('owl:maxCardinality'); + if (null !== $minCardinality && null !== $maxCardinality && $minCardinality >= 1 && $maxCardinality <= 1) { + return self::CARDINALITY_1_1; + } + + if ((null !== $minCardinality) && $minCardinality >= 1) { + return self::CARDINALITY_1_N; + } + + if ((null !== $maxCardinality) && $maxCardinality <= 1) { + return self::CARDINALITY_0_1; + } + + if ($property->isA('owl:FunctionalProperty')) { + return self::CARDINALITY_0_1; + } + if ($property->isA('owl:InverseFunctionalProperty')) { + return self::CARDINALITY_0_N; + } + + if (!str_starts_with($property->getUri(), 'https://schema.org/')) { + return self::CARDINALITY_UNKNOWN; + } + + if (!\is_string($localName = $property->localName())) { + return self::CARDINALITY_UNKNOWN; + } + + $fromGoodRelations = $this->goodRelationsBridge->extractCardinality($localName); + if (false !== $fromGoodRelations) { + return $fromGoodRelations; + } + + if (!$rdfsComment = $property->get('rdfs:comment')) { + return self::CARDINALITY_UNKNOWN; + } + $comment = $rdfsComment->getValue(); + + if ( + // https://schema.org/acceptedOffer, https://schema.org/acceptedPaymentMethod, https://schema.org/exerciseType + preg_match('/\(s\)/', $comment) + // https://schema.org/follows + || preg_match('/^The most generic uni-directional social relation./', $comment) + || preg_match('/one or more/i', $comment) + ) { + return self::CARDINALITY_0_N; + } + + if ( + preg_match('/^is/', $localName) + || preg_match('/^The /', $comment) + ) { + return self::CARDINALITY_0_1; + } + + return self::CARDINALITY_UNKNOWN; + } +} diff --git a/src/ClassMutator/AnnotationsAppender.php b/src/ClassMutator/AnnotationsAppender.php new file mode 100644 index 00000000..a02b9f78 --- /dev/null +++ b/src/ClassMutator/AnnotationsAppender.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\AnnotationGenerator\AnnotationGeneratorInterface; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use EasyRdf\Resource as RdfResource; + +final class AnnotationsAppender implements ClassMutatorInterface +{ + /** @var Class_[] */ + private array $classes; + /** @var AnnotationGeneratorInterface[] */ + private array $annotationGenerators; + /** @var RdfResource[] */ + private array $typesToGenerate; + + /** + * @param Class_[] $classes + * @param AnnotationGeneratorInterface[] $annotationGenerators + * @param RdfResource[] $typesToGenerate + */ + public function __construct(array $classes, array $annotationGenerators, array $typesToGenerate) + { + $this->annotationGenerators = $annotationGenerators; + $this->classes = $classes; + $this->typesToGenerate = $typesToGenerate; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + $this->generateClassUses($class); + $this->generateClassAnnotations($class); + if (false === isset($this->typesToGenerate[$class->name()])) { + $this->generateInterfaceAnnotations($class); + } + + $this->generateConstantAnnotations($class); + $this->generatePropertiesAnnotations($class); + } + + private function generateClassUses(Class_ $class): void + { + $interfaceNamespace = isset($this->classes[$class->name()]) ? $this->classes[$class->name()]->interfaceNamespace() : null; + if ($interfaceNamespace && $class->interfaceNamespace() !== $class->namespace) { + $class->addUse(new Use_(\sprintf('%s\\%s', $class->interfaceNamespace(), $class->interfaceName()))); + } + + foreach ($class->properties() as $property) { + if ($property->reference && $property->reference->interfaceName()) { + $class->addUse(new Use_(\sprintf( + '%s\\%s', + $property->reference->interfaceNamespace(), + $property->reference->interfaceName() + ))); + } + } + + foreach ($this->annotationGenerators as $generator) { + foreach ($generator->generateUses($class) as $use) { + $class->addUse($use); + } + } + } + + private function generateClassAnnotations(Class_ $class): void + { + foreach ($this->annotationGenerators as $generator) { + foreach ($generator->generateClassAnnotations($class) as $annotation) { + $class->addAnnotation($annotation); + } + } + } + + private function generateConstantAnnotations(Class_ $class): void + { + foreach ($class->constants() as $constant) { + foreach ($this->annotationGenerators as $generator) { + foreach ($generator->generateConstantAnnotations($constant) as $constantAnnotation) { + $constant->addAnnotation($constantAnnotation); + } + } + } + } + + private function generateInterfaceAnnotations(Class_ $class): void + { + foreach ($this->annotationGenerators as $generator) { + foreach ($generator->generateInterfaceAnnotations($class) as $interfaceAnnotation) { + $class->addInterfaceAnnotation($interfaceAnnotation); + } + } + } + + private function generatePropertiesAnnotations(Class_ $class): void + { + foreach ($class->properties() as $property) { + foreach ($this->annotationGenerators as $annotationGenerator) { + foreach ($annotationGenerator->generatePropertyAnnotations($property, $class->name()) as $propertyAnnotation) { + $property->addAnnotation($propertyAnnotation); + } + + foreach ($annotationGenerator->generateGetterAnnotations($property) as $getterAnnotation) { + $property->addGetterAnnotation($getterAnnotation); + } + + if ($property->isArray()) { + foreach ($annotationGenerator->generateAdderAnnotations($property) as $adderAnnotation) { + $property->addAdderAnnotation($adderAnnotation); + } + + foreach ($annotationGenerator->generateRemoverAnnotations($property) as $removerAnnotation) { + $property->addRemoverAnnotation($removerAnnotation); + } + } else { + foreach ($annotationGenerator->generateSetterAnnotations($property) as $setterAnnotation) { + $property->addSetterAnnotation($setterAnnotation); + } + } + } + } + } +} diff --git a/src/ClassMutator/AttributeAppender.php b/src/ClassMutator/AttributeAppender.php new file mode 100644 index 00000000..3388f150 --- /dev/null +++ b/src/ClassMutator/AttributeAppender.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\AttributeGeneratorInterface; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; + +final class AttributeAppender implements ClassMutatorInterface +{ + /** @var Class_[] */ + private array $classes; + /** @var AttributeGeneratorInterface[] */ + private array $attributeGenerators; + + /** + * @param Class_[] $classes + * @param AttributeGeneratorInterface[] $attributeGenerators + */ + public function __construct(array $classes, array $attributeGenerators) + { + $this->attributeGenerators = $attributeGenerators; + $this->classes = $classes; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + $this->generateClassUses($class); + $this->generateClassAttributes($class); + $this->generatePropertiesAttributes($class); + } + + public function appendLate(Class_ $class): void + { + $this->generateLateClassAttributes($class); + } + + private function generateClassUses(Class_ $class): void + { + $interfaceNamespace = isset($this->classes[$class->name()]) ? $this->classes[$class->name()]->interfaceNamespace() : null; + if ($interfaceNamespace && $class->interfaceNamespace() !== $class->namespace) { + $class->addUse(new Use_(\sprintf('%s\\%s', $class->interfaceNamespace(), $class->interfaceName()))); + } + + foreach ($class->properties() as $property) { + if ($property->reference && $property->reference->interfaceName()) { + $class->addUse(new Use_(\sprintf( + '%s\\%s', + $property->reference->interfaceNamespace(), + $property->reference->interfaceName() + ))); + } + } + + foreach ($this->attributeGenerators as $generator) { + foreach ($generator->generateUses($class) as $use) { + $class->addUse($use); + } + } + } + + private function generateClassAttributes(Class_ $class): void + { + foreach ($this->attributeGenerators as $generator) { + foreach ($generator->generateClassAttributes($class) as $attribute) { + $class->addAttribute($attribute); + } + } + } + + private function generatePropertiesAttributes(Class_ $class): void + { + foreach ($class->properties() as $property) { + foreach ($this->attributeGenerators as $attributeGenerator) { + foreach ($attributeGenerator->generatePropertyAttributes($property, $class->name()) as $propertyAttribute) { + $property->addAttribute($propertyAttribute); + } + } + } + } + + private function generateLateClassAttributes(Class_ $class): void + { + foreach ($this->attributeGenerators as $generator) { + foreach ($generator->generateLateClassAttributes($class) as $attribute) { + $class->addAttribute($attribute); + } + } + } +} diff --git a/src/ClassMutator/ClassIdAppender.php b/src/ClassMutator/ClassIdAppender.php new file mode 100644 index 00000000..14b666a4 --- /dev/null +++ b/src/ClassMutator/ClassIdAppender.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\PropertyGenerator\IdPropertyGeneratorInterface; + +final class ClassIdAppender implements ClassMutatorInterface +{ + private IdPropertyGeneratorInterface $idPropertyGenerator; + /** @var Configuration */ + private array $config; + + /** + * @param Configuration $config + */ + public function __construct(IdPropertyGeneratorInterface $idPropertyGenerator, array $config) + { + $this->idPropertyGenerator = $idPropertyGenerator; + $this->config = $config; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + if ( + $class->isEmbeddable + || $class->isEnum() + || $class->hasParent() + ) { + return; + } + + $class->addProperty(($this->idPropertyGenerator)($this->config['id']['generationStrategy'], $this->config['id']['writable'])); + } +} diff --git a/src/ClassMutator/ClassInterfaceMutator.php b/src/ClassMutator/ClassInterfaceMutator.php new file mode 100644 index 00000000..f215fa2b --- /dev/null +++ b/src/ClassMutator/ClassInterfaceMutator.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Interface_; + +final class ClassInterfaceMutator implements ClassMutatorInterface +{ + private string $desiredNamespace; + + public function __construct(string $desiredNamespace) + { + $this->desiredNamespace = $desiredNamespace; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + $class->interface = new Interface_(\sprintf('%sInterface', $class->name()), $this->desiredNamespace); + } +} diff --git a/src/ClassMutator/ClassMutatorInterface.php b/src/ClassMutator/ClassMutatorInterface.php new file mode 100644 index 00000000..ccc16ab4 --- /dev/null +++ b/src/ClassMutator/ClassMutatorInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; + +interface ClassMutatorInterface +{ + // @phpstan-ignore-next-line dynamic context + public function __invoke(Class_ $class, array $context): void; +} diff --git a/src/ClassMutator/ClassParentMutator.php b/src/ClassMutator/ClassParentMutator.php new file mode 100644 index 00000000..a90d1735 --- /dev/null +++ b/src/ClassMutator/ClassParentMutator.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use Psr\Log\LoggerAwareTrait; + +final class ClassParentMutator implements ClassMutatorInterface +{ + use LoggerAwareTrait; + + private PhpTypeConverterInterface $phpTypeConverter; + /** @var Configuration */ + private array $config; + + /** + * @param Configuration $config + */ + public function __construct(array $config, PhpTypeConverterInterface $phpTypeConverter) + { + $this->phpTypeConverter = $phpTypeConverter; + $this->config = $config; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + if (!$class instanceof SchemaClass) { + return; + } + + $typeConfig = $this->config['types'][$class->name()] ?? null; + $class->withParent($typeConfig['parent'] ?? null); + + if (null === $class->parent() && $subclassOf = $class->getSubClassOf()) { + if (\count($subclassOf) > 1) { + $this->logger ? $this->logger->info(\sprintf('The type "%s" has several supertypes. Using the first one.', $class->rdfType())) : null; + } + + if (\is_string($parentLocalName = $subclassOf[0]->localName())) { + $class->withParent($this->phpTypeConverter->escapeIdentifier($parentLocalName)); + } + } + + if ($class->hasParent() && isset($this->config['types'][$class->parent()]['namespaces']['class'])) { + $parentNamespace = $this->config['types'][$class->parent()]['namespaces']['class']; + + if (!$class->isInNamespace($parentNamespace)) { + $class->addUse(new Use_($parentNamespace.'\\'.$class->parent())); + } + } + } +} diff --git a/src/ClassMutator/ClassPropertiesAppender.php b/src/ClassMutator/ClassPropertiesAppender.php new file mode 100644 index 00000000..78d04cda --- /dev/null +++ b/src/ClassMutator/ClassPropertiesAppender.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGeneratorInterface; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Psr\Log\LoggerAwareTrait; + +final class ClassPropertiesAppender implements ClassMutatorInterface +{ + use LoggerAwareTrait; + + private PropertyGeneratorInterface $propertyGenerator; + /** @var array */ + private array $propertiesMap; + /** @var Configuration */ + private array $config; + + private const SCHEMA_ORG_SUPERSEDED_BY = 'schema:supersededBy'; + /** @var string[] */ + private static array $classTypes = [ + 'rdfs:Class', + 'owl:Class', + ]; + + /** + * @param Configuration $config + * @param array $propertiesMap + */ + public function __construct(PropertyGeneratorInterface $propertyGenerator, array $config, array $propertiesMap) + { + $this->propertiesMap = $propertiesMap; + $this->propertyGenerator = $propertyGenerator; + $this->config = $config; + } + + /** + * @param array{graphs: RdfGraph[], cardinalities: array} $context + */ + public function __invoke(Class_ $class, array $context): void + { + if (!$class instanceof SchemaClass) { + return; + } + + $graphs = $context['graphs']; + $cardinalities = $context['cardinalities']; + + $typeConfig = $this->config['types'][$class->name()] ?? null; + + if (null !== $typeConfig && !$typeConfig['allProperties']) { + foreach ($typeConfig['properties'] as $key => $value) { + if ($value['exclude']) { + continue; + } + + foreach ($this->getParentClasses($graphs, $class->resource()) as $typeInHierarchy) { + foreach ($this->propertiesMap[$typeInHierarchy->getUri()] ?? [] as $property) { + if ($key !== $property->localName()) { + continue; + } + + $this->generateField($this->config, $class, $class->resource(), $typeConfig, $cardinalities, $property); + continue 3; + } + } + + $this->generateCustomField($key, $class->resource(), $typeConfig, $cardinalities, $class, $this->config); + } + } else { + $remainingProperties = $typeConfig['properties'] ?? []; + if (!isset($this->propertiesMap[$class->rdfType()])) { + $this->logger ? $this->logger->warning(\sprintf('Properties for "%s" not found in the map.', $class->rdfType())) : null; + } + // All properties + foreach ($this->propertiesMap[$class->rdfType()] ?? [] as $property) { + if (\is_string($property->localName())) { + unset($remainingProperties[$property->localName()]); + } + if ($property->hasProperty(self::SCHEMA_ORG_SUPERSEDED_BY)) { + $supersededBy = $property->get(self::SCHEMA_ORG_SUPERSEDED_BY); + $this->logger ? $this->logger->info(\sprintf('The property "%s" is superseded by "%s". Using the superseding property.', $property->getUri(), $supersededBy->getUri())) : null; + } else { + $this->generateField($this->config, $class, $class->resource(), $typeConfig, $cardinalities, $property); + } + } + + foreach ($remainingProperties as $key => $remainingProperty) { + if ($remainingProperty['exclude']) { + continue; + } + $this->generateCustomField($key, $class->resource(), $typeConfig, $cardinalities, $class, $this->config); + } + } + } + + /** + * Add custom fields (not defined in the vocabulary). + * + * @param ?TypeConfiguration $typeConfig + * @param Configuration $config + * @param array $cardinalities + */ + private function generateCustomField(string $propertyName, RdfResource $type, ?array $typeConfig, array $cardinalities, SchemaClass $class, array $config): void + { + $this->logger ? $this->logger->info(\sprintf('The property "%s" (type "%s") is a custom property.', $propertyName, $type->getUri())) : null; + $customResource = new RdfResource('_:'.$propertyName, new RdfGraph()); + $customResource->add('rdfs:range', $type); + + $this->generateField($config, $class, $type, $typeConfig, $cardinalities, $customResource, true); + } + + /** + * Updates generated $class with given field config. + * + * @param Configuration $config + * @param ?TypeConfiguration $typeConfig + * @param array $cardinalities + */ + private function generateField(array $config, SchemaClass $class, RdfResource $type, ?array $typeConfig, array $cardinalities, RdfResource $typeProperty, bool $isCustom = false): void + { + $property = null; + + if (\is_string($typeProperty->localName())) { + $property = ($this->propertyGenerator)($typeProperty->localName(), $config, $class, ['type' => $type, 'typeConfig' => $typeConfig, 'cardinalities' => $cardinalities, 'property' => $typeProperty], $isCustom); + } + + if ($property) { + $class->addProperty($property); + } + } + + /** + * Gets the parent classes of the current one and add them to $parentClasses array. + * + * @param RdfGraph[] $graphs + * @param RdfResource[] $parentClasses + * + * @return RdfResource[] + */ + private function getParentClasses(array $graphs, RdfResource $resource, array $parentClasses = []): array + { + if ([] === $parentClasses) { + return $this->getParentClasses($graphs, $resource, [$resource]); + } + + $filterBNodes = fn ($parentClasses) => array_filter($parentClasses, fn ($parentClass) => !$parentClass->isBNode()); + if (!$subclasses = $resource->all('rdfs:subClassOf', 'resource')) { + return $filterBNodes($parentClasses); + } + + $parentClassUri = $subclasses[0]->getUri(); + $parentClasses[] = $subclasses[0]; + + foreach ($graphs as $graph) { + foreach (self::$classTypes as $classType) { + foreach ($graph->allOfType($classType) as $type) { + if ($type->getUri() === $parentClassUri) { + return $this->getParentClasses($graphs, $type, $parentClasses); + } + } + } + } + + return $filterBNodes($parentClasses); + } +} diff --git a/src/ClassMutator/ClassPropertiesTypehintMutator.php b/src/ClassMutator/ClassPropertiesTypehintMutator.php new file mode 100644 index 00000000..62e46b90 --- /dev/null +++ b/src/ClassMutator/ClassPropertiesTypehintMutator.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; + +final class ClassPropertiesTypehintMutator implements ClassMutatorInterface +{ + /** @var Class_[] */ + private array $classes; + private PhpTypeConverterInterface $phpTypeConverter; + /** @var Configuration */ + private array $config; + + /** + * @param Configuration $config + * @param Class_[] $classes + */ + public function __construct(PhpTypeConverterInterface $phpTypeConverter, array $config, array $classes) + { + $this->classes = $classes; + $this->phpTypeConverter = $phpTypeConverter; + $this->config = $config; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + foreach ($class->properties() as $property) { + $property->isEnum = $property->isEnum ?: $property->reference && $property->reference->isEnum(); + $property->typeHint = $this->phpTypeConverter->getPhpType( + $property, + $this->config, + $this->classes + ); + + if ($property->type instanceof ArrayType) { + $nonArrayForcedProperty = clone $property; + $nonArrayForcedProperty->type = $property->type->type; + + $property->adderRemoverTypeHint = $this->phpTypeConverter->getPhpType($nonArrayForcedProperty, $this->config, $this->classes); + } + } + } +} diff --git a/src/ClassMutator/EnumClassMutator.php b/src/ClassMutator/EnumClassMutator.php new file mode 100644 index 00000000..a80f63d0 --- /dev/null +++ b/src/ClassMutator/EnumClassMutator.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\ClassMutator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use MyCLabs\Enum\Enum; + +abstract class EnumClassMutator implements ClassMutatorInterface +{ + protected PhpTypeConverterInterface $phpTypeConverter; + private string $desiredNamespace; + + public function __construct(PhpTypeConverterInterface $phpTypeConverter, string $desiredNamespace) + { + $this->phpTypeConverter = $phpTypeConverter; + $this->desiredNamespace = $desiredNamespace; + } + + /** + * @param array{} $context + */ + public function __invoke(Class_ $class, array $context): void + { + $class->namespace = $this->desiredNamespace; + $class + ->withParent('Enum') + ->addUse(new Use_(Enum::class)); + + $this->addEnumConstants($class); + } + + abstract protected function addEnumConstants(Class_ $class): void; +} diff --git a/src/SchemaOrgModel/Command/DumpConfigurationCommand.php b/src/Command/DumpConfigurationCommand.php similarity index 52% rename from src/SchemaOrgModel/Command/DumpConfigurationCommand.php rename to src/Command/DumpConfigurationCommand.php index c0e6e09b..e9b31798 100644 --- a/src/SchemaOrgModel/Command/DumpConfigurationCommand.php +++ b/src/Command/DumpConfigurationCommand.php @@ -1,15 +1,19 @@ * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -namespace SchemaOrgModel\Command; +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Command; -use SchemaOrgModel\TypesGeneratorConfiguration; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -20,26 +24,21 @@ * * @author Kévin Dunglas */ -class DumpConfigurationCommand extends Command +final class DumpConfigurationCommand extends Command { - /** - * {@inheritdoc} - */ - protected function configure() + protected function configure(): void { $this ->setName('dump-configuration') - ->setDescription('Dump configuration') - ; + ->setDescription('Dump configuration'); } - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { - $configuration = new TypesGeneratorConfiguration(); + $configuration = new SchemaGeneratorConfiguration(); $dumper = new YamlReferenceDumper(); $output->writeln($dumper->dump($configuration)); + + return 0; } } diff --git a/src/Command/ExtractCardinalitiesCommand.php b/src/Command/ExtractCardinalitiesCommand.php new file mode 100644 index 00000000..7701f729 --- /dev/null +++ b/src/Command/ExtractCardinalitiesCommand.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Command; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\GoodRelationsBridge; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Extracts cardinalities. + * + * @author Kévin Dunglas + */ +final class ExtractCardinalitiesCommand extends Command +{ + protected function configure(): void + { + $this + ->setName('extract-cardinalities') + ->setDescription('Extract properties\' cardinality') + ->addOption('vocabulary-file', 's', InputOption::VALUE_REQUIRED, 'The path or URL of the vocabulary RDF file to use.', SchemaGeneratorConfiguration::SCHEMA_ORG_URI) + ->addOption('cardinality-file', 'g', InputOption::VALUE_REQUIRED, 'The path or URL of the OWL file containing the cardinality definitions.', SchemaGeneratorConfiguration::GOOD_RELATIONS_URI) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $vocabFile = $input->getOption('vocabulary-file'); + + $relations = []; + $graph = new RdfGraph(); + + $format = pathinfo($vocabFile, \PATHINFO_EXTENSION) ?: 'guess'; + if (str_starts_with($vocabFile, 'http://') || str_starts_with($vocabFile, 'https://')) { + $graph->load($input->getOption('vocabulary-file'), $format); + } else { + $graph->parseFile($input->getOption('vocabulary-file'), $format); + } + + $relations[] = $graph; + + $cardinality = [new \SimpleXMLElement($input->getOption('cardinality-file'), 0, true)]; + + $goodRelationsBridge = new GoodRelationsBridge($cardinality); + $cardinalitiesExtractor = new CardinalitiesExtractor($goodRelationsBridge); + $result = $cardinalitiesExtractor->extract($relations); + + $output->writeln(json_encode($result, \JSON_THROW_ON_ERROR | \JSON_PRETTY_PRINT)); + + return 0; + } +} diff --git a/src/Command/GenerateCommand.php b/src/Command/GenerateCommand.php new file mode 100644 index 00000000..40feae8b --- /dev/null +++ b/src/Command/GenerateCommand.php @@ -0,0 +1,158 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Command; + +use ApiPlatform\SchemaGenerator\OpenApi\Generator as OpenApiGenerator; +use ApiPlatform\SchemaGenerator\Schema\Generator as SchemaGenerator; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Yaml\Parser; + +/** + * Generate entities command. + * + * @author Kévin Dunglas + */ +final class GenerateCommand extends Command +{ + private const DEFAULT_CONFIG_FILE = 'schema.yaml'; + + private ?string $namespacePrefix = null; + private ?string $defaultOutput = null; + + protected function configure(): void + { + $this->readComposer(); + + $this + ->setName('generate') + ->setDescription('Generate the PHP code') + ->addArgument('output', $this->defaultOutput ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The output directory', $this->defaultOutput) + ->addArgument('config', InputArgument::OPTIONAL, 'The config file to use (default to "schema.yaml" in the current directory, will generate all types if no config file exists)'); + } + + private function readComposer(): void + { + if (file_exists('composer.json') && is_file('composer.json') && is_readable('composer.json')) { + if (false === ($composerContent = file_get_contents('composer.json'))) { + throw new \RuntimeException('Cannot read composer.json content.'); + } + $composer = json_decode($composerContent, true, 512, \JSON_THROW_ON_ERROR); + foreach ($composer['autoload']['psr-4'] ?? [] as $prefix => $output) { + if ('' === $prefix) { + continue; + } + + $this->namespacePrefix = $prefix; + $this->defaultOutput = $output; + + break; + } + } + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $defaultOutput = $this->defaultOutput ? realpath($this->defaultOutput) : null; + $outputDir = $input->getArgument('output'); + $configArgument = $input->getArgument('config'); + + if ($dir = realpath($outputDir)) { + if (!is_dir($dir)) { + if (!$defaultOutput) { + throw new \InvalidArgumentException(\sprintf('The file "%s" is not a directory.', $dir)); + } + + $dir = $defaultOutput; + $configArgument = $outputDir; + } + + if (!is_writable($dir)) { + throw new \InvalidArgumentException(\sprintf('The "%s" directory is not writable.', $dir)); + } + + $outputDir = $dir; + } else { + (new Filesystem())->mkdir($outputDir); + $outputDir = realpath($outputDir); + if (!$outputDir) { + throw new \InvalidArgumentException(\sprintf('The "%s" directory cannot be created.', $outputDir)); + } + } + + if ($configArgument) { + if (!file_exists($configArgument)) { + throw new \InvalidArgumentException(\sprintf('The file "%s" doesn\'t exist.', $configArgument)); + } + + if (!is_file($configArgument)) { + throw new \InvalidArgumentException(\sprintf('"%s" isn\'t a file.', $configArgument)); + } + + if (!is_readable($configArgument)) { + throw new \InvalidArgumentException(\sprintf('The file "%s" isn\'t readable.', $configArgument)); + } + + if (false === ($configContent = file_get_contents($configArgument))) { + throw new \RuntimeException(\sprintf('Cannot read "%s" content.', $configArgument)); + } + } elseif (is_readable(self::DEFAULT_CONFIG_FILE)) { + if (false === ($configContent = file_get_contents(self::DEFAULT_CONFIG_FILE))) { + throw new \RuntimeException(\sprintf('Cannot read "%s" content.', self::DEFAULT_CONFIG_FILE)); + } + } else { + if (!$io->askQuestion(new ConfirmationQuestion('Your project has no config file. The entire vocabulary will be imported.'.\PHP_EOL.'Continue?', false))) { + return Command::SUCCESS; + } + $configContent = 'allTypes: true'; + } + + $configuration = $this->processConfiguration($configContent, $outputDir, $dir === $defaultOutput ? $this->namespacePrefix : null); + + (new SchemaGenerator())->generate($configuration, $output, $io); + (new OpenApiGenerator())->generate($configuration, $configArgument ?? self::DEFAULT_CONFIG_FILE, $output, $io); + + return Command::SUCCESS; + } + + /** + * @return Configuration + */ + private function processConfiguration(string $configContent, string $outputDir, ?string $defaultNamespacePrefix): array + { + $parser = new Parser(); + $config = $parser->parse($configContent); + unset($parser); + + $processor = new Processor(); + $configuration = new SchemaGeneratorConfiguration($defaultNamespacePrefix); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = $processor->processConfiguration($configuration, [$config]); + $processedConfiguration['output'] = $outputDir; + if (!$processedConfiguration['output']) { + throw new \RuntimeException('The specified output is invalid.'); + } + + return $processedConfiguration; + } +} diff --git a/src/FilesGenerator.php b/src/FilesGenerator.php new file mode 100644 index 00000000..e35289bd --- /dev/null +++ b/src/FilesGenerator.php @@ -0,0 +1,176 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use Nette\InvalidArgumentException as NetteInvalidArgumentException; +use Nette\PhpGenerator\PhpFile; +use PhpCsFixer\Cache\NullCacheManager; +use PhpCsFixer\Differ\NullDiffer; +use PhpCsFixer\Error\ErrorsManager; +use PhpCsFixer\FixerFactory; +use PhpCsFixer\Linter\Linter; +use PhpCsFixer\RuleSet as LegacyRuleSet; +use PhpCsFixer\RuleSet\RuleSet; +use PhpCsFixer\Runner\Runner; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\Console\Question\ChoiceQuestion; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\String\Inflector\InflectorInterface; +use Twig\Environment; + +final class FilesGenerator +{ + use LoggerAwareTrait; + + private InflectorInterface $inflector; + private Printer $printer; + private Environment $twig; + private Filesystem $filesystem; + private SymfonyStyle $io; + + public function __construct(InflectorInterface $inflector, Printer $printer, Environment $twig, SymfonyStyle $io) + { + $this->inflector = $inflector; + $this->printer = $printer; + $this->twig = $twig; + $this->filesystem = new Filesystem(); + $this->io = $io; + } + + /** + * Generates files. + * + * @param Class_[] $classes + * @param Configuration $config + */ + public function generate(array $classes, array $config): void + { + $interfaceMappings = []; + $generatedFiles = []; + + foreach ($classes as $className => $class) { + $classDir = $this->namespaceToDir($class->namespace, $config); + $this->filesystem->mkdir($classDir); + + $path = \sprintf('%s%s.php', $classDir, $className); + + $file = null; + if (file_exists($path) && is_file($path) && is_readable($path) && $fileContent = file_get_contents($path)) { + $choice = $this->io->askQuestion(new ChoiceQuestion(\sprintf('File "%s" already exists, keep your changes and update it (use) or overwrite it (overwrite)?', $path), ['use', 'overwrite'], 0)); + if ('use' === $choice) { + $file = PhpFile::fromCode($fileContent); + $this->logger ? $this->logger->info(\sprintf('Using "%s" as base file.', $path)) : null; + } + } + + try { + file_put_contents($path, $this->printer->printFile($class->toNetteFile($config, $this->inflector, $file))); + } catch (NetteInvalidArgumentException $exception) { + $this->logger ? $this->logger->warning($exception->getMessage()) : null; + } + + $generatedFiles[] = $path; + + if (null !== $class->interfaceNamespace()) { + $interfaceDir = $this->namespaceToDir($class->interfaceNamespace(), $config); + $this->filesystem->mkdir($interfaceDir); + + $path = \sprintf('%s%s.php', $interfaceDir, $class->interfaceName()); + $generatedFiles[] = $path; + file_put_contents($path, $this->printer->printFile($class->interfaceToNetteFile($config['header'] ?? null))); + + if ($config['doctrine']['resolveTargetEntityConfigPath'] && !$class->isAbstract) { + $interfaceMappings[$class->interfaceNamespace().'\\'.$class->interfaceName()] = $class->namespace.'\\'.$className; + } + } + } + + if ($config['doctrine']['resolveTargetEntityConfigPath'] && \count($interfaceMappings) > 0) { + $file = $config['output'].'/'.$config['doctrine']['resolveTargetEntityConfigPath']; + $dir = \dirname($file); + $this->filesystem->mkdir($dir); + + $fileType = $config['doctrine']['resolveTargetEntityConfigType']; + + $mappingTemplateFile = 'doctrine.xml.twig'; + if ('yaml' === $fileType) { + $mappingTemplateFile = 'doctrine.yaml.twig'; + } + + file_put_contents( + $file, + $this->twig->render($mappingTemplateFile, ['mappings' => $interfaceMappings]) + ); + + $generatedFiles[] = $file; + } + + $this->fixCs($generatedFiles); + } + + /** + * Converts a namespace to a directory path according to PSR-4. + * + * @param Configuration $config + */ + private function namespaceToDir(string $namespace, array $config): string + { + if (null !== ($prefix = $config['namespaces']['prefix'] ?? null) && str_starts_with($namespace, $prefix)) { + $namespace = substr($namespace, \strlen($prefix)); + } + + return \sprintf('%s/%s/', $config['output'], str_replace('\\', '/', $namespace)); + } + + /** + * Uses PHP CS Fixer to make generated files following PSR and Symfony Coding Standards. + * + * @param string[] $files + */ + private function fixCs(array $files): void + { + $fileInfos = []; + foreach ($files as $file) { + $fileInfos[] = new \SplFileInfo($file); + } + + // to keep compatibility with both versions of php-cs-fixer: 2.x and 3.x + // ruleset object must be created depending on which class is available + $rulesetClass = class_exists(LegacyRuleSet::class) ? LegacyRuleSet::class : RuleSet::class; + $fixers = (new FixerFactory()) + ->registerBuiltInFixers() + ->useRuleSet(new $rulesetClass([ // @phpstan-ignore-line + '@PhpCsFixer' => true, + '@Symfony' => true, + 'array_syntax' => ['syntax' => 'short'], + 'phpdoc_order' => true, + 'declare_strict_types' => true, + ])) + ->getFixers(); + + $runner = new Runner( + new \ArrayIterator($fileInfos), + $fixers, + new NullDiffer(), + null, + new ErrorsManager(), + new Linter(), + false, + new NullCacheManager() + ); + $runner->fix(); + } +} diff --git a/src/SchemaOrgModel/GoodRelationsBridge.php b/src/GoodRelationsBridge.php similarity index 57% rename from src/SchemaOrgModel/GoodRelationsBridge.php rename to src/GoodRelationsBridge.php index 81201d05..edc86c74 100644 --- a/src/SchemaOrgModel/GoodRelationsBridge.php +++ b/src/GoodRelationsBridge.php @@ -1,13 +1,17 @@ * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -namespace SchemaOrgModel; +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; /** * Schema.org to GoodRelations bridge. @@ -16,18 +20,16 @@ */ class GoodRelationsBridge { - const GOOD_RELATIONS_NAMESPACE = 'http://purl.org/goodrelations/v1#'; - const RDF_SCHEMA_NAMESPACE = 'http://www.w3.org/2000/01/rdf-schema#'; + private const GOOD_RELATIONS_NAMESPACE = 'http://purl.org/goodrelations/v1#'; + private const RDF_SCHEMA_NAMESPACE = 'http://www.w3.org/2000/01/rdf-schema#'; /** * @var \SimpleXMLElement[] */ - protected $relations; + private array $relations; - /** - * @var array - */ - protected static $objectPropertiesTable = [ + /** @var array */ + private array $objectPropertiesTable = [ 'priceSpecification' => 'hasPriceSpecification', 'businessFunction' => 'hasBusinessFunction', 'eligibleCustomerType' => 'eligibleCustomerTypes', @@ -44,10 +46,9 @@ class GoodRelationsBridge 'warranty' => 'hasWarrantyPromise', 'acceptedPaymentMethod' => 'acceptedPaymentMethods', ]; - /** - * @var array - */ - protected static $datatypePropertiesTable = [ + + /** @var array */ + private array $datatypePropertiesTable = [ 'minPrice' => 'hasMinCurrencyValue', 'unitCode' => 'hasUnitOfMeasurement', 'isicV4' => 'hasISICv4', @@ -76,21 +77,17 @@ public function __construct(array $relations) $this->relations = $relations; foreach ($this->relations as $relation) { - $relation->registerXPathNamespace('rdfs', static::RDF_SCHEMA_NAMESPACE); + $relation->registerXPathNamespace('rdfs', self::RDF_SCHEMA_NAMESPACE); } } /** * Checks if a property exists in GoodRelations. - * - * @param string $id - * - * @return bool */ - public function exist($id) + public function exists(string $id): bool { foreach ($this->relations as $relation) { - $result = $relation->xpath(sprintf('//*[@rdf:about="%s"]', static::getPropertyUrl($id))); + $result = $relation->xpath(\sprintf('//*[@rdf:about="%s"]', $this->getPropertyUrl($id))); if (!empty($result)) { return true; } @@ -102,53 +99,35 @@ public function exist($id) /** * Extracts cardinality from the Good Relations OWL. * - * @param string $id - * - * @return string|bool + * @return string|false */ - public function extractCardinality($id) + public function extractCardinality(string $id) { foreach ($this->relations as $relation) { - $result = $relation->xpath(sprintf('//*[@rdf:about="%s"]/rdfs:label', static::getPropertyUrl($id))); - if (count($result)) { - preg_match('/\(.\.\..\)/', $result[0]->asXML(), $matches); - - return $matches[0]; + $result = $relation->xpath(\sprintf('//*[@rdf:about="%s"]/rdfs:label', $this->getPropertyUrl($id))); + if (!$result) { + continue; } - } - - return false; - } - /** - * Converts Schema.org's id to Good Relations id. - * - * @param string $id - * - * @return string - */ - private static function convertPropertyId($id) - { - if (isset(static::$datatypePropertiesTable[$id])) { - return static::$datatypePropertiesTable[$id]; - } + $xmlResult = $result[0]->asXML(); + if (false === $xmlResult) { + continue; + } + preg_match('/\(.\.\..\)/', $xmlResult, $matches); - if (isset(static::$objectPropertiesTable[$id])) { - return static::$objectPropertiesTable[$id]; + return $matches[0] ?? false; } - return $id; + return false; } /** * Gets a property URL. - * - * @param string $id - * - * @return string */ - private static function getPropertyUrl($id) + private function getPropertyUrl(string $id): string { - return sprintf('%s%s', static::GOOD_RELATIONS_NAMESPACE, static::convertPropertyId($id)); + $propertyId = $this->datatypePropertiesTable[$id] ?? $this->objectPropertiesTable[$id] ?? $id; + + return self::GOOD_RELATIONS_NAMESPACE.$propertyId; } } diff --git a/src/Model/AddAttributeTrait.php b/src/Model/AddAttributeTrait.php new file mode 100644 index 00000000..a30d0d6a --- /dev/null +++ b/src/Model/AddAttributeTrait.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +trait AddAttributeTrait +{ + public function addAttribute(Attribute $attribute): self + { + if (!\in_array($attribute, $this->attributes, true)) { + $previousAttribute = $this->getAttributeWithName($attribute->name()); + if (!$previousAttribute || !$previousAttribute->mergeable) { + if ($attribute->append) { + $this->attributes[] = $attribute; + } + } else { + $this->attributes = array_map( + fn (Attribute $attr) => $attr->name() === $attribute->name() + ? new Attribute($attr->name(), array_merge( + $attr->args(), + $attribute->args(), + ['mergeable' => $attribute->mergeable] + )) + : $attr, + $this->attributes + ); + } + } + + return $this; + } + + public function getAttributeWithName(string $name): ?Attribute + { + return array_values(array_filter( + $this->attributes, + fn (Attribute $attr) => $attr->name() === $name + ))[0] ?? null; + } +} diff --git a/src/Model/Attribute.php b/src/Model/Attribute.php new file mode 100644 index 00000000..cdb47f8b --- /dev/null +++ b/src/Model/Attribute.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use Nette\PhpGenerator\Attribute as NetteAttribute; +use Nette\PhpGenerator\PhpNamespace; + +final class Attribute +{ + use ResolveNameTrait; + + private string $name; + + /** @var (int|bool|string|string[]|string[][]|\Nette\PhpGenerator\Literal|\Nette\PhpGenerator\Literal[]|null)[] */ + private array $args; + + /** + * If this attribute can be appended if a same one has not previously been generated or if the same one is not mergeable? + * + * @see AddAttributeTrait + */ + public bool $append = true; + + /** + * If this attribute mergeable with the next one? + * + * @see AddAttributeTrait + */ + public bool $mergeable = true; + + /** + * @param (int|bool|string|string[]|string[][]|\Nette\PhpGenerator\Literal|\Nette\PhpGenerator\Literal[]|null)[] $args + */ + public function __construct(string $name, array $args = []) + { + $this->name = $name; + + $this->append = (bool) ($args['alwaysGenerate'] ?? true); + $this->mergeable = (bool) ($args['mergeable'] ?? true); + + unset($args['alwaysGenerate'], $args['mergeable']); + + $this->args = $args; + } + + public function name(): string + { + return $this->name; + } + + /** + * @return (int|bool|string|string[]|string[][]|\Nette\PhpGenerator\Literal|\Nette\PhpGenerator\Literal[]|null)[] + */ + public function args(): array + { + return $this->args; + } + + public function toNetteAttribute(PhpNamespace $namespace): NetteAttribute + { + return new NetteAttribute($this->resolveName($namespace, $this->name), $this->args); + } +} diff --git a/src/Model/Class_.php b/src/Model/Class_.php new file mode 100644 index 00000000..d9e87123 --- /dev/null +++ b/src/Model/Class_.php @@ -0,0 +1,380 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use MyCLabs\Enum\Enum as MyCLabsEnum; +use Nette\PhpGenerator\ClassType; +use Nette\PhpGenerator\Helpers; +use Nette\PhpGenerator\Method; +use Nette\PhpGenerator\PhpFile; +use Symfony\Component\String\Inflector\InflectorInterface; + +abstract class Class_ +{ + use AddAttributeTrait; + use ResolveNameTrait; + + protected string $name; + public string $namespace = ''; + /** @var false|string|null */ + private $parent; + public ?Interface_ $interface = null; + /** @var Property[] */ + private array $properties = []; + /** @var Use_[] */ + private array $uses = []; + /** @var Attribute[] */ + private array $attributes = []; + /** @var string[] */ + private array $annotations = []; + /** @var array|Constant[] */ + private array $constants = []; + public bool $hasConstructor = false; + public bool $parentHasConstructor = false; + /** @var Class_[] */ + public array $isReferencedBy = []; + public bool $isAbstract = false; + public bool $hasChild = false; + public bool $isEmbeddable = false; + /** @var array> */ + public array $operations = []; + + /** + * @param false|string|null $parent + */ + public function __construct(string $name, $parent = null) + { + $this->name = $name; + $this->parent = $parent; + } + + public function name(): string + { + return $this->name; + } + + abstract public function description(): ?string; + + abstract public function rdfType(): ?string; + + abstract public function shortName(): string; + + public function isInNamespace(string $namespace): bool + { + return $this->namespace === $namespace; + } + + public function parent(): ?string + { + if (false === $this->parent) { + return ''; + } + + return $this->parent; + } + + public function hasParent(): bool + { + return '' !== $this->parent && null !== $this->parent && false !== $this->parent; + } + + /** + * @param false|string|null $parent + */ + public function withParent($parent): self + { + $this->parent = $parent; + + return $this; + } + + public function interfaceName(): ?string + { + return $this->interface ? $this->interface->name() : null; + } + + public function interfaceNamespace(): ?string + { + return $this->interface ? $this->interface->namespace() : null; + } + + public function interfaceToNetteFile(?string $fileHeader = null): PhpFile + { + if (!$this->interface) { + throw new \LogicException(\sprintf("'%s' has no interface attached.", $this->name)); + } + + return $this->interface->toNetteFile($fileHeader); + } + + /** @return array */ + public function properties(): array + { + return $this->properties; + } + + /** @return array */ + public function uniqueProperties(): array + { + return array_filter($this->properties, static fn (Property $property) => $property->isUnique); + } + + /** @return string[] */ + public function uniquePropertyNames(): array + { + return array_map(static fn (Property $property) => $property->name(), array_values($this->uniqueProperties())); + } + + public function addProperty(Property $property): self + { + $this->properties[$property->name()] = $property; + + return $this; + } + + public function removePropertyByName(string $name): self + { + unset($this->properties[$name]); + + return $this; + } + + public function getPropertyByName(string $name): ?Property + { + return $this->properties[$name] ?? null; + } + + public function hasProperty(string $propertyName): bool + { + return isset($this->properties[$propertyName]); + } + + public function addUse(Use_ $use): self + { + if (!\in_array($use, $this->uses, true)) { + $this->uses[] = $use; + } + + return $this; + } + + public function addAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->annotations, true)) { + $this->annotations[] = $annotation; + } + + return $this; + } + + public function addInterfaceAnnotation(string $annotation): self + { + if (null !== $this->interface) { + $this->interface->addAnnotation($annotation); + } + + return $this; + } + + public function addConstant(string $key, Constant $constant): self + { + $this->constants[$key] = $constant; + + return $this; + } + + /** @return Constant[] */ + public function constants(): array + { + return $this->constants; + } + + abstract public function isEnum(): bool; + + public function isParentEnum(): bool + { + if (!$this->hasParent()) { + return false; + } + + return 'Enum' === $this->parent; + } + + /** + * @param Configuration $config + */ + public function toNetteFile(array $config, InflectorInterface $inflector, ?PhpFile $file = null): PhpFile + { + $useDoctrineCollections = $config['doctrine']['useCollection']; + $useAccessors = $config['accessorMethods']; + $useFluentMutators = $config['fluentMutatorMethods']; + $fileHeader = $config['header'] ?? null; + $fieldVisibility = $config['fieldVisibility']; + + $file ??= new PhpFile(); + if ($fileHeader && !$file->getComment()) { + // avoid nested doc-block for configurations that already have * as delimiter + $file->setComment(Helpers::unformatDocComment($fileHeader)); + } + + $namespace = $file->getNamespaces()[$this->namespace] ?? null; + if (!$namespace) { + $namespace = $file->addNamespace($this->namespace); + } + + foreach ($this->uses as $use) { + $namespace->addUse($use->name(), $use->alias()); + } + + /** @var ?ClassType $class */ + $class = $namespace->getClasses()[$this->name] ?? null; + if (!$class) { + $class = $namespace->addClass($this->name); + } + + $netteAttributes = $class->getAttributes(); + foreach ($this->attributes as $attribute) { + $hasAttribute = false; + foreach ($class->getAttributes() as $netteAttribute) { + if ($netteAttribute->getName() === $this->resolveName($namespace, $attribute->name())) { + $hasAttribute = true; + } + } + if (!$hasAttribute) { + $netteAttributes[] = $attribute->toNetteAttribute($namespace); + } + } + $class->setAttributes(array_values($netteAttributes)); + + if (!$class->getComment()) { + foreach ($this->annotations as $annotation) { + $class->addComment($annotation); + } + } + + $class->setAbstract($this->isAbstract); + + if (null !== $this->interfaceName()) { + $interfaceImplement = $this->resolveName($namespace, $this->interfaceName()); + $implements = $class->getImplements(); + if (!\in_array($interfaceImplement, $implements, true)) { + $implements[] = $interfaceImplement; + } + $class->setImplements($implements); + } + + if ($this->parent() && !$class->getExtends()) { + $parentExtend = $this->resolveName($namespace, $this->parent()); + if ($this->isParentEnum()) { + $parentExtend = MyCLabsEnum::class; + } + + $class->setExtends($parentExtend); + } + + $netteConstants = $class->getConstants(); + foreach ($this->constants as $constant) { + if (!isset($class->getConstants()[$constant->name()])) { + $netteConstants[] = $constant->toNetteConstant(); + } + } + $class->setConstants(array_values($netteConstants)); + + $sortedProperties = isset($this->properties['id']) ? ['id' => $this->properties['id']] + $this->properties : $this->properties; + + $netteProperties = []; + foreach ($class->getProperties() as $netteProperty) { + $hasProperty = false; + foreach ($sortedProperties as $property) { + if ($property->name() === $netteProperty->getName()) { + $hasProperty = true; + } + } + if (!$hasProperty) { + $netteProperties[] = $netteProperty; + } + } + foreach ($sortedProperties as $property) { + $netteProperty = $class->hasProperty($property->name()) ? $class->getProperty($property->name()) : null; + $netteProperties[] = $property->toNetteProperty($namespace, $fieldVisibility, $useDoctrineCollections, $netteProperty); + } + $class->setProperties($netteProperties); + + if ($useDoctrineCollections && $this->hasConstructor && !$class->hasMethod('__construct')) { + $constructor = new Method('__construct'); + if ($this->parentHasConstructor) { + $constructor->addBody('parent::__construct();'); + } + + foreach ($sortedProperties as $property) { + if (!$property->isEnum && 'array' !== $property->typeHint && $property->isArray()) { + $constructor->addBody('$this->? = new ArrayCollection();', [$property->name()]); + } + } + + if ('' !== $constructor->getBody()) { + $class->addMember($constructor); + } + } + + if ($useAccessors) { + $methods = []; + foreach ($sortedProperties as $property) { + foreach ($property->generateNetteMethods(static function ($string) use ($inflector) { + return $inflector->singularize($string)[0]; + }, $namespace, $useDoctrineCollections, $useFluentMutators) as $method) { + $methods[] = $method; + } + } + + $netteMethods = []; + foreach ($class->getMethods() as $netteMethod) { + $hasMethod = false; + foreach ($methods as $method) { + if ($method->getName() === $netteMethod->getName()) { + $hasMethod = true; + } + } + if (!$hasMethod) { + $netteMethods[] = $netteMethod; + } + } + + foreach ($methods as $method) { + if (!$class->hasMethod($method->getName())) { + $netteMethods[] = $method; + continue; + } + $netteMethod = $class->getMethod($method->getName()); + $netteAttributes = $netteMethod->getAttributes(); + foreach ($method->getAttributes() as $attribute) { + $hasAttribute = false; + foreach ($netteMethod->getAttributes() as $netteAttribute) { + if ($netteAttribute->getName() === $attribute->getName()) { + $hasAttribute = true; + } + } + if (!$hasAttribute) { + $netteAttributes[] = $attribute; + } + } + $method->setAttributes($netteAttributes); + $netteMethods[] = $method; + } + $class->setMethods($netteMethods); + } + + return $file; + } +} diff --git a/src/Model/Constant.php b/src/Model/Constant.php new file mode 100644 index 00000000..41833e78 --- /dev/null +++ b/src/Model/Constant.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use Nette\PhpGenerator\ClassType; +use Nette\PhpGenerator\Constant as NetteConstant; + +abstract class Constant +{ + private string $name; + /** @var array */ + private array $annotations = []; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function name(): string + { + return $this->name; + } + + abstract public function value(): string; + + abstract public function comment(): string; + + public function addAnnotation(string $annotation): self + { + if (!\in_array($annotation, $this->annotations, true)) { + $this->annotations[] = $annotation; + } + + return $this; + } + + public function toNetteConstant(): NetteConstant + { + $constant = (new NetteConstant($this->name)) + ->setValue($this->value()) + ->setVisibility(ClassType::VISIBILITY_PUBLIC); + + foreach ($this->annotations as $annotation) { + $constant->addComment($annotation); + } + + return $constant; + } +} diff --git a/src/Model/Interface_.php b/src/Model/Interface_.php new file mode 100644 index 00000000..287d5e43 --- /dev/null +++ b/src/Model/Interface_.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use Nette\PhpGenerator\Helpers; +use Nette\PhpGenerator\PhpFile; + +final class Interface_ +{ + private string $name; + private string $namespace; + /** @var string[] */ + private array $annotations = []; + + public function __construct(string $name, string $namespace) + { + $this->name = $name; + $this->namespace = $namespace; + } + + public function name(): string + { + return $this->name; + } + + public function namespace(): string + { + return $this->namespace; + } + + public function addAnnotation(string $annotation): self + { + if (\in_array($annotation, $this->annotations, true)) { + $this->annotations[] = $annotation; + } + + return $this; + } + + public function toNetteFile(?string $fileHeader = null): PhpFile + { + $file = (new PhpFile()) + ->setStrictTypes(true) + ->setComment(Helpers::unformatDocComment((string) $fileHeader)); + + $namespace = $file->addNamespace($this->namespace); + $namespace->addInterface($this->name); + + return $file; + } +} diff --git a/src/Model/Property.php b/src/Model/Property.php new file mode 100644 index 00000000..977414f0 --- /dev/null +++ b/src/Model/Property.php @@ -0,0 +1,333 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\Model\Type\Type; +use Nette\PhpGenerator\ClassType; +use Nette\PhpGenerator\Method; +use Nette\PhpGenerator\PhpNamespace; +use Nette\PhpGenerator\Property as NetteProperty; +use Nette\PhpGenerator\Visibility; + +abstract class Property +{ + use AddAttributeTrait; + use ResolveNameTrait; + + private string $name; + public string $cardinality; + /** @var ?Type the data types (object is not one) */ + public ?Type $type = null; + + /** @phpstan-ignore-next-line */ + public $defaultValue; + public ?Class_ $reference = null; + public bool $isReadable = true; + public bool $isWritable = true; + public bool $isRequired = false; + public bool $isNullable = true; + public bool $isUnique = false; + public bool $isCustom = false; + public bool $isEmbedded = false; + public ?string $mappedBy = null; + public ?string $inversedBy = null; + public bool $isId = false; + public ?string $typeHint = null; + public bool $isEnum = false; + public ?string $adderRemoverTypeHint = null; + /** @var string[] */ + public array $groups = []; + /** @var Attribute[] */ + private array $attributes = []; + /** @var string[] */ + private array $annotations = []; + /** @var string[] */ + private array $getterAnnotations = []; + /** @var string[] */ + private array $setterAnnotations = []; + /** @var string[] */ + private array $adderAnnotations = []; + /** @var string[] */ + private array $removerAnnotations = []; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function name(): string + { + return $this->name; + } + + abstract public function description(): ?string; + + abstract public function rdfType(): ?string; + + public function isArray(): bool + { + return $this->type instanceof ArrayType; + } + + public function addAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->annotations, true)) { + $this->annotations[] = $annotation; + } + + return $this; + } + + public function addGetterAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->getterAnnotations, true)) { + $this->getterAnnotations[] = $annotation; + } + + return $this; + } + + public function addSetterAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->setterAnnotations, true)) { + $this->setterAnnotations[] = $annotation; + } + + return $this; + } + + public function addAdderAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->adderAnnotations, true)) { + $this->adderAnnotations[] = $annotation; + } + + return $this; + } + + /** + * @return string[] + */ + public function adderAnnotations(): array + { + return $this->adderAnnotations; + } + + public function addRemoverAnnotation(string $annotation): self + { + if ('' === $annotation || !\in_array($annotation, $this->removerAnnotations, true)) { + $this->removerAnnotations[] = $annotation; + } + + return $this; + } + + public function markAsCustom(): self + { + $this->isCustom = true; + + return $this; + } + + /** + * @param 'private'|'protected'|'public'|null $visibility + */ + public function toNetteProperty(PhpNamespace $namespace, ?string $visibility = null, bool $useDoctrineCollections = true, ?NetteProperty $property = null): NetteProperty + { + $property ??= new NetteProperty($this->name); + + $property->setVisibility($visibility ?? Visibility::Private); + + if ($this->typeHint) { + $property->setType($this->resolveName($namespace, $this->typeHint)); + } + + if (!$this->isArray() || $this->isTypeHintedAsCollection()) { + $property->setNullable($this->isNullable); + } + + if (null !== $default = $this->defaultValue) { + $property->setValue($default); + } elseif (-1 !== $default = $this->guessDefaultGeneratedValue($useDoctrineCollections)) { + $property->setValue($default); + } + + $netteAttributes = $property->getAttributes(); + foreach ($this->attributes as $attribute) { + $hasAttribute = false; + foreach ($property->getAttributes() as $netteAttribute) { + if ($netteAttribute->getName() === $this->resolveName($namespace, $attribute->name())) { + $hasAttribute = true; + } + } + if (!$hasAttribute) { + $netteAttributes[] = $attribute->toNetteAttribute($namespace); + } + } + $property->setAttributes($netteAttributes); + + if (!$property->getComment()) { + foreach ($this->annotations as $annotation) { + $property->addComment($annotation); + } + } + + return $property; + } + + /** + * @return Method[] + */ + public function generateNetteMethods( + \Closure $singularize, + PhpNamespace $namespace, + bool $useDoctrineCollections = true, + bool $useFluentMutators = false, + ): array { + return array_merge( + $this->generateMutators($singularize, $namespace, $useDoctrineCollections, $useFluentMutators), + $this->isReadable ? [$this->generateGetter($namespace)] : [] + ); + } + + private function generateGetter(PhpNamespace $namespace): Method + { + if (!$this->isReadable) { + throw new \LogicException(\sprintf("Property '%s' is not readable.", $this->name)); + } + + $getter = (new Method('get'.ucfirst($this->name)))->setVisibility(ClassType::VISIBILITY_PUBLIC); + foreach ($this->getterAnnotations as $annotation) { + $getter->addComment($annotation); + } + if ($this->typeHint) { + $getter->setReturnType($this->resolveName($namespace, $this->typeHint)); + if ($this->isNullable && !$this->isArray()) { + $getter->setReturnNullable(); + } + } + $getter->setBody('return $this->?;', [$this->name()]); + + return $getter; + } + + /** + * @return Method[] + */ + private function generateMutators( + \Closure $singularize, + PhpNamespace $namespace, + bool $useDoctrineCollections = true, + bool $useFluentMutators = false, + ): array { + if (!$this->isWritable) { + return []; + } + + $mutators = []; + if ($this->isArray()) { + $singularProperty = $singularize($this->name()); + + $adder = (new Method('add'.ucfirst($singularProperty)))->setVisibility(ClassType::VISIBILITY_PUBLIC); + $adder->setReturnType($useFluentMutators ? 'self' : 'void'); + foreach ($this->adderAnnotations() as $annotation) { + $adder->addComment($annotation); + } + $parameter = $adder->addParameter($singularProperty); + if ($this->typeHint && !$this->isEnum) { + $parameter->setType($this->adderRemoverTypeHint ? $this->resolveName($namespace, $this->adderRemoverTypeHint) : $this->adderRemoverTypeHint); + } + $adder->addBody( + \sprintf('$this->%s[] = %s;', $this->name(), ($this->isEnum ? '(string) ' : '')."$$singularProperty") + ); + if ($useFluentMutators) { + $adder->addBody(''); + $adder->addBody('return $this;'); + } + $mutators[] = $adder; + + $remover = (new Method('remove'.ucfirst($singularProperty)))->setVisibility(ClassType::VISIBILITY_PUBLIC); + $remover->setReturnType($useFluentMutators ? 'self' : 'void'); + foreach ($this->removerAnnotations as $annotation) { + $adder->addComment($annotation); + } + $parameter = $remover->addParameter($singularProperty); + if ($this->typeHint) { + $parameter->setType($this->adderRemoverTypeHint ? $this->resolveName($namespace, $this->adderRemoverTypeHint) : $this->adderRemoverTypeHint); + } + + if ($useDoctrineCollections && $this->typeHint && 'array' !== $this->typeHint && !$this->isEnum) { + $remover->addBody(\sprintf( + '$this->%s->removeElement(%s);', + $this->name(), + "$$singularProperty" + )); + } else { + $remover->addBody(\sprintf(<<<'PHP' +if (false !== $key = array_search(%s, %s, true)) { + unset($this->%s[$key]); +} +PHP, + ($this->isEnum ? '(string)' : '').'$'.$singularProperty, '$this->'.$this->name().($this->isNullable ? ' ?? []' : ''), $this->name())); + } + + if ($useFluentMutators) { + $remover->addBody(''); + $remover->addBody('return $this;'); + } + + $mutators[] = $remover; + } else { + $setter = (new Method('set'.ucfirst($this->name())))->setVisibility(ClassType::VISIBILITY_PUBLIC); + $setter->setReturnType($useFluentMutators ? 'self' : 'void'); + foreach ($this->setterAnnotations as $annotation) { + $setter->addComment($annotation); + } + $setter->addParameter($this->name()) + ->setType($this->typeHint ? $this->resolveName($namespace, $this->typeHint) : $this->typeHint) + ->setNullable($this->isNullable); + + $setter->addBody('$this->? = $?;', [$this->name(), $this->name()]); + if ($useFluentMutators) { + $setter->addBody(''); + $setter->addBody('return $this;'); + } + $mutators[] = $setter; + } + + return $mutators; + } + + /** + * @return array{}|int|null + */ + private function guessDefaultGeneratedValue(bool $useDoctrineCollections = true) + { + if (($this->isEnum || !$this->typeHint || 'array' === $this->typeHint || !$useDoctrineCollections) && $this->isArray() && !$this->isTypeHintedAsCollection()) { + return []; + } + + if ($this->isNullable) { + return null; + } + + return -1; + } + + private function isTypeHintedAsCollection(): bool + { + return 'Collection' === $this->typeHint; + } +} diff --git a/src/Model/ResolveNameTrait.php b/src/Model/ResolveNameTrait.php new file mode 100644 index 00000000..b1bc97e2 --- /dev/null +++ b/src/Model/ResolveNameTrait.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +use Nette\PhpGenerator\PhpNamespace; + +/** + * BC layer for the resolveName method of PhpNamespace. + */ +trait ResolveNameTrait +{ + private function resolveName(PhpNamespace $namespace, string $name): string + { + if (method_exists(PhpNamespace::class, 'resolveName')) { // @phpstan-ignore-line + return $namespace->resolveName($name); + } + + return $name; + } +} diff --git a/src/Model/Type/ArrayType.php b/src/Model/Type/ArrayType.php new file mode 100644 index 00000000..f6e496d1 --- /dev/null +++ b/src/Model/Type/ArrayType.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model\Type; + +final class ArrayType implements Type +{ + public ?Type $type; + + public function __construct(?Type $type = null) + { + $this->type = $type; + } + + public function __toString(): string + { + if ($this->type instanceof CompositeType) { + return '('.$this->type.')[]'; + } + + return $this->type ? $this->type.'[]' : 'array'; + } + + public function getPhp(): string + { + if ($this->type instanceof CompositeType) { + return '('.$this->type.')[]'; + } + + return $this->type ? $this->type.'[]' : 'array'; + } +} diff --git a/src/Model/Type/CompositeType.php b/src/Model/Type/CompositeType.php new file mode 100644 index 00000000..538742f0 --- /dev/null +++ b/src/Model/Type/CompositeType.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model\Type; + +interface CompositeType extends Type +{ +} diff --git a/src/Model/Type/PrimitiveType.php b/src/Model/Type/PrimitiveType.php new file mode 100644 index 00000000..dd06776f --- /dev/null +++ b/src/Model/Type/PrimitiveType.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model\Type; + +final class PrimitiveType implements Type +{ + public string $name; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function __toString(): string + { + return $this->name; + } + + public function getPhp(): string + { + return $this->name; + } +} diff --git a/src/Model/Type/Type.php b/src/Model/Type/Type.php new file mode 100644 index 00000000..8d4139fc --- /dev/null +++ b/src/Model/Type/Type.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model\Type; + +interface Type +{ + public function __toString(): string; + + public function getPhp(): string; +} diff --git a/src/Model/Type/UnionType.php b/src/Model/Type/UnionType.php new file mode 100644 index 00000000..3fd09c86 --- /dev/null +++ b/src/Model/Type/UnionType.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model\Type; + +final class UnionType implements CompositeType +{ + /** @var Type[] */ + public array $types; + + /** + * @param Type[] $types + */ + public function __construct(array $types) + { + $this->types = $types; + } + + public function __toString(): string + { + return implode('|', array_map(fn (Type $type) => $type instanceof CompositeType ? '('.$type.')' : $type, $this->types)); + } + + public function getPhp(): string + { + // Deduplicate PHP types. + $phpTypes = []; + foreach ($this->types as $type) { + $phpTypes[$type->getPhp()] = $type; + } + + return implode('|', array_map(fn (Type $type) => $type instanceof CompositeType ? '('.$type->getPhp().')' : $type->getPhp(), $phpTypes)); + } +} diff --git a/src/Model/Use_.php b/src/Model/Use_.php new file mode 100644 index 00000000..849146a7 --- /dev/null +++ b/src/Model/Use_.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Model; + +final class Use_ +{ + private string $name; + + private ?string $alias; + + public function __construct(string $name, ?string $alias = null) + { + $this->name = $name; + $this->alias = $alias; + } + + public function name(): string + { + return $this->name; + } + + public function alias(): ?string + { + return $this->alias; + } +} diff --git a/src/OpenApi/ClassGenerator.php b/src/OpenApi/ClassGenerator.php new file mode 100644 index 00000000..49ea5ca6 --- /dev/null +++ b/src/OpenApi/ClassGenerator.php @@ -0,0 +1,293 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\ClassMutator\AnnotationsAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\AttributeAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassIdAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassInterfaceMutator; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassPropertiesTypehintMutator; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\OpenApi\ClassMutator\EnumClassMutator as OpenApiEnumClassMutator; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Class_ as OpenApiClass; +use ApiPlatform\SchemaGenerator\OpenApi\PropertyGenerator\IdPropertyGenerator; +use ApiPlatform\SchemaGenerator\OpenApi\PropertyGenerator\PropertyGenerator; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGeneratorInterface; +use cebe\openapi\spec\OpenApi; +use cebe\openapi\spec\RequestBody; +use cebe\openapi\spec\Schema; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\String\Inflector\InflectorInterface; + +use function Symfony\Component\String\u; + +final class ClassGenerator +{ + use LoggerAwareTrait; + use SchemaTraversalTrait; + + private InflectorInterface $inflector; + private PhpTypeConverterInterface $phpTypeConverter; + private PropertyGeneratorInterface $propertyGenerator; + + public function __construct(InflectorInterface $inflector, PhpTypeConverterInterface $phpTypeConverter) + { + $this->inflector = $inflector; + $this->phpTypeConverter = $phpTypeConverter; + $this->propertyGenerator = new PropertyGenerator(); + } + + /** + * @param Configuration $config + * + * @return Class_[] + */ + public function generate(OpenApi $openApi, array $config): array + { + /** @var OpenApiClass[] $classes */ + $classes = []; + + foreach ($openApi->paths as $path => $pathItem) { + // Matches only paths like /books/{id}. + // Subresources and collection-only resources are not handled yet. + if (!preg_match('@^[^{}]+/{[^{}]+}/?$@', $path)) { + continue; + } + + $explodedPath = explode('/', rtrim($path, '/')); + $pathResourceName = $explodedPath[\count($explodedPath) - 2]; + $collectionResourceName = $this->inflector->pluralize($this->inflector->singularize($pathResourceName)[0])[0]; + $name = $this->inflector->singularize(u($pathResourceName)->camel()->title()->toString())[0]; + + $showOperation = $pathItem->get; + $editOperation = $pathItem->put ?? $pathItem->patch; + if (null === $showOperation && null === $editOperation) { + $this->logger ? $this->logger->warning(\sprintf('No get, put or patch operation found for path "%s"', $path)) : null; + continue; + } + + $showSchema = null; + if ($showOperation && $showOperation->responses && null !== $responseSchema = ($showOperation->responses[200]->content['application/json']->schema ?? null)) { + $this->logger ? $this->logger->info(\sprintf('Using show schema from get operation response for "%s" resource.', $name)) : null; + $showSchema = $responseSchema; + } + if (!$showSchema && $openApi->components && isset($openApi->components->schemas[$name])) { + $this->logger ? $this->logger->info(\sprintf('Using "%s" show schema from components.', $name)) : null; + $showSchema = $openApi->components->schemas[$name]; + } + $editSchema = null; + if ($editOperation && $editOperation->requestBody instanceof RequestBody && null !== $requestBodySchema = ($editOperation->requestBody->content['application/json']->schema ?? null)) { + $this->logger ? $this->logger->info(\sprintf('Using edit schema from put operation request body for "%s" resource.', $name)) : null; + $editSchema = $requestBodySchema; + } + if (null === $showSchema && null === $editSchema) { + $this->logger ? $this->logger->warning(\sprintf('No schema found for path "%s"', $path)) : null; + continue; + } + + $showClass = null; + if ($showSchema instanceof Schema) { + $showClass = $this->buildClassFromSchema($showSchema, $name, $config); + $classes = array_merge($this->buildEnumClasses($showSchema, $showClass, $config), $classes); + } + $editClass = null; + if ($editSchema instanceof Schema) { + $editClass = $this->buildClassFromSchema($editSchema, $name, $config); + $classes = array_merge($this->buildEnumClasses($editSchema, $editClass, $config), $classes); + } + $class = $showClass ?? $editClass; + if (!$class) { + continue; + } + if ($showClass && $editClass) { + $class = $this->mergeClasses($showClass, $editClass); + } + + $putOperation = $pathItem->put; + $patchOperation = $pathItem->patch; + $deleteOperation = $pathItem->delete; + $pathCollection = $openApi->paths->getPath(\sprintf('/%s', $collectionResourceName)); + $listOperation = $pathCollection->get ?? null; + $createOperation = $pathCollection->post ?? null; + $class->operations = array_merge( + $showOperation ? ['Get' => null] : [], + $putOperation ? ['Put' => null] : [], + $patchOperation ? ['Patch' => null] : [], + $deleteOperation ? ['Delete' => null] : [], + $listOperation ? ['GetCollection' => null] : [], + $createOperation ? ['Post' => null] : [], + ); + + $classes[$name] = $class; + } + + // Second pass + $useInterface = $config['useInterface']; + $generateId = $config['id']['generate']; + foreach ($classes as $class) { + if ($useInterface) { + (new ClassInterfaceMutator($config['namespaces']['interface']))($class, []); + } + + if ($generateId) { + (new ClassIdAppender(new IdPropertyGenerator(), $config))($class, []); + } + + // Try to guess the references from the property names. + foreach ($class->properties() as $property) { + if ($reference = $classes[preg_replace('/Ids?$/', '', $this->inflector->singularize(u($property->name())->title()->toString())[0])] ?? null) { + $property->reference = $reference; + $property->cardinality = $property->isNullable ? CardinalitiesExtractor::CARDINALITY_0_1 : CardinalitiesExtractor::CARDINALITY_1_1; + if ($property->isArray()) { + $property->cardinality = $property->isNullable ? CardinalitiesExtractor::CARDINALITY_0_N : CardinalitiesExtractor::CARDINALITY_1_N; + } + } + } + } + + // Third pass + foreach ($classes as $class) { + (new ClassPropertiesTypehintMutator($this->phpTypeConverter, $config, $classes))($class, []); + + // Try to guess the mapped by from the references + foreach ($class->properties() as $property) { + if ($property->reference && $property->isArray()) { + $mappedByName = strtolower($class->name()); + foreach ($property->reference->properties() as $referenceProperty) { + if ($mappedByName === $referenceProperty->name()) { + $property->mappedBy = $mappedByName; + } + } + } + } + } + + // Initialize annotation generators + $annotationGenerators = []; + foreach ($config['annotationGenerators'] as $annotationGenerator) { + $generator = new $annotationGenerator($this->phpTypeConverter, $this->inflector, $config, $classes); + if (method_exists($generator, 'setLogger')) { + $generator->setLogger($this->logger); + } + + $annotationGenerators[] = $generator; + } + + // Initialize attribute generators + $attributeGenerators = []; + foreach ($config['attributeGenerators'] as $attributeGenerator) { + $generator = new $attributeGenerator($this->phpTypeConverter, $this->inflector, $config, $classes); + if (method_exists($generator, 'setLogger')) { + $generator->setLogger($this->logger); + } + + $attributeGenerators[] = $generator; + } + + $attributeAppender = new AttributeAppender($classes, $attributeGenerators); + foreach ($classes as $class) { + (new AnnotationsAppender($classes, $annotationGenerators, []))($class, []); + $attributeAppender($class, []); + } + foreach ($classes as $class) { + $attributeAppender->appendLate($class); + } + + return $classes; + } + + /** + * @param Configuration $config + */ + private function buildClassFromSchema(Schema $schema, string $name, array $config): OpenApiClass + { + $class = new OpenApiClass($name); + + $class->namespace = $config['namespaces']['entity']; + + if ($schema->description) { + $class->setDescription($schema->description); + } + if ($schema->externalDocs) { + $class->setRdfType($schema->externalDocs->url); + } + + $schemaProperties = []; + foreach ($this->getSchemaItem($schema) as $schemaItem) { + $schemaProperties = array_merge($schemaProperties, $schemaItem->properties); + } + + foreach ($schemaProperties as $propertyName => $schemaProperty) { + \assert($schemaProperty instanceof Schema); + $property = ($this->propertyGenerator)($propertyName, $config, $class, ['schema' => $schema, 'property' => $schemaProperty]); + if ($property) { + $class->addProperty($property); + } + } + + if ($config['doctrine']['useCollection']) { + $class->addUse(new Use_(ArrayCollection::class)); + $class->addUse(new Use_(Collection::class)); + } + + return $class; + } + + /** + * @param Configuration $config + * + * @return OpenApiClass[] + */ + private function buildEnumClasses(Schema $schema, OpenApiClass $class, array $config): array + { + $enumClasses = []; + + foreach ($schema->properties as $propertyName => $schemaProperty) { + \assert($schemaProperty instanceof Schema); + if ($schemaProperty->enum) { + $name = $class->name().u($propertyName)->camel()->title()->toString(); + + $enumClass = new OpenApiClass($name); + (new OpenApiEnumClassMutator( + $this->phpTypeConverter, + $config['namespaces']['enum'], + $schemaProperty->enum + ))($enumClass, []); + $enumClasses[$name] = $enumClass; + + if ($classProperty = $class->getPropertyByName($propertyName)) { + $classProperty->reference = $enumClass; + } + } + } + + return $enumClasses; + } + + private function mergeClasses(OpenApiClass $classA, OpenApiClass $classB): OpenApiClass + { + foreach ($classB->properties() as $propertyB) { + if (!$classA->getPropertyByName($propertyB->name())) { + $classA->addProperty($propertyB); + } + } + + return $classA; + } +} diff --git a/src/OpenApi/ClassMutator/EnumClassMutator.php b/src/OpenApi/ClassMutator/EnumClassMutator.php new file mode 100644 index 00000000..caf45d90 --- /dev/null +++ b/src/OpenApi/ClassMutator/EnumClassMutator.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\ClassMutator; + +use ApiPlatform\SchemaGenerator\ClassMutator\EnumClassMutator as BaseEnumClassMutator; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Constant as OpenApiConstant; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; + +use function Symfony\Component\String\u; + +final class EnumClassMutator extends BaseEnumClassMutator +{ + /** @var string[] */ + private array $values; + + /** + * @param string[] $values + */ + public function __construct(PhpTypeConverterInterface $phpTypeConverter, string $desiredNamespace, array $values) + { + parent::__construct($phpTypeConverter, $desiredNamespace); + + $this->values = $values; + } + + protected function addEnumConstants(Class_ $class): void + { + foreach ($this->values as $value) { + $class->addConstant($value, new OpenApiConstant( + $this->phpTypeConverter->escapeIdentifier(u($value)->snake()->upper()->toString()), + $value + )); + } + } +} diff --git a/src/OpenApi/Generator.php b/src/OpenApi/Generator.php new file mode 100644 index 00000000..929a933f --- /dev/null +++ b/src/OpenApi/Generator.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi; + +use ApiPlatform\SchemaGenerator\FilesGenerator; +use ApiPlatform\SchemaGenerator\Printer; +use ApiPlatform\SchemaGenerator\TwigBuilder; +use cebe\openapi\Reader as OpenApiReader; +use Symfony\Component\Console\Logger\ConsoleLogger; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Filesystem\Path; +use Symfony\Component\String\Inflector\EnglishInflector; + +final class Generator +{ + /** + * @param Configuration $configuration + */ + public function generate(array $configuration, string $configurationPath, OutputInterface $output, SymfonyStyle $io): void + { + if (!$openApiFile = $configuration['openApi']['file']) { + return; + } + $configurationDirectory = Path::getDirectory($configurationPath); + $openApiFilePath = Path::join($configurationDirectory, $openApiFile); + if (!$openApiFileRealPath = realpath($openApiFilePath)) { + throw new \InvalidArgumentException(\sprintf('The file "%s" isn\'t readable.', $openApiFilePath)); + } + $extension = Path::getExtension($openApiFileRealPath); + if ('json' === $extension) { + $openApi = OpenApiReader::readFromJsonFile($openApiFileRealPath); + } else { + $openApi = OpenApiReader::readFromYamlFile($openApiFileRealPath); + } + + $inflector = new EnglishInflector(); + + $logger = new ConsoleLogger($output); + + $classGenerator = new ClassGenerator($inflector, new PhpTypeConverter()); + $classGenerator->setLogger($logger); + $classes = $classGenerator->generate($openApi, $configuration); + + $twig = (new TwigBuilder())->build($configuration); + + $filesGenerator = new FilesGenerator($inflector, new Printer(), $twig, $io); + $filesGenerator->setLogger($logger); + $filesGenerator->generate($classes, $configuration); + } +} diff --git a/src/OpenApi/Model/Class_.php b/src/OpenApi/Model/Class_.php new file mode 100644 index 00000000..9f3e1a90 --- /dev/null +++ b/src/OpenApi/Model/Class_.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\Model; + +use ApiPlatform\SchemaGenerator\Model\Class_ as BaseClass_; + +final class Class_ extends BaseClass_ +{ + private ?string $description = null; + + private ?string $rdfType = null; + + public function description(): ?string + { + return $this->description; + } + + public function setDescription(string $description): void + { + $this->description = $description; + } + + public function rdfType(): ?string + { + return $this->rdfType; + } + + public function setRdfType(string $rdfType): void + { + $this->rdfType = $rdfType; + } + + public function shortName(): string + { + return $this->name; + } + + public function isEnum(): bool + { + return false; + } +} diff --git a/src/OpenApi/Model/Constant.php b/src/OpenApi/Model/Constant.php new file mode 100644 index 00000000..f1561f1f --- /dev/null +++ b/src/OpenApi/Model/Constant.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\Model; + +use ApiPlatform\SchemaGenerator\Model\Constant as BaseConstant; + +final class Constant extends BaseConstant +{ + private string $value; + + public function __construct(string $name, string $value) + { + parent::__construct($name); + + $this->value = $value; + } + + public function value(): string + { + return $this->value; + } + + public function comment(): string + { + return ''; + } +} diff --git a/src/OpenApi/Model/Property.php b/src/OpenApi/Model/Property.php new file mode 100644 index 00000000..0af182c1 --- /dev/null +++ b/src/OpenApi/Model/Property.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\Model; + +use ApiPlatform\SchemaGenerator\Model\Property as BaseProperty; + +final class Property extends BaseProperty +{ + private ?string $description = null; + + private ?string $rdfType = null; + + public function description(): ?string + { + return $this->description; + } + + public function setDescription(string $description): void + { + $this->description = $description; + } + + public function rdfType(): ?string + { + return $this->rdfType; + } + + public function setRdfType(string $rdfType): void + { + $this->rdfType = $rdfType; + } +} diff --git a/src/OpenApi/Model/Type/PrimitiveType.php b/src/OpenApi/Model/Type/PrimitiveType.php new file mode 100644 index 00000000..4f8603e8 --- /dev/null +++ b/src/OpenApi/Model/Type/PrimitiveType.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\Model\Type; + +use ApiPlatform\SchemaGenerator\Model\Type\Type; + +final class PrimitiveType implements Type +{ + public string $name; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function __toString(): string + { + return $this->name; + } + + public function getPhp(): string + { + /* @see https://swagger.io/specification/#data-types */ + switch ($this->name) { + case 'integer': + return 'int'; + case 'boolean': + return 'bool'; + case 'float': + case 'double': + return 'float'; + case 'date': + case 'dateTime': + return '\\'.\DateTimeInterface::class; + default: + return 'string'; + } + } +} diff --git a/src/OpenApi/PhpTypeConverter.php b/src/OpenApi/PhpTypeConverter.php new file mode 100644 index 00000000..d8315d69 --- /dev/null +++ b/src/OpenApi/PhpTypeConverter.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi; + +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; + +final class PhpTypeConverter implements PhpTypeConverterInterface +{ + public function getPhpType(Property $property, array $config = [], array $classes = []): string + { + if ($property->reference && $property->isArray()) { + return ($config['doctrine']['useCollection'] ?? false) ? 'Collection' : 'array'; + } + + if ($property->reference && !$property->isArray()) { + return $property->reference->name(); + } + + if ($property->isArray()) { + return 'array'; + } + + if (!$property->type) { + return 'string'; + } + + return $property->type->getPhp(); + } + + public function escapeIdentifier(string $identifier): string + { + foreach (self::RESERVED_KEYWORDS as $keyword) { + if (0 === strcasecmp($keyword, $identifier)) { + return $identifier.'_'; + } + } + + return $identifier; + } +} diff --git a/src/OpenApi/PropertyGenerator/IdPropertyGenerator.php b/src/OpenApi/PropertyGenerator/IdPropertyGenerator.php new file mode 100644 index 00000000..830f2c77 --- /dev/null +++ b/src/OpenApi/PropertyGenerator/IdPropertyGenerator.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\PrimitiveType; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Property as OpenApiProperty; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Type\PrimitiveType as OpenApiPrimitiveType; +use ApiPlatform\SchemaGenerator\PropertyGenerator\IdPropertyGenerator as CommonIdPropertyGenerator; +use ApiPlatform\SchemaGenerator\PropertyGenerator\IdPropertyGeneratorInterface; + +final class IdPropertyGenerator implements IdPropertyGeneratorInterface +{ + private IdPropertyGeneratorInterface $idPropertyGenerator; + + public function __construct(?IdPropertyGeneratorInterface $idPropertyGenerator = null) + { + $this->idPropertyGenerator = $idPropertyGenerator ?? new CommonIdPropertyGenerator(); + } + + public function __invoke(string $generationStrategy, bool $supportsWritableId, ?Property $property = null): Property + { + $idProperty = ($this->idPropertyGenerator)($generationStrategy, $supportsWritableId, new OpenApiProperty('id')); + + $idProperty->type = $idProperty->type instanceof PrimitiveType ? new OpenApiPrimitiveType($idProperty->type->name) : null; + + return $idProperty; + } +} diff --git a/src/OpenApi/PropertyGenerator/PropertyGenerator.php b/src/OpenApi/PropertyGenerator/PropertyGenerator.php new file mode 100644 index 00000000..aec9c2e0 --- /dev/null +++ b/src/OpenApi/PropertyGenerator/PropertyGenerator.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\Model\Type\Type; +use ApiPlatform\SchemaGenerator\Model\Type\UnionType; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Property as OpenApiProperty; +use ApiPlatform\SchemaGenerator\OpenApi\Model\Type\PrimitiveType; +use ApiPlatform\SchemaGenerator\OpenApi\SchemaTraversalTrait; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGenerator as CommonPropertyGenerator; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGeneratorInterface; +use cebe\openapi\spec\Schema; + +use function Symfony\Component\String\u; + +final class PropertyGenerator implements PropertyGeneratorInterface +{ + use SchemaTraversalTrait; + + private PropertyGeneratorInterface $propertyGenerator; + + public function __construct(?PropertyGeneratorInterface $propertyGenerator = null) + { + $this->propertyGenerator = $propertyGenerator ?? new CommonPropertyGenerator(); + } + + /** + * @param Configuration $config + * @param array{schema: Schema, property: Schema} $context + */ + public function __invoke(string $name, array $config, Class_ $class, array $context, bool $isCustom = false, ?Property $property = null): Property + { + $schema = $context['schema']; + $schemaProperty = $context['property']; + + $openApiProperty = new OpenApiProperty($name); + $openApiProperty->type = $this->getType($schemaProperty); + + $openApiProperty = ($this->propertyGenerator)($name, $config, $class, $context, $isCustom, $openApiProperty); + + if (!$openApiProperty instanceof OpenApiProperty) { + throw new \LogicException(\sprintf('Property has to be an instance of "%s".', OpenApiProperty::class)); + } + + $requiredFields = $schema->required ?? []; + + if ($schemaProperty->description) { + $openApiProperty->setDescription($schemaProperty->description); + } + if ($schemaProperty->externalDocs) { + $openApiProperty->setRdfType($schemaProperty->externalDocs->url); + } + $openApiProperty->isNullable = $schemaProperty->nullable ?? false; + $openApiProperty->isRequired = \in_array($name, $requiredFields, true); + $openApiProperty->isReadable = !$schemaProperty->writeOnly; + $openApiProperty->isWritable = !$schemaProperty->readOnly; + $openApiProperty->isEnum = (bool) $schemaProperty->enum; + + return $openApiProperty; + } + + private function getType(Schema $schemaProperty, bool $inComposite = false): ?Type + { + if ($schemaProperty->oneOf) { + $types = []; + foreach ($schemaProperty->oneOf as $oneOfProperty) { + \assert($oneOfProperty instanceof Schema); + if ($oneOfType = $this->getType($oneOfProperty, true)) { + $types[] = $oneOfType; + } + } + + return new UnionType($types); + } + + // Merge properties. + if ($schemaProperty->allOf) { + $type = 'string'; + $format = 'string'; + foreach ($this->getSchemaItem($schemaProperty) as $schemaPropertyItem) { + $type = $schemaPropertyItem->type ?? $type; + $format = $schemaPropertyItem->format ?? $format; + } + $schemaProperty = new Schema([ + 'type' => $type, + 'format' => $format, + ]); + } + + // Not supported. + if ($schemaProperty->anyOf || $schemaProperty->not) { + return null; + } + + if ('array' === $schemaProperty->type) { + return new ArrayType($schemaProperty->items instanceof Schema ? $this->getType($schemaProperty->items) : null); + } + + if (\is_array($schemaProperty->type)) { + // TODO: add support for OpenAPI 3.1 + return null; + } + + $type = $schemaProperty->type; + $format = $schemaProperty->format; + + $primitiveType = new PrimitiveType($type); + + if ($format) { + switch ($format) { + case 'int32': + case 'int64': + $primitiveType = new PrimitiveType('integer'); + + break; + default: + $primitiveType = new PrimitiveType(u(str_replace('-', '_', $format))->camel()->toString()); + } + + return $primitiveType; + } + + if (!$inComposite && \in_array($type, ['array', 'object'], true)) { + return null; + } + + return $primitiveType; + } +} diff --git a/src/OpenApi/SchemaTraversalTrait.php b/src/OpenApi/SchemaTraversalTrait.php new file mode 100644 index 00000000..21b6b8b6 --- /dev/null +++ b/src/OpenApi/SchemaTraversalTrait.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\OpenApi; + +use cebe\openapi\spec\Schema; + +trait SchemaTraversalTrait +{ + /** + * @return \Generator + */ + private function getSchemaItem(Schema $schema): \Generator + { + if (!$schema->oneOf && !$schema->allOf) { + yield $schema; + + return; + } + + if ($schema->oneOf) { + // Only use the first oneOf item. Needs to be improved. + $oneOfSchema = $schema->oneOf[0]; + \assert($oneOfSchema instanceof Schema); + foreach ($this->getSchemaItem($oneOfSchema) as $schemaItem) { + yield $schemaItem; + } + } + + foreach ($schema->allOf ?? [] as $allOfSchema) { + \assert($allOfSchema instanceof Schema); + foreach ($this->getSchemaItem($allOfSchema) as $schemaItem) { + yield $schemaItem; + } + } + + // Once all items have been used, yield the main schema in case there are some properties in it. + yield $schema; + } +} diff --git a/src/PhpTypeConverter.php b/src/PhpTypeConverter.php new file mode 100644 index 00000000..139ee70c --- /dev/null +++ b/src/PhpTypeConverter.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; + +final class PhpTypeConverter implements PhpTypeConverterInterface +{ + public function getPhpType(Property $property, array $config = [], array $classes = []): ?string + { + if (!$property instanceof SchemaProperty) { + throw new \LogicException(\sprintf('Property "%s" has to be an instance of "%s".', $property->name(), SchemaProperty::class)); + } + + if ($property->reference && $property->isArray()) { + return ($config['doctrine']['useCollection'] ?? false) ? 'Collection' : 'array'; + } + + if ($property->isArray()) { + return 'array'; + } + + return $this->getNonArrayType($property, $classes); + } + + public function escapeIdentifier(string $identifier): string + { + foreach (self::RESERVED_KEYWORDS as $keyword) { + if (0 === strcasecmp($keyword, $identifier)) { + return $identifier.'_'; + } + } + + return $identifier; + } + + /** + * @param Class_[] $classes + */ + private function getNonArrayType(SchemaProperty $property, array $classes): ?string + { + if ($property->isEnum) { + return 'string'; + } + + if (null === $property->range) { + return null; + } + + if ($property->type) { + return $property->type->getPhp(); + } + + $typeName = $property->rangeName; + if ($type = (isset($classes[$typeName]) ? $classes[$typeName]->interfaceName() ?? $classes[$typeName]->name() : null)) { + return $type; + } + + return null; + } +} diff --git a/src/PhpTypeConverterInterface.php b/src/PhpTypeConverterInterface.php new file mode 100644 index 00000000..3007f097 --- /dev/null +++ b/src/PhpTypeConverterInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; + +interface PhpTypeConverterInterface +{ + /** + * @internal + */ + public const RESERVED_KEYWORDS = [ + '__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'finally', 'fn', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'object', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor', 'yield', // PHP + 'collection', // Doctrine + ]; + + /** + * Gets the PHP type of this field. + * + * @param Configuration|array{} $config + * @param Class_[] $classes + */ + public function getPhpType(Property $property, array $config = [], array $classes = []): ?string; + + /** + * Escapes an identifier. + */ + public function escapeIdentifier(string $identifier): string; +} diff --git a/src/Printer.php b/src/Printer.php new file mode 100644 index 00000000..13853384 --- /dev/null +++ b/src/Printer.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use Nette\PhpGenerator\PhpNamespace; +use Nette\PhpGenerator\Printer as NettePrinter; + +final class Printer extends NettePrinter +{ + public function __construct() + { + parent::__construct(); + + $this->linesBetweenMethods = 1; + // If the type name cannot be resolved with the namespace and its uses (nette/php-generator >= 4), + // disable type resolving to avoid using the root namespace. + if (!method_exists(PhpNamespace::class, 'resolveName')) { // @phpstan-ignore-line + $this->setTypeResolving(false); + } + } +} diff --git a/src/PropertyGenerator/IdPropertyGenerator.php b/src/PropertyGenerator/IdPropertyGenerator.php new file mode 100644 index 00000000..2559f7b1 --- /dev/null +++ b/src/PropertyGenerator/IdPropertyGenerator.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\PrimitiveType; + +final class IdPropertyGenerator implements IdPropertyGeneratorInterface +{ + public function __invoke(string $generationStrategy, bool $supportsWritableId, ?Property $property = null): Property + { + if (!$property) { + throw new \LogicException('A property must be given.'); + } + + switch ($generationStrategy) { + case 'auto': + $type = 'integer'; + $typeHint = 'int'; + $writable = false; + $nullable = true; + break; + case 'uuid': + $type = 'string'; + $typeHint = 'string'; + $writable = $supportsWritableId; + $nullable = !$writable; + break; + case 'mongoid': + $type = 'string'; + $typeHint = 'string'; + $writable = false; + $nullable = true; + break; + default: + $type = 'string'; + $typeHint = 'string'; + $writable = true; + $nullable = false; + break; + } + + $property->cardinality = CardinalitiesExtractor::CARDINALITY_1_1; + $property->isWritable = $writable; + $property->isNullable = $nullable; + $property->isUnique = false; + $property->isCustom = true; + $property->isId = true; + $property->type = new PrimitiveType($type); + $property->typeHint = $typeHint; + + return $property; + } +} diff --git a/src/PropertyGenerator/IdPropertyGeneratorInterface.php b/src/PropertyGenerator/IdPropertyGeneratorInterface.php new file mode 100644 index 00000000..77b16ca8 --- /dev/null +++ b/src/PropertyGenerator/IdPropertyGeneratorInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Property; + +interface IdPropertyGeneratorInterface +{ + public function __invoke(string $generationStrategy, bool $supportsWritableId, ?Property $property = null): Property; +} diff --git a/src/PropertyGenerator/PropertyGenerator.php b/src/PropertyGenerator/PropertyGenerator.php new file mode 100644 index 00000000..7fb81065 --- /dev/null +++ b/src/PropertyGenerator/PropertyGenerator.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; + +final class PropertyGenerator implements PropertyGeneratorInterface +{ + /** + * @param Configuration $config + * @param array{} $context + */ + public function __invoke(string $name, array $config, Class_ $class, array $context, bool $isCustom = false, ?Property $property = null): Property + { + if (!$property) { + throw new \LogicException('A property must be given.'); + } + + $property->isCustom = $isCustom; + + if ($property->isArray()) { + $class->hasConstructor = true; + } + + return $property; + } +} diff --git a/src/PropertyGenerator/PropertyGeneratorInterface.php b/src/PropertyGenerator/PropertyGeneratorInterface.php new file mode 100644 index 00000000..96f6b944 --- /dev/null +++ b/src/PropertyGenerator/PropertyGeneratorInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; + +interface PropertyGeneratorInterface +{ + /** + * @param Configuration $config + */ + // @phpstan-ignore-next-line dynamic context + public function __invoke( + string $name, + array $config, + Class_ $class, + array $context, + bool $isCustom = false, + ?Property $property = null, + ): ?Property; +} diff --git a/src/Schema/ClassMutator/EnumClassMutator.php b/src/Schema/ClassMutator/EnumClassMutator.php new file mode 100644 index 00000000..eb0ef2df --- /dev/null +++ b/src/Schema/ClassMutator/EnumClassMutator.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\ClassMutator; + +use ApiPlatform\SchemaGenerator\ClassMutator\EnumClassMutator as BaseEnumClassMutator; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use ApiPlatform\SchemaGenerator\Schema\Model\Constant as SchemaConstant; +use EasyRdf\Graph as RdfGraph; + +final class EnumClassMutator extends BaseEnumClassMutator +{ + /** + * @var RdfGraph[] + */ + private array $graphs; + + /** + * @param RdfGraph[] $graphs + */ + public function __construct(PhpTypeConverterInterface $phpTypeConverter, array $graphs, string $desiredNamespace) + { + parent::__construct($phpTypeConverter, $desiredNamespace); + + $this->graphs = $graphs; + } + + protected function addEnumConstants(Class_ $class): void + { + if (!$class->rdfType()) { + return; + } + + foreach ($this->graphs as $graph) { + foreach ($graph->allOfType($class->rdfType()) as $instance) { + $class->addConstant($instance->localName(), new SchemaConstant( + $this->phpTypeConverter->escapeIdentifier(strtoupper(substr(preg_replace('/([A-Z])/', '_$1', $instance->localName()), 1))), + $instance + )); + } + } + } +} diff --git a/src/Schema/Generator.php b/src/Schema/Generator.php new file mode 100644 index 00000000..81b84a0e --- /dev/null +++ b/src/Schema/Generator.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\FilesGenerator; +use ApiPlatform\SchemaGenerator\GoodRelationsBridge; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Printer; +use ApiPlatform\SchemaGenerator\TwigBuilder; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use Symfony\Component\Console\Logger\ConsoleLogger; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\String\Inflector\EnglishInflector; + +final class Generator +{ + /** + * @param Configuration $configuration + */ + public function generate(array $configuration, OutputInterface $output, SymfonyStyle $io): void + { + $graphs = []; + foreach ($configuration['vocabularies'] as $uri => $vocab) { + $graph = new RdfGraph($uri); + if (str_starts_with($uri, 'http://') || str_starts_with($uri, 'https://')) { + $graph->load($uri, $vocab['format']); + } else { + $graph->parseFile($uri, $vocab['format']); + } + + $graphs[] = $graph; + } + + $relationsUris = $configuration['relations']['uris']; + $relations = []; + foreach ($relationsUris as $relation) { + $relations[] = new \SimpleXMLElement($relation, 0, true); + } + + $goodRelationsBridge = new GoodRelationsBridge($relations); + $cardinalitiesExtractor = new CardinalitiesExtractor($goodRelationsBridge); + + $inflector = new EnglishInflector(); + + $logger = new ConsoleLogger($output); + + $entitiesGenerator = new TypesGenerator( + $inflector, + new PhpTypeConverter(), + $cardinalitiesExtractor, + $goodRelationsBridge + ); + $entitiesGenerator->setLogger($logger); + + $classes = $entitiesGenerator->generate($graphs, $configuration); + + $twig = (new TwigBuilder())->build($configuration); + + $filesGenerator = new FilesGenerator($inflector, new Printer(), $twig, $io); + $filesGenerator->setLogger($logger); + $filesGenerator->generate($classes, $configuration); + } +} diff --git a/src/Schema/Model/Class_.php b/src/Schema/Model/Class_.php new file mode 100644 index 00000000..844c4e60 --- /dev/null +++ b/src/Schema/Model/Class_.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\Model; + +use ApiPlatform\SchemaGenerator\Model\Class_ as BaseClass_; +use EasyRdf\Resource as RdfResource; + +final class Class_ extends BaseClass_ +{ + private RdfResource $resource; + + private const SCHEMA_ORG_ENUMERATION = 'https://schema.org/Enumeration'; + + /** + * @param false|string|null $parent + */ + public function __construct(string $name, RdfResource $resource, $parent = null) + { + parent::__construct($name, $parent); + + $this->resource = $resource; + } + + public function resource(): RdfResource + { + return $this->resource; + } + + public function rdfType(): string + { + return $this->resource->getUri(); + } + + public function description(): ?string + { + $comment = $this->resource->get('rdfs:comment'); + + return $comment ? (string) $comment : null; + } + + public function shortName(): string + { + if (\is_string($shortName = $this->resource->localName())) { + return $shortName; + } + + return $this->name(); + } + + /** + * @return RdfResource[] + */ + public function getSubClassOf(): array + { + return array_filter($this->resource->all('rdfs:subClassOf', 'resource'), static fn (RdfResource $resource) => !$resource->isBNode()); + } + + public function isEnum(?RdfResource $resource = null): bool + { + $parentClass = ($resource ?? $this->resource)->get('rdfs:subClassOf'); + + return $parentClass && (self::SCHEMA_ORG_ENUMERATION === $parentClass->getUri() || $this->isEnum($parentClass)); + } +} diff --git a/src/Schema/Model/Constant.php b/src/Schema/Model/Constant.php new file mode 100644 index 00000000..f173157b --- /dev/null +++ b/src/Schema/Model/Constant.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\Model; + +use ApiPlatform\SchemaGenerator\Model\Constant as BaseConstant; +use EasyRdf\Resource as RdfResource; + +final class Constant extends BaseConstant +{ + private RdfResource $resource; + + public function __construct(string $name, RdfResource $resource) + { + parent::__construct($name); + + $this->resource = $resource; + } + + public function comment(): string + { + return (string) $this->resource->get('rdfs:comment'); + } + + public function value(): string + { + return $this->resource->getUri(); + } +} diff --git a/src/Schema/Model/Property.php b/src/Schema/Model/Property.php new file mode 100644 index 00000000..4c9a49f4 --- /dev/null +++ b/src/Schema/Model/Property.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\Model; + +use ApiPlatform\SchemaGenerator\Model\Property as BaseProperty; +use EasyRdf\Resource as RdfResource; + +final class Property extends BaseProperty +{ + public ?RdfResource $resource = null; + + public ?RdfResource $range = null; + + public ?string $rangeName = null; + + public function description(): ?string + { + if ($this->resource && $comment = $this->resource->get('rdfs:comment')) { + return (string) $comment; + } + + return null; + } + + public function rdfType(): ?string + { + if ($this->resource) { + return $this->resource->getUri(); + } + + return null; + } +} diff --git a/src/Schema/Model/Type/PrimitiveType.php b/src/Schema/Model/Type/PrimitiveType.php new file mode 100644 index 00000000..16b62891 --- /dev/null +++ b/src/Schema/Model/Type/PrimitiveType.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\Model\Type; + +use ApiPlatform\SchemaGenerator\Model\Type\Type; + +final class PrimitiveType implements Type +{ + public string $name; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function __toString(): string + { + return $this->name; + } + + public function getPhp(): string + { + switch ($this->name) { + case 'integer': + case 'negativeInteger': + case 'nonNegativeInteger': + case 'positiveInteger': + case 'nonPositiveInteger': + case 'byte': + return 'int'; + case 'boolean': + return 'bool'; + case 'float': + case 'double': + case 'decimal': + return 'float'; + case 'date': + case 'dateTime': + case 'time': + return '\\'.\DateTimeInterface::class; + case 'duration': + return '\\'.\DateInterval::class; + case 'mixed': + return ''; + default: + return 'string'; + } + } +} diff --git a/src/Schema/PropertyGenerator/IdPropertyGenerator.php b/src/Schema/PropertyGenerator/IdPropertyGenerator.php new file mode 100644 index 00000000..de8e9c2c --- /dev/null +++ b/src/Schema/PropertyGenerator/IdPropertyGenerator.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\PrimitiveType; +use ApiPlatform\SchemaGenerator\PropertyGenerator\IdPropertyGenerator as CommonIdPropertyGenerator; +use ApiPlatform\SchemaGenerator\PropertyGenerator\IdPropertyGeneratorInterface; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use EasyRdf\Resource as RdfResource; + +final class IdPropertyGenerator implements IdPropertyGeneratorInterface +{ + private IdPropertyGeneratorInterface $idPropertyGenerator; + + public function __construct(?IdPropertyGeneratorInterface $idPropertyGenerator = null) + { + $this->idPropertyGenerator = $idPropertyGenerator ?? new CommonIdPropertyGenerator(); + } + + public function __invoke(string $generationStrategy, bool $supportsWritableId, ?Property $property = null): Property + { + $idProperty = ($this->idPropertyGenerator)($generationStrategy, $supportsWritableId, new SchemaProperty('id')); + + if (!$idProperty instanceof SchemaProperty) { + throw new \LogicException(\sprintf('ID property has to be an instance of "%s".', SchemaProperty::class)); + } + + $idProperty->type = $idProperty->type instanceof PrimitiveType ? new SchemaPrimitiveType($idProperty->type->name) : null; + + $rangeName = 'Text'; + $uri = 'https://schema.org/Text'; + if ('auto' === $generationStrategy) { + $rangeName = 'Integer'; + $uri = 'https://schema.org/Integer'; + } + $idProperty->rangeName = $rangeName; + $idProperty->range = new RdfResource($uri); + + return $idProperty; + } +} diff --git a/src/Schema/PropertyGenerator/PropertyGenerator.php b/src/Schema/PropertyGenerator/PropertyGenerator.php new file mode 100644 index 00000000..f016776d --- /dev/null +++ b/src/Schema/PropertyGenerator/PropertyGenerator.php @@ -0,0 +1,211 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema\PropertyGenerator; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\GoodRelationsBridge; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\PhpTypeConverterInterface; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGenerator as CommonPropertyGenerator; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGeneratorInterface; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType; +use ApiPlatform\SchemaGenerator\Schema\TypeConverter; +use EasyRdf\Resource as RdfResource; +use Psr\Log\LoggerAwareTrait; + +final class PropertyGenerator implements PropertyGeneratorInterface +{ + use LoggerAwareTrait; + + /** @var string[] */ + private static array $rangeProperties = [ + 'schema:rangeIncludes', + 'rdfs:range', + ]; + + private GoodRelationsBridge $goodRelationsBridge; + private PhpTypeConverterInterface $phpTypeConverter; + private TypeConverter $typeConverter; + private PropertyGeneratorInterface $propertyGenerator; + + public function __construct(GoodRelationsBridge $goodRelationsBridge, TypeConverter $typeConverter, PhpTypeConverterInterface $phpTypeConverter, ?PropertyGeneratorInterface $propertyGenerator = null) + { + $this->goodRelationsBridge = $goodRelationsBridge; + $this->typeConverter = $typeConverter; + $this->phpTypeConverter = $phpTypeConverter; + $this->propertyGenerator = $propertyGenerator ?? new CommonPropertyGenerator(); + } + + /** + * @param Configuration $config + * @param array{ + * type: RdfResource, + * typeConfig: ?TypeConfiguration, + * cardinalities: array, + * property: RdfResource + * } $context + */ + public function __invoke(string $name, array $config, Class_ $class, array $context, bool $isCustom = false, ?Property $property = null): ?Property + { + $type = $context['type']; + $typeConfig = $context['typeConfig']; + $cardinalities = $context['cardinalities']; + $typeProperty = $context['property']; + + $typeUri = $type->getUri(); + $propertyUri = $typeProperty->getUri(); + + $propertyConfig = $typeConfig['properties'][$name] ?? null; + + // Warn when property are not part of GoodRelations + if ($config['checkIsGoodRelations'] && !$this->goodRelationsBridge->exists($name)) { + $this->logger ? $this->logger->warning(\sprintf('The property "%s" (type "%s") is not part of GoodRelations.', $propertyUri, $typeUri)) : null; + } + + // Warn when properties are legacy + if (preg_match('/legacy spelling/', (string) $typeProperty->get('rdfs:comment'))) { + $this->logger ? $this->logger->warning(\sprintf('The property "%s" (type "%s") is legacy.', $propertyUri, $typeUri)) : null; + } + + $ranges = []; + foreach (self::$rangeProperties as $rangePropertyType) { + /** @var RdfResource $range */ + foreach ($typeProperty->all($rangePropertyType, 'resource') as $range) { + $ranges[] = $this->getRanges($range, $propertyConfig, $config); + } + } + $ranges = array_merge(...$ranges); + + if (!$ranges) { + if (isset($propertyConfig['range'])) { + $ranges[] = new RdfResource($propertyConfig['range'], $type->getGraph()); + } else { + $this->logger ? $this->logger->error(\sprintf('The property "%s" (type "%s") has an unknown type. Add its type to the config file.', $propertyUri, $typeUri)) : null; + } + } + + if (\count($ranges) > 1) { + $this->logger ? $this->logger->info(\sprintf('The property "%s" (type "%s") has several types. Using the first one ("%s"). Other possible options: "%s".', $propertyUri, $typeUri, $ranges[0]->getUri(), implode('", "', array_map(static fn (RdfResource $range) => $range->getUri(), $ranges)))) : null; + } + + $rangeName = null; + $range = null; + if (isset($ranges[0])) { + $range = $ranges[0]; + if (!isset($propertyConfig['range']) && $mappedUri = ($config['rangeMapping'][$ranges[0]->getUri()] ?? false)) { + $range = new RdfResource($mappedUri); + } + + if (\is_string($range->localName())) { + $rangeName = $this->phpTypeConverter->escapeIdentifier($range->localName()); + } + } + + if (!$ranges) { + return null; + } + + $type = $this->typeConverter->getType($range); + + $cardinality = $propertyConfig['cardinality'] ?? CardinalitiesExtractor::CARDINALITY_UNKNOWN; + if (CardinalitiesExtractor::CARDINALITY_UNKNOWN === $cardinality) { + $cardinality = $cardinalities[$propertyUri] ?? CardinalitiesExtractor::CARDINALITY_UNKNOWN; + } + if (!$type && CardinalitiesExtractor::CARDINALITY_UNKNOWN === $cardinality) { + $cardinality = $config['relations']['defaultCardinality']; + } + + $isArray = \in_array($cardinality, [ + CardinalitiesExtractor::CARDINALITY_0_N, + CardinalitiesExtractor::CARDINALITY_1_N, + CardinalitiesExtractor::CARDINALITY_N_N, + ], true); + + $schemaProperty = new SchemaProperty($name); + if ($isArray) { + $schemaProperty->type = new ArrayType($type ? new PrimitiveType($type) : null); + } elseif ($type) { + $schemaProperty->type = new PrimitiveType($type); + } + + $schemaProperty = ($this->propertyGenerator)($name, $config, $class, $context, $isCustom, $schemaProperty); + + if (!$schemaProperty instanceof SchemaProperty) { + throw new \LogicException(\sprintf('Property has to be an instance of "%s".', SchemaProperty::class)); + } + + $isNullable = (bool) ($propertyConfig['nullable'] ?? !\in_array($cardinality, [ + CardinalitiesExtractor::CARDINALITY_1_1, + CardinalitiesExtractor::CARDINALITY_1_N, + ], true)); + + $schemaProperty->resource = $typeProperty; + $schemaProperty->range = $range; + $schemaProperty->rangeName = $rangeName; + $schemaProperty->defaultValue = $propertyConfig['defaultValue'] ?? null; + $schemaProperty->cardinality = $cardinality; + $schemaProperty->isReadable = $propertyConfig['readable'] ?? true; + $schemaProperty->isWritable = $propertyConfig['writable'] ?? true; + $schemaProperty->isNullable = $isNullable; + $schemaProperty->isRequired = $propertyConfig['required'] ?? false; + $schemaProperty->isUnique = $propertyConfig['unique'] ?? false; + $schemaProperty->isEmbedded = $propertyConfig['embedded'] ?? false; + $schemaProperty->mappedBy = $propertyConfig['mappedBy'] ?? null; + $schemaProperty->inversedBy = $propertyConfig['inversedBy'] ?? null; + $schemaProperty->groups = $propertyConfig['groups'] ?? []; + + return $schemaProperty; + } + + /** + * @param ?PropertyConfiguration $propertyConfig + * @param Configuration $config + * + * @return RdfResource[] + */ + private function getRanges(RdfResource $range, ?array $propertyConfig, array $config): array + { + $localName = null; + if (\is_string($range->localName())) { + $localName = $range->localName(); + } + $dataType = (bool) $this->typeConverter->getType($range); + if (!$dataType) { + if (null !== ($unionOf = $range->get('owl:unionOf'))) { + return $this->getRanges($unionOf, $propertyConfig, $config); + } + + if (null !== ($rdfFirst = $range->get('rdf:first'))) { + $ranges = $this->getRanges($rdfFirst, $propertyConfig, $config); + if (null !== ($rdfRest = $range->get('rdf:rest'))) { + $ranges = array_merge($ranges, $this->getRanges($rdfRest, $propertyConfig, $config)); + } + + return $ranges; + } + } + + if ( + (!isset($propertyConfig['range']) || $propertyConfig['range'] === $localName) + && (empty($config['types']) || isset($config['types'][$localName]) || $dataType) + ) { + return [$range]; + } + + return []; + } +} diff --git a/src/Schema/TypeConverter.php b/src/Schema/TypeConverter.php new file mode 100644 index 00000000..cc8f4382 --- /dev/null +++ b/src/Schema/TypeConverter.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Schema; + +use EasyRdf\Resource as RdfResource; + +final class TypeConverter +{ + public const RANGE_DATA_TYPE_MAPPING = [ + 'https://schema.org/URL' => 'url', + + 'https://schema.org/Boolean' => 'boolean', + 'http://www.w3.org/2001/XMLSchema#boolean' => 'boolean', + + 'https://schema.org/Float' => 'float', + 'http://www.w3.org/2001/XMLSchema#float' => 'float', + + 'http://www.w3.org/2001/XMLSchema#double' => 'double', + + 'https://schema.org/Integer' => 'integer', + 'http://www.w3.org/2001/XMLSchema#integer' => 'integer', + 'http://www.w3.org/2001/XMLSchema#int' => 'integer', + 'http://www.w3.org/2001/XMLSchema#long' => 'integer', + 'http://www.w3.org/2001/XMLSchema#short' => 'integer', + + 'http://www.w3.org/2001/XMLSchema#negativeInteger' => 'negativeInteger', + + 'http://www.w3.org/2001/XMLSchema#nonNegativeInteger' => 'nonNegativeInteger', + 'http://www.w3.org/2001/XMLSchema#unsignedInt' => 'nonNegativeInteger', + 'http://www.w3.org/2001/XMLSchema#unsignedShort' => 'nonNegativeInteger', + 'http://www.w3.org/2001/XMLSchema#unsignedLong' => 'nonNegativeInteger', + + 'http://www.w3.org/2001/XMLSchema#positiveInteger' => 'positiveInteger', + + 'http://www.w3.org/2001/XMLSchema#nonPositiveInteger' => 'nonPositiveInteger', + + 'http://www.w3.org/2001/XMLSchema#decimal' => 'decimal', + + 'https://schema.org/Date' => 'date', + 'http://www.w3.org/2001/XMLSchema#date' => 'date', + 'http://www.w3.org/2001/XMLSchema#gYearMonth' => 'date', + 'http://www.w3.org/2001/XMLSchema#gYear' => 'date', + 'http://www.w3.org/2001/XMLSchema#gMonthDay' => 'date', + 'http://www.w3.org/2001/XMLSchema#gDay' => 'date', + 'http://www.w3.org/2001/XMLSchema#gMonth' => 'date', + + 'https://schema.org/DateTime' => 'dateTime', + 'http://www.w3.org/2001/XMLSchema#dateTime' => 'dateTime', + + 'http://www.w3.org/2001/XMLSchema#duration' => 'duration', + + 'https://schema.org/Time' => 'time', + 'http://www.w3.org/2001/XMLSchema#time' => 'time', + + 'http://www.w3.org/2001/XMLSchema#byte' => 'byte', + 'http://www.w3.org/2001/XMLSchema#unsignedByte' => 'byte', + + 'http://www.w3.org/2001/XMLSchema#hexBinary' => 'hexBinary', + + 'http://www.w3.org/2001/XMLSchema#base64Binary' => 'base64Binary', + + 'https://schema.org/Text' => 'string', + 'https://schema.org/Number' => 'string', + 'http://www.w3.org/2001/XMLSchema#string' => 'string', + 'http://www.w3.org/2001/XMLSchema#anyURI' => 'string', + 'http://www.w3.org/2001/XMLSchema#QName' => 'string', + 'http://www.w3.org/2001/XMLSchema#NOTATION' => 'string', + 'http://www.w3.org/2001/XMLSchema#normalizedString' => 'string', + 'http://www.w3.org/2001/XMLSchema#token' => 'string', + 'http://www.w3.org/2001/XMLSchema#language' => 'string', + 'http://www.w3.org/2001/XMLSchema#NMTOKEN' => 'string', + 'http://www.w3.org/2001/XMLSchema#NMTOKENS' => 'string', + 'http://www.w3.org/2001/XMLSchema#Name' => 'string', + 'http://www.w3.org/2001/XMLSchema#NCName' => 'string', + 'http://www.w3.org/2001/XMLSchema#ID' => 'string', + 'http://www.w3.org/2001/XMLSchema#IDREF' => 'string', + 'http://www.w3.org/2001/XMLSchema#IDREFS' => 'string', + 'http://www.w3.org/2001/XMLSchema#ENTITY' => 'string', + 'http://www.w3.org/2001/XMLSchema#ENTITIES' => 'string', + + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString' => 'string', + + 'https://schema.org/DataType' => 'mixed', + ]; + + public function getType(?RdfResource $range): ?string + { + if (!$range) { + return null; + } + + return self::RANGE_DATA_TYPE_MAPPING[$this->getUri($range)] ?? null; + } + + private function getUri(RdfResource $range): string + { + if ($range->isBNode() && $onDatatype = $range->get('owl:onDatatype')) { + return $onDatatype->getUri(); + } + + if ($range->isBNode() + && null !== ($unionOf = $range->get('owl:unionOf')) + && null !== ($rdfFirst = $unionOf->get('rdf:first'))) { + return $rdfFirst->getUri(); + } + + return $range->getUri(); + } +} diff --git a/src/SchemaGeneratorConfiguration.php b/src/SchemaGeneratorConfiguration.php new file mode 100644 index 00000000..cb512079 --- /dev/null +++ b/src/SchemaGeneratorConfiguration.php @@ -0,0 +1,277 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator; +use ApiPlatform\SchemaGenerator\AttributeGenerator\ApiPlatformCoreAttributeGenerator; +use ApiPlatform\SchemaGenerator\AttributeGenerator\ConfigurationAttributeGenerator; +use ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator; +use ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAssociationOverrideAttributeGenerator; +use ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAttributeGenerator; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +/** + * Schema Generator Configuration. + * + * @author Kévin Dunglas + */ +final class SchemaGeneratorConfiguration implements ConfigurationInterface +{ + public const SCHEMA_ORG_URI = 'https://schema.org/version/latest/schemaorg-current-https.rdf'; + public const GOOD_RELATIONS_URI = 'https://www.heppnetz.de/ontologies/goodrelations/v1.owl'; + public const SCHEMA_ORG_NAMESPACE = 'https://schema.org/'; + + private ?string $defaultPrefix; + + public function __construct(?string $defaultPrefix = null) + { + $this->defaultPrefix = $defaultPrefix; + } + + public function getConfigTreeBuilder(): TreeBuilder + { + $namespacePrefix = $this->defaultPrefix ?? 'App\\'; + + /* @see https://yaml.org/type/omap.html */ + $transformOmap = fn (array $nodeConfig) => array_map( + fn ($v, $k) => \is_int($k) ? $v : [$k => $v], + array_values($nodeConfig), + array_keys($nodeConfig) + ); + + // @phpstan-ignore-next-line node is not null + $attributesNode = fn () => (new NodeBuilder()) + ->arrayNode('attributes') + ->info('Attributes (merged with generated attributes)') + ->variablePrototype()->end() + ->beforeNormalization() + ->ifArray() + ->then($transformOmap) + ->end(); + + $treeBuilder = new TreeBuilder('config'); + + $treeBuilder + ->getRootNode() + ->children() + ->arrayNode('openApi') + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('file')->defaultNull()->end() + ->end() + ->end() + ->arrayNode('vocabularies') + ->info('RDF vocabularies') + ->defaultValue([self::SCHEMA_ORG_URI => ['format' => 'rdfxml']]) + ->beforeNormalization() + ->ifArray() + ->then(fn (array $v) => array_map(fn ($rdf) => \is_scalar($rdf) ? ['uri' => $rdf] : $rdf, $v)) + ->end() + ->useAttributeAsKey('uri') + ->arrayPrototype() + ->children() + ->scalarNode('uri')->info('RDF vocabulary to use')->example('https://schema.org/version/latest/schemaorg-current-https.rdf')->end() + ->scalarNode('format')->defaultNull()->info('RDF vocabulary format')->example('rdfxml')->end() + ->booleanNode('allTypes')->defaultNull()->info('Generate all types for this vocabulary, even if an explicit configuration exists. If allTypes is enabled globally, it can be disabled for this particular vocabulary')->end() + ->append($attributesNode()) + ->end() + ->end() + ->end() + ->scalarNode('vocabularyNamespace')->defaultValue(self::SCHEMA_ORG_NAMESPACE)->info('Namespace of the vocabulary to import')->example('http://www.w3.org/ns/activitystreams#')->end() + ->arrayNode('relations') + ->addDefaultsIfNotSet() + ->info('Relations configuration') + ->children() + ->arrayNode('uris') + ->info('OWL relation URIs containing cardinality information in the GoodRelations format') + ->example(self::GOOD_RELATIONS_URI) + ->defaultValue([self::GOOD_RELATIONS_URI]) + ->scalarPrototype()->end() + ->end() + ->enumNode('defaultCardinality')->defaultValue('(1..1)')->values(['(0..1)', '(0..*)', '(1..1)', '(1..*)', '(*..0)', '(*..1)', '(*..*)'])->info('The default cardinality to use when it cannot be extracted')->end() + ->end() + ->end() + ->booleanNode('debug')->defaultFalse()->info('Debug mode')->end() + ->booleanNode('apiPlatformOldAttributes')->defaultFalse()->info('Use old API Platform attributes (API Platform < 2.7)')->end() + ->arrayNode('id') + ->addDefaultsIfNotSet() + ->info('IDs configuration') + ->children() + ->booleanNode('generate')->defaultTrue()->info('Automatically add an id field to entities')->end() + ->enumNode('generationStrategy')->defaultValue('auto')->values(['auto', 'none', 'uuid', 'mongoid'])->info('The ID generation strategy to use ("none" to not let the database generate IDs).')->end() + ->booleanNode('writable')->defaultFalse()->info('Is the ID writable? Only applicable if "generationStrategy" is "uuid".')->end() + ->end() + ->end() + ->booleanNode('useInterface')->defaultFalse()->info('Generate interfaces and use Doctrine\'s Resolve Target Entity feature')->end() + ->booleanNode('checkIsGoodRelations')->defaultFalse()->info('Emit a warning if a property is not derived from GoodRelations')->end() + ->scalarNode('header')->defaultNull()->info('A license or any text to use as header of generated files')->example('// (c) Kévin Dunglas ')->end() + ->arrayNode('namespaces') + ->addDefaultsIfNotSet() + ->info('PHP namespaces') + ->children() + ->scalarNode('prefix')->defaultValue($this->defaultPrefix)->info('The global namespace\'s prefix')->example('App\\')->end() + ->scalarNode('entity')->defaultValue("{$namespacePrefix}Entity")->info('The namespace of the generated entities')->example('App\Entity')->end() + ->scalarNode('enum')->defaultValue("{$namespacePrefix}Enum")->info('The namespace of the generated enumerations')->example('App\Enum')->end() + ->scalarNode('interface')->defaultValue("{$namespacePrefix}Model")->info('The namespace of the generated interfaces')->example('App\Model')->end() + ->end() + ->end() + ->arrayNode('uses') + ->info('Custom uses (for instance if you use a custom attribute)') + ->useAttributeAsKey('name') + ->arrayPrototype() + ->children() + ->scalarNode('name')->cannotBeEmpty()->info('Name of this use')->example('App\Attributes\MyAttribute')->end() + ->scalarNode('alias')->defaultNull()->info('The alias to use for this use')->end() + ->end() + ->end() + ->end() + ->arrayNode('doctrine') + ->addDefaultsIfNotSet() + ->info('Doctrine') + ->children() + ->booleanNode('useCollection')->defaultTrue()->info('Use Doctrine\'s ArrayCollection instead of standard arrays')->end() + ->scalarNode('resolveTargetEntityConfigPath')->defaultNull()->info('The Resolve Target Entity Listener config file path')->end() + ->enumNode('resolveTargetEntityConfigType')->defaultValue('XML')->values(['XML', 'yaml'])->info('The Resolve Target Entity Listener config file type')->end() + ->arrayNode('inheritanceAttributes') + ->info('Doctrine inheritance attributes (if set, no other attributes are generated)') + ->variablePrototype()->end() + ->beforeNormalization() + ->ifArray() + ->then($transformOmap) + ->end() + ->end() + ->enumNode('inheritanceType')->defaultValue('JOINED')->values(['JOINED', 'SINGLE_TABLE', 'SINGLE_COLLECTION', 'TABLE_PER_CLASS', 'COLLECTION_PER_CLASS', 'NONE'])->info('The inheritance type to use when an entity is referenced by another and has child')->end() + ->integerNode('maxIdentifierLength')->defaultValue(63)->info('Maximum length of any given database identifier, like tables or column names')->end() + ->end() + ->end() + ->arrayNode('validator') + ->addDefaultsIfNotSet() + ->info('Symfony Validator Component') + ->children() + ->booleanNode('assertType')->defaultFalse()->info('Generate @Assert\Type annotation')->end() + ->end() + ->end() + ->scalarNode('author')->defaultFalse()->info('The value of the phpDoc\'s @author annotation')->example('Kévin Dunglas ')->end() + ->enumNode('fieldVisibility')->values(['private', 'protected', 'public'])->defaultValue('private')->cannotBeEmpty()->info('Visibility of entities fields')->end() + ->booleanNode('accessorMethods')->defaultTrue()->info('Set this flag to false to not generate getter, setter, adder and remover methods')->end() + ->booleanNode('fluentMutatorMethods')->defaultFalse()->info('Set this flag to true to generate fluent setter, adder and remover methods')->end() + ->arrayNode('rangeMapping') + ->useAttributeAsKey('name') + ->scalarPrototype()->end() + ->end() + ->booleanNode('allTypes')->defaultFalse()->info('Generate all types, even if an explicit configuration exists')->end() + ->booleanNode('resolveTypes')->defaultFalse()->info('If a type is present in a vocabulary but not explicitly imported (types) or if the vocabulary is not totally imported (allTypes), it will be generated')->end() + ->arrayNode('types') + ->beforeNormalization() + ->always() + ->then(static function ($v) { + foreach ($v as $key => $type) { + $v[$key]['allProperties'] ??= !isset($type['properties']); + } + + return $v; + }) + ->end() + ->info('Types to import from the vocabulary') + ->useAttributeAsKey('id') + ->arrayPrototype() + ->children() + ->booleanNode('exclude')->defaultFalse()->info('Exclude this type, even if "allTypes" is set to true"')->end() + ->scalarNode('vocabularyNamespace')->defaultNull()->info('Namespace of the vocabulary of this type (defaults to the global "vocabularyNamespace" entry)')->example('http://www.w3.org/ns/activitystreams#')->end() + ->booleanNode('abstract')->defaultNull()->info('Is the class abstract? (null to guess)')->end() + ->booleanNode('embeddable')->defaultFalse()->info('Is the class embeddable?')->end() + ->arrayNode('namespaces') + ->addDefaultsIfNotSet() + ->info('Type namespaces') + ->children() + ->scalarNode('class')->defaultNull()->info('The namespace for the generated class (override any other defined namespace)')->end() + ->scalarNode('interface')->defaultNull()->info('The namespace for the generated interface (override any other defined namespace)')->end() + ->end() + ->end() + ->append($attributesNode()) + ->scalarNode('parent')->defaultFalse()->info('The parent class, set to false for a top level class')->end() + ->scalarNode('guessFrom')->defaultValue('Thing')->info('If declaring a custom class, this will be the class from which properties type will be guessed')->end() + ->arrayNode('operations') + ->info('Operations for the class') + ->variablePrototype()->end() + ->end() + ->booleanNode('allProperties')->defaultFalse()->info('Import all existing properties')->end() + ->arrayNode('properties') + ->info('Properties of this type to use') + ->useAttributeAsKey('id') + ->arrayPrototype() + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('exclude')->defaultFalse()->info('Exclude this property, even if "allProperties" is set to true"')->end() + ->scalarNode('range')->defaultNull()->info('The property range')->example('Offer')->end() + ->enumNode('cardinality')->defaultValue(CardinalitiesExtractor::CARDINALITY_UNKNOWN)->values([ + CardinalitiesExtractor::CARDINALITY_0_1, + CardinalitiesExtractor::CARDINALITY_0_N, + CardinalitiesExtractor::CARDINALITY_1_1, + CardinalitiesExtractor::CARDINALITY_1_N, + CardinalitiesExtractor::CARDINALITY_N_0, + CardinalitiesExtractor::CARDINALITY_N_1, + CardinalitiesExtractor::CARDINALITY_N_N, + CardinalitiesExtractor::CARDINALITY_UNKNOWN, + ])->end() + ->arrayNode('groups') + ->info('Symfony Serialization Groups') + ->scalarPrototype()->end() + ->end() + ->scalarNode('mappedBy')->defaultNull()->info('The doctrine mapped by attribute')->example('partOfSeason')->end() + ->scalarNode('inversedBy')->defaultNull()->info('The doctrine inversed by attribute')->example('episodes')->end() + ->booleanNode('readable')->defaultTrue()->info('Is the property readable?')->end() + ->booleanNode('writable')->defaultTrue()->info('Is the property writable?')->end() + ->booleanNode('nullable')->defaultNull()->info('Is the property nullable? (if null, cardinality will be used: will be true if no cardinality found)')->end() + ->variableNode('defaultValue')->defaultNull()->info('The property default value')->end() + ->booleanNode('required')->defaultTrue()->info('Is the property required?')->end() + ->booleanNode('unique')->defaultFalse()->info('The property unique')->end() + ->booleanNode('embedded')->defaultFalse()->info('Is the property embedded?')->end() + ->append($attributesNode()) + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->arrayNode('annotationGenerators') + ->info('Annotation generators to use') + ->defaultValue([ + PhpDocAnnotationGenerator::class, + ]) + ->scalarPrototype()->end() + ->end() + ->arrayNode('attributeGenerators') + ->info('Attribute generators to use') + ->defaultValue([ + DoctrineOrmAttributeGenerator::class, + DoctrineOrmAssociationOverrideAttributeGenerator::class, + ApiPlatformCoreAttributeGenerator::class, + ConstraintAttributeGenerator::class, + // Configuration attribute generator needs to be last to merge its attributes with previously generated ones. + ConfigurationAttributeGenerator::class, + ]) + ->scalarPrototype()->end() + ->end() + ->arrayNode('generatorTemplates') + ->info('Directories for custom generator twig templates') + ->scalarPrototype()->end() + ->end() + ->end(); + + return $treeBuilder; + } +} diff --git a/src/SchemaOrgModel/AnnotationGenerator/AbstractAnnotationGenerator.php b/src/SchemaOrgModel/AnnotationGenerator/AbstractAnnotationGenerator.php deleted file mode 100644 index 600a0b2c..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/AbstractAnnotationGenerator.php +++ /dev/null @@ -1,200 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -use Psr\Log\LoggerInterface; - -/** - * Abstract annotation generator. - * - * @author Kévin Dunglas - */ -abstract class AbstractAnnotationGenerator implements AnnotationGeneratorInterface -{ - /** - * @var LoggerInterface - */ - protected $logger; - /** - * @var \EasyRdf_Graph[] - */ - protected $graphs; - /** - * @var array - */ - protected $cardinalities; - /** - * @var array - */ - protected $config; - /** - * @var array - */ - protected $classes; - - /** - * {@inheritdoc} - */ - public function __construct( - LoggerInterface $logger, - array $graphs, - array $cardinalities, - array $config, - array $classes - ) { - $this->logger = $logger; - $this->graphs = $graphs; - $this->cardinalities = $cardinalities; - $this->config = $config; - $this->classes = $classes; - } - - /** - * {@inheritdoc} - */ - public function generateClassAnnotations($className) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateInterfaceAnnotations($className) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateConstantAnnotations($className, $constantName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateFieldAnnotations($className, $fieldName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateGetterAnnotations($className, $fieldName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateSetterAnnotations($className, $fieldName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateAdderAnnotations($className, $fieldName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateRemoverAnnotations($className, $fieldName) - { - return []; - } - - /** - * {@inheritdoc} - */ - public function generateUses($className) - { - return []; - } - - /** - * Converts a Schema.org range to a PHP type. - * - * @param array $field - * @param bool $adderOrRemover - * - * @return string - */ - protected function toPhpType(array $field, $adderOrRemover = false) - { - $range = $field['range']; - - if ($field['isEnum']) { - if ($field['isArray']) { - return 'string[]'; - } else { - return 'string'; - } - } - - $data = false; - switch ($range) { - case 'Boolean': - $data = 'boolean'; - break; - case 'Date': - // No break - case 'DateTime': - // No break - case 'Time': - $data = '\DateTime'; - break; - case 'Number': - // No break - case 'Float': - $data = 'float'; - break; - case 'Integer': - $data = 'integer'; - break; - case 'Text': - // No break - case 'URL': - $data = 'string'; - break; - } - - if ($data) { - if ($field['isArray']) { - return sprintf('%s[]', $data); - } - - return $data; - } - - if (isset($this->classes[$field['range']]['interfaceName'])) { - $range = $this->classes[$field['range']]['interfaceName']; - } - - if ($field['isArray'] && !$adderOrRemover) { - if ($this->config['doctrine']['useCollection']) { - return sprintf('ArrayCollection<%s>', $range); - } - - return sprintf('%s[]', $range); - } - - return $range; - } -} diff --git a/src/SchemaOrgModel/AnnotationGenerator/AnnotationGeneratorInterface.php b/src/SchemaOrgModel/AnnotationGenerator/AnnotationGeneratorInterface.php deleted file mode 100644 index 36243123..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/AnnotationGeneratorInterface.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -use Psr\Log\LoggerInterface; - -/** - * Annotation Generator Interface. - * - * @author Kévin Dunglas - */ -interface AnnotationGeneratorInterface -{ - /** - * @param LoggerInterface $logger - * @param \EasyRdf_Graph[] $graphs - * @param array $cardinalities - * @param array $config - * @param array $classes - */ - public function __construct( - LoggerInterface $logger, - array $graphs, - array $cardinalities, - array $config, - array $classes - ); - - /** - * Generates class' annotations. - * - * @param string $className - * - * @return array - */ - public function generateClassAnnotations($className); - - /** - * Generates interface's annotations. - * - * @param string $className - * - * @return array - */ - public function generateInterfaceAnnotations($className); - - /** - * Generates constant's annotations. - * - * @param string $className - * @param string $constantName - * - * @return array - */ - public function generateConstantAnnotations($className, $constantName); - - /** - * Generates field's annotation. - * - * @param string $className - * @param string $fieldName - * - * @return array - */ - public function generateFieldAnnotations($className, $fieldName); - - /** - * Generates getter's annotation. - * - * @param string $className - * @param string $fieldName - * - * @return array - */ - public function generateGetterAnnotations($className, $fieldName); - - /** - * Generates setter's annotation. - * - * @param string $className - * @param string $fieldName - * - * @return array - */ - public function generateSetterAnnotations($className, $fieldName); - - /** - * Generates adder's annotation. - * - * @param string $className - * @param string $fieldName - * - * @return array - */ - public function generateAdderAnnotations($className, $fieldName); - - /** - * Generates remover's annotation. - * - * @param string $className - * @param string $fieldName - * - * @return array - */ - public function generateRemoverAnnotations($className, $fieldName); - - /** - * Generates uses. - * - * @param string $className - * - * @return array - */ - public function generateUses($className); -} diff --git a/src/SchemaOrgModel/AnnotationGenerator/ConstraintAnnotationGenerator.php b/src/SchemaOrgModel/AnnotationGenerator/ConstraintAnnotationGenerator.php deleted file mode 100644 index e95c9fbe..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/ConstraintAnnotationGenerator.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -/** - * Constraint annotation generator. - * - * @author Kévin Dunglas - */ -class ConstraintAnnotationGenerator extends AbstractAnnotationGenerator -{ - /** - * {@inheritdoc} - */ - public function generateFieldAnnotations($className, $fieldName) - { - $field = $this->classes[$className]['fields'][$fieldName]; - - if ($field['isId']) { - return []; - } - - $asserts = []; - if (!$field['isArray']) { - switch ($field['range']) { - case 'URL': - $asserts[] = '@Assert\Url'; - break; - - case 'Date': - $asserts[] = '@Assert\Date'; - break; - - case 'DateTime': - $asserts[] = '@Assert\DateTime'; - break; - - case 'Time': - $asserts[] = '@Assert\Time'; - break; - } - - if (isset($field['resource']) && 'email' === $field['resource']->localName()) { - $asserts[] = '@Assert\Email'; - } - - if (!$asserts) { - $phpType = $this->toPhpType($field); - if (in_array($phpType, ['boolean', 'float', 'integer', 'string'])) { - $asserts[] = sprintf('@Assert\Type(type="%s")', $phpType); - } - } - } - - if (!$field['isNullable']) { - $asserts[] = '@Assert\NotNull'; - } - - if ($field['isEnum']) { - $assert = sprintf('@Assert\Choice(callback={"%s", "toArray"}', $field['range']); - - if ($field['isArray']) { - $assert .= ', multiple=true'; - } - - $assert .= ')'; - - $asserts[] = $assert; - } - - return $asserts; - } - - /** - * {@inheritdoc} - */ - public function generateUses($className) - { - if ($this->classes[$className]['isEnum']) { - return []; - } - - $uses = []; - $uses[] = 'Symfony\Component\Validator\Constraints as Assert'; - - foreach ($this->classes[$className]['fields'] as $field) { - if ($field['isEnum']) { - $enumClass = $this->classes[$field['range']]; - $enumNamespace = isset($enumClass['namespaces']['class']) && $enumClass['namespaces']['class'] ? $enumClass['namespaces']['class'] : $this->config['namespaces']['enum']; - $use = sprintf('%s\%s', $enumNamespace, $field['range']); - - if (!in_array($use, $uses)) { - $uses[] = $use; - } - } - } - - return $uses; - } -} diff --git a/src/SchemaOrgModel/AnnotationGenerator/DoctrineOrmAnnotationGenerator.php b/src/SchemaOrgModel/AnnotationGenerator/DoctrineOrmAnnotationGenerator.php deleted file mode 100644 index d1961554..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/DoctrineOrmAnnotationGenerator.php +++ /dev/null @@ -1,195 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -use SchemaOrgModel\CardinalitiesExtractor; -use SchemaOrgModel\TypesGenerator; - -/** - * Doctrine annotation generator. - * - * @author Kévin Dunglas - */ -class DoctrineOrmAnnotationGenerator extends AbstractAnnotationGenerator -{ - /** - * {@inheritdoc} - */ - public function generateClassAnnotations($className) - { - $class = $this->classes[$className]; - - if ($class['isEnum']) { - return []; - } - - if (isset($this->config['types'][$class['resource']->localName()]['doctrine']['inheritanceMapping'])) { - $inheritanceMapping = $this->config['types'][$class['resource']->localName()]['doctrine']['inheritanceMapping']; - } else { - $inheritanceMapping = $class['abstract'] ? '@ORM\MappedSuperclass' : '@ORM\Entity'; - } - - return [ - '', - $inheritanceMapping, - ]; - } - - /** - * {@inheritdoc} - */ - public function generateFieldAnnotations($className, $fieldName) - { - $this->classes[$className]; - $field = $this->classes[$className]['fields'][$fieldName]; - - $annotations = []; - - if ($field['isEnum']) { - if ($field['isArray']) { - $type = 'simple_array'; - } else { - $type = 'string'; - } - } else { - switch ($field['range']) { - case 'Boolean': - $type = 'boolean'; - break; - case 'Date': - $type = 'date'; - break; - case 'DateTime': - $type = 'datetime'; - break; - case 'Time': - $type = 'time'; - break; - case 'Number': - // No break - case 'Float': - $type = 'float'; - break; - case 'Integer': - $type = 'integer'; - break; - case 'Text': - // No break - case 'URL': - $type = 'string'; - break; - } - } - - if (isset($type)) { - $annotation = '@ORM\Column'; - - if ($field['isArray']) { - $type = 'simple_array'; - } - - if ($type !== 'string' || $field['isNullable']) { - $annotation .= '('; - } - - if ($type !== 'string') { - $annotation .= sprintf('type="%s"', $type); - } - - if ($type !== 'string' && $field['isNullable']) { - $annotation .= ', '; - } - - if ($field['isNullable']) { - $annotation .= 'nullable=true'; - } - - if ($type !== 'string' || $field['isNullable']) { - $annotation .= ')'; - } - - $annotations[] = $annotation; - } else { - switch ($field['cardinality']) { - case CardinalitiesExtractor::CARDINALITY_0_1: - $annotations[] = sprintf('@ORM\OneToOne(targetEntity="%s")', $this->getRelationName($field['range'])); - break; - - case CardinalitiesExtractor::CARDINALITY_1_1: - $annotations[] = sprintf('@ORM\OneToOne(targetEntity="%s")', $this->getRelationName($field['range'])); - $annotations[] = '@ORM\JoinColumn(nullable=false)'; - break; - - case CardinalitiesExtractor::CARDINALITY_UNKNOWN: - // No break - case CardinalitiesExtractor::CARDINALITY_N_0: - $annotations[] = sprintf('@ORM\ManyToOne(targetEntity="%s")', $this->getRelationName($field['range'])); - break; - - case CardinalitiesExtractor::CARDINALITY_N_1: - $annotations[] = sprintf('@ORM\ManyToOne(targetEntity="%s")', $this->getRelationName($field['range'])); - $annotations[] = '@ORM\JoinColumn(nullable=false)'; - break; - - case CardinalitiesExtractor::CARDINALITY_0_N: - $annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range'])); - $annotations[] = '@ORM\JoinTable(inverseJoinColumns={@ORM\JoinColumn(unique=true)})'; - break; - - case CardinalitiesExtractor::CARDINALITY_1_N: - $annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range'])); - $annotations[] = '@ORM\JoinTable(inverseJoinColumns={@ORM\JoinColumn(nullable=false, unique=true)})'; - break; - - case CardinalitiesExtractor::CARDINALITY_N_N: - $annotations[] = sprintf('@ORM\ManyToMany(targetEntity="%s")', $this->getRelationName($field['range'])); - break; - } - } - - if ($field['isId']) { - $annotations[] = '@ORM\Id'; - $annotations[] = '@ORM\GeneratedValue(strategy="AUTO")'; - } - - return $annotations; - } - - /** - * {@inheritdoc} - */ - public function generateUses($className) - { - $resource = $this->classes[$className]['resource']; - - $subClassOf = $resource->get('rdfs:subClassOf'); - $typeIsEnum = $subClassOf && $subClassOf->getUri() === TypesGenerator::SCHEMA_ORG_ENUMERATION; - - return $typeIsEnum ? [] : ['Doctrine\ORM\Mapping as ORM']; - } - - /** - * Gets class or interface name to use in relations. - * - * @param string $range - * - * @return string - */ - private function getRelationName($range) - { - $class = $this->classes[$range]; - - if (isset($class['interfaceName'])) { - return $class['interfaceName']; - } - - return $class['name']; - } -} diff --git a/src/SchemaOrgModel/AnnotationGenerator/DunglasJsonLdApiAnnotationGenerator.php b/src/SchemaOrgModel/AnnotationGenerator/DunglasJsonLdApiAnnotationGenerator.php deleted file mode 100644 index 64c216ea..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/DunglasJsonLdApiAnnotationGenerator.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -use SchemaOrgModel\TypesGenerator; - -/** - * Generates Iri annotations provided by DunglasJsonLdApiBundle. - * - * @author Kévin Dunglas - * - * @link https://github.com/dunglas/DunglasJsonLdApiBundle - */ -class DunglasJsonLdApiAnnotationGenerator extends AbstractAnnotationGenerator -{ - /** - * {@inheritdoc} - */ - public function generateClassAnnotations($className) - { - $resource = $this->classes[$className]['resource']; - - return [sprintf('@Iri("%s")', $resource->getUri())]; - } - - /** - * {@inheritdoc} - */ - public function generateFieldAnnotations($className, $fieldName) - { - return 'id' === $fieldName ? [] : [sprintf('@Iri("https://schema.org/%s")', $fieldName)]; - } - - /** - * {@inheritdoc} - */ - public function generateUses($className) - { - $resource = $this->classes[$className]['resource']; - - $subClassOf = $resource->get('rdfs:subClassOf'); - $typeIsEnum = $subClassOf && $subClassOf->getUri() === TypesGenerator::SCHEMA_ORG_ENUMERATION; - - return $typeIsEnum ? [] : ['Dunglas\JsonLdApiBundle\Annotation\Iri']; - } -} diff --git a/src/SchemaOrgModel/AnnotationGenerator/PhpDocAnnotationGenerator.php b/src/SchemaOrgModel/AnnotationGenerator/PhpDocAnnotationGenerator.php deleted file mode 100644 index 06b703e2..00000000 --- a/src/SchemaOrgModel/AnnotationGenerator/PhpDocAnnotationGenerator.php +++ /dev/null @@ -1,188 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\AnnotationGenerator; - -/** - * PHPDoc annotation generator. - * - * @author Kévin Dunglas - */ -class PhpDocAnnotationGenerator extends AbstractAnnotationGenerator -{ - const INDENT = ' '; - - /** - * {@inheritdoc} - */ - public function generateClassAnnotations($className) - { - return $this->generateDoc($className); - } - - /** - * {@inheritdoc} - */ - public function generateInterfaceAnnotations($className) - { - return $this->generateDoc($className, true); - } - - /** - * {@inheritdoc} - */ - public function generateConstantAnnotations($className, $constantName) - { - $resource = $this->classes[$className]['constants'][$constantName]['resource']; - - $annotations = $this->formatDoc($resource->get('rdfs:comment'), true); - $annotations[0] = sprintf( - '@var string %s', - $annotations[0] - ); - - return $annotations; - } - - /** - * {@inheritdoc} - */ - public function generateFieldAnnotations($className, $fieldName) - { - $field = $this->classes[$className]['fields'][$fieldName]; - $comment = $field['resource'] ? $field['resource']->get('rdfs:comment') : ''; - - $annotations = $this->formatDoc($comment, true); - $annotations[0] = sprintf( - '@var %s %s', - $this->toPhpType($field), - $annotations[0] - ); - $annotations[] = ''; - - return $annotations; - } - - /** - * {@inheritdoc} - */ - public function generateGetterAnnotations($className, $fieldName) - { - return [ - sprintf('Gets %s.', $fieldName), - '', - sprintf('@return %s', $this->toPhpType($this->classes[$className]['fields'][$fieldName])), - ]; - } - - /** - * {@inheritdoc} - */ - public function generateSetterAnnotations($className, $fieldName) - { - return [ - sprintf('Sets %s.', $fieldName), - '', - sprintf( - '@param %s $%s', - $this->toPhpType($this->classes[$className]['fields'][$fieldName]), - $fieldName - ), - '', - '@return $this', - ]; - } - - /** - * {@inheritdoc} - */ - public function generateAdderAnnotations($className, $fieldName) - { - return [ - sprintf('Adds %s.', $fieldName), - '', - sprintf( - '@param %s $%s', - $this->toPhpType($this->classes[$className]['fields'][$fieldName], true), - $fieldName - ), - '', - '@return $this', - ]; - } - - /** - * {@inheritdoc} - */ - public function generateRemoverAnnotations($className, $fieldName) - { - return [ - sprintf('Removes %s.', $fieldName), - '', - sprintf( - '@param %s $%s', - $this->toPhpType($this->classes[$className]['fields'][$fieldName], true), - $fieldName - ), - '', - '@return $this', - ]; - } - - /** - * Generates class or interface PHPDoc. - * - * @param string $className - * @param bool $interface - * - * @return array - */ - private function generateDoc($className, $interface = false) - { - $resource = $this->classes[$className]['resource']; - $annotations = []; - - if (!$interface && isset($this->classes[$className]['interfaceName'])) { - $annotations[] = '{@inheritdoc}'; - $annotations[] = ''; - } else { - $annotations = $this->formatDoc($resource->get('rdfs:comment')); - $annotations[] = ''; - $annotations[] = sprintf('@see %s %s', $resource->getUri(), 'Documentation on Schema.org'); - } - - if ($this->config['author']) { - $annotations[] = sprintf('@author %s', $this->config['author']); - } - - return $annotations; - } - - /** - * Converts HTML to Markdown and explode. - * - * @param string $doc - * @param bool $indent - * - * @return array - */ - private function formatDoc($doc, $indent = false) - { - $doc = explode("\n", (new \HTML_To_Markdown($doc))->output()); - - if ($indent) { - $count = count($doc); - for ($i = 1; $i < $count; $i++) { - $doc[$i] = self::INDENT.$doc[$i]; - } - } - - return $doc; - } -} diff --git a/src/SchemaOrgModel/CardinalitiesExtractor.php b/src/SchemaOrgModel/CardinalitiesExtractor.php deleted file mode 100644 index bfd742e5..00000000 --- a/src/SchemaOrgModel/CardinalitiesExtractor.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel; - -/** - * Cardinality extractor. - * - * @author Kévin Dunglas - */ -class CardinalitiesExtractor -{ - const CARDINALITY_0_1 = '(0..1)'; - const CARDINALITY_0_N = '(0..*)'; - const CARDINALITY_1_1 = '(1..1)'; - const CARDINALITY_1_N = '(1..*)'; - const CARDINALITY_N_0 = '(*..0)'; - const CARDINALITY_N_1 = '(*..1)'; - const CARDINALITY_N_N = '(*..*)'; - const CARDINALITY_UNKNOWN = 'unknown'; - - /** - * @var \EasyRdf_Graph[] - */ - private $graphs; - /** - * @var GoodRelationsBridge - */ - private $goodRelationsBridge; - - /** - * @param \EasyRdf_Graph[] $graphs - * @param GoodRelationsBridge $goodRelationsBridge - */ - public function __construct(array $graphs, GoodRelationsBridge $goodRelationsBridge) - { - $this->graphs = $graphs; - $this->goodRelationsBridge = $goodRelationsBridge; - } - - /** - * Extracts cardinality of properties. - * - * @return array - */ - public function extract() - { - $properties = []; - - foreach ($this->graphs as $graph) { - foreach ($graph->allOfType('rdf:Property') as $property) { - $properties[$property->localName()] = $this->extractForProperty($property); - } - } - - return $properties; - } - - /** - * Extracts the cardinality of a property. - * - * Based on [Geraint Luff work](https://github.com/geraintluff/schema-org-gen). - * - * @param \EasyRdf_Resource $property - * - * @return string The cardinality - */ - private function extractForProperty(\EasyRdf_Resource $property) - { - $localName = $property->localName(); - $fromGoodRelations = $this->goodRelationsBridge->extractCardinality($localName); - if ($fromGoodRelations) { - return $fromGoodRelations; - } - - $comment = $property->get('rdfs:comment')->getValue(); - - if ( - // http://schema.org/acceptedOffer, http://schema.org/acceptedPaymentMethod, http://schema.org/exerciseType - preg_match('/\(s\)/', $comment) - || - // http://schema.org/follows - preg_match('/^The most generic uni-directional social relation./', $comment) - || - preg_match('/one or more/i', $comment) - ) { - return self::CARDINALITY_0_N; - } - - if ( - preg_match('/^is/', $localName) - || - preg_match('/^The /', $comment) - ) { - return self::CARDINALITY_0_1; - } - - return self::CARDINALITY_UNKNOWN; - } -} diff --git a/src/SchemaOrgModel/Command/ExtractCardinalitiesCommand.php b/src/SchemaOrgModel/Command/ExtractCardinalitiesCommand.php deleted file mode 100644 index 40912611..00000000 --- a/src/SchemaOrgModel/Command/ExtractCardinalitiesCommand.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\Command; - -use SchemaOrgModel\CardinalitiesExtractor; -use SchemaOrgModel\TypesGeneratorConfiguration; -use SchemaOrgModel\GoodRelationsBridge; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Extract cardinality command. - * - * @author Kévin Dunglas - */ -class ExtractCardinalitiesCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('extract-cardinalities') - ->setDescription('Extract properties\' cardinality') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $relations = []; - $schemaOrg = new \EasyRdf_Graph(); - $schemaOrg->load(TypesGeneratorConfiguration::SCHEMA_ORG_RDFA_URL, 'rdfa'); - $relations[] = $schemaOrg; - - $goodRelations = [new \SimpleXMLElement(TypesGeneratorConfiguration::GOOD_RELATIONS_OWL_URL, 0, true)]; - - $goodRelationsBridge = new GoodRelationsBridge($goodRelations); - $cardinalitiesExtractor = new CardinalitiesExtractor($relations, $goodRelationsBridge); - $result = $cardinalitiesExtractor->extract(); - - $output->writeln(json_encode($result, JSON_PRETTY_PRINT)); - } -} diff --git a/src/SchemaOrgModel/Command/GenerateTypesCommand.php b/src/SchemaOrgModel/Command/GenerateTypesCommand.php deleted file mode 100644 index 9335ac16..00000000 --- a/src/SchemaOrgModel/Command/GenerateTypesCommand.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel\Command; - -use SchemaOrgModel\TypesGenerator; -use SchemaOrgModel\TypesGeneratorConfiguration; -use SchemaOrgModel\GoodRelationsBridge; -use SchemaOrgModel\CardinalitiesExtractor; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Logger\ConsoleLogger; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Config\Definition\Processor; -use Symfony\Component\Yaml\Parser; - -/** - * Generate entities command. - * - * @author Kévin Dunglas - */ -class GenerateTypesCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('generate-types') - ->setDescription('Generate types') - ->addArgument('output', InputArgument::REQUIRED, 'The output directory') - ->addArgument('config', InputArgument::OPTIONAL, 'The config file to use') - ; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $configArgument = $input->getArgument('config'); - if ($configArgument) { - $parser = new Parser(); - $config = $parser->parse(file_get_contents($configArgument)); - unset($parser); - } else { - $config = []; - } - - $processor = new Processor(); - $configuration = new TypesGeneratorConfiguration(); - $processedConfiguration = $processor->processConfiguration($configuration, [$config]); - $processedConfiguration['output'] = realpath($input->getArgument('output')); - if (!$processedConfiguration['output']) { - throw new \RuntimeException('The specified output is invalid'); - } - - $graphs = []; - foreach ($processedConfiguration['rdfa'] as $rdfa) { - $graph = new \EasyRdf_Graph(); - if ('http://' === substr($rdfa, 0, 7) || 'https://' === substr($rdfa, 0, 8)) { - $graph->load($rdfa, 'rdfa'); - } else { - $graph->parseFile($rdfa); - } - - $graphs[] = $graph; - } - - $relations = []; - foreach ($processedConfiguration['relations'] as $relation) { - $relations[] = new \SimpleXMLElement($relation, 0, true); - } - - $goodRelationsBridge = new GoodRelationsBridge($relations); - $cardinalitiesExtractor = new CardinalitiesExtractor($graphs, $goodRelationsBridge); - - $ucfirstFilter = new \Twig_SimpleFilter('ucfirst', 'ucfirst'); - $loader = new \Twig_Loader_Filesystem(__DIR__.'/../../../templates/'); - $twig = new \Twig_Environment($loader, ['autoescape' => false, 'debug' => $processedConfiguration['debug']]); - $twig->addFilter($ucfirstFilter); - - if ($processedConfiguration['debug']) { - $twig->addExtension(new \Twig_Extension_Debug()); - } - - $logger = new ConsoleLogger($output); - - $entitiesGenerator = new TypesGenerator($twig, $logger, $graphs, $cardinalitiesExtractor, $goodRelationsBridge); - $entitiesGenerator->generate($processedConfiguration); - } -} diff --git a/src/SchemaOrgModel/TypesGenerator.php b/src/SchemaOrgModel/TypesGenerator.php deleted file mode 100644 index fcc8a892..00000000 --- a/src/SchemaOrgModel/TypesGenerator.php +++ /dev/null @@ -1,740 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel; - -use Psr\Log\LoggerInterface; -use Symfony\CS\Config\Config; -use Symfony\CS\ConfigurationResolver; -use Symfony\CS\Fixer; - -/** - * Entities generator. - * - * @author Kévin Dunglas - */ -class TypesGenerator -{ - /** - * @var string - * - * @see https://github.com/myclabs/php-enum Used enum implementation - */ - const ENUM_USE = 'MyCLabs\Enum\Enum'; - /** - * @var string - * - * @see https://github.com/doctrine/collections - */ - const DOCTRINE_COLLECTION_USE = 'Doctrine\Common\Collections\ArrayCollection'; - /** - * @var string - * - * @see https://github.com/myclabs/php-enum Used enum implementation - */ - const ENUM_EXTENDS = 'Enum'; - /** - * @var string - */ - const SCHEMA_ORG_NAMESPACE = 'http://schema.org/'; - /** - * @var string - */ - const SCHEMA_ORG_ENUMERATION = 'http://schema.org/Enumeration'; - /** - * @var string - */ - const SCHEMA_ORG_DOMAIN = 'schema:domainIncludes'; - /** - * @var string - */ - const SCHEMA_ORG_RANGE = 'schema:rangeIncludes'; - - /** - * @var \Twig_Environment - */ - private $twig; - /** - * @var LoggerInterface - */ - private $logger; - /** - * @var \EasyRdf_Graph[] - */ - private $graphs; - /** - * @var CardinalitiesExtractor - */ - private $cardinalitiesExtractor; - /** - * @var GoodRelationsBridge - */ - private $goodRelationsBridge; - /** - * @var array - */ - private $cardinalities; - - /** - * @param \Twig_Environment $twig - * @param LoggerInterface $logger - * @param \EasyRdf_Graph[] $graphs - * @param CardinalitiesExtractor $cardinalitiesExtractor - * @param GoodRelationsBridge $goodRelationsBridge - */ - public function __construct( - \Twig_Environment $twig, - LoggerInterface $logger, - array $graphs, - CardinalitiesExtractor $cardinalitiesExtractor, - GoodRelationsBridge $goodRelationsBridge - ) { - $this->twig = $twig; - $this->logger = $logger; - $this->graphs = $graphs; - $this->cardinalitiesExtractor = $cardinalitiesExtractor; - $this->goodRelationsBridge = $goodRelationsBridge; - - $this->cardinalities = $this->cardinalitiesExtractor->extract(); - } - - /** - * Generates files. - */ - public function generate($config) - { - $baseClass = [ - 'constants' => [], - 'fields' => [], - 'uses' => [], - 'hasConstructor' => false, - 'parentHasConstructor' => false, - 'hasChild' => false, - 'abstract' => false, - ]; - - $typesDefined = !empty($config['types']); - $typesToGenerate = []; - - if (empty($config['types'])) { - foreach ($this->graphs as $graph) { - $typesToGenerate = $graph->allOfType('rdfs:Class'); - } - } else { - foreach ($config['types'] as $key => $value) { - $resource = null; - foreach ($this->graphs as $graph) { - $resources = $graph->resources(); - - if (isset($resources[self::SCHEMA_ORG_NAMESPACE.$key])) { - $resource = $graph->resource(self::SCHEMA_ORG_NAMESPACE.$key, 'rdfs:Class'); - break; - } - } - - if ($resource) { - $typesToGenerate[] = $resource; - } else { - $this->logger->critical('Type "{key}" cannot be found.', ['key' => $key]); - } - } - } - - $classes = []; - $propertiesMap = $this->createPropertiesMap($typesToGenerate); - - foreach ($typesToGenerate as $type) { - $typeConfig = isset($config['types'][$type->localName()]) ? $config['types'][$type->localName()] : null; - $class = $baseClass; - - $class['name'] = $type->localName(); - $class['label'] = $type->get('rdfs:comment')->getValue(); - $class['resource'] = $type; - $class['config'] = $typeConfig; - - $class['isEnum'] = $this->isEnum($type); - if ($class['isEnum']) { - $class['namespace'] = isset($typeConfig['namespace']) ? $typeConfig['namespace'] : $config['namespaces']['enum']; - $class['parent'] = self::ENUM_EXTENDS; - $class['uses'][] = self::ENUM_USE; - - // Constants - foreach ($this->graphs as $graph) { - foreach ($graph->allOfType($type->getUri()) as $instance) { - $class['constants'][$instance->localName()] = [ - 'name' => strtoupper(substr(preg_replace('/([A-Z])/', '_$1', $instance->localName()), 1)), - 'resource' => $instance, - 'value' => $instance->getUri(), - ]; - } - } - } else { - // Entities - $class['namespace'] = isset($typeConfig['namespaces']['class']) ? $typeConfig['namespaces']['class'] : $config['namespaces']['entity']; - - // Parent - $class['parent'] = isset($typeConfig['parent']) ? $typeConfig['parent'] : null; - if (null === $class['parent']) { - $numberOfSupertypes = count($type->all('rdfs:subClassOf')); - - if ($numberOfSupertypes > 1) { - $this->logger->error(sprintf('The type "%s" has several supertypes. Using the first one.', $type->localName())); - } - - $class['parent'] = $numberOfSupertypes ? $type->all('rdfs:subClassOf')[0]->localName() : false; - } - - if ($typesDefined && $class['parent'] && !isset($config['types'][$class['parent']])) { - $this->logger->error(sprintf('The type "%s" (parent of "%s") doesn\'t exist', $class['parent'], $type->localName())); - } - - // Interfaces - if ($config['useInterface']) { - $class['interfaceNamespace'] = isset($typeConfig['namespaces']['interface']) && $typeConfig['namespaces']['interface'] ? $typeConfig['namespaces']['interface'] : $config['namespaces']['interface']; - $class['interfaceName'] = sprintf('%sInterface', $type->localName()); - } - } - - // Fields - foreach ($propertiesMap[$type->getUri()] as $property) { - // Ignore properties not set if using a config file - if (is_array($typeConfig['properties']) && !isset($typeConfig['properties'][$property->localName()])) { - continue; - } - - // Warn when property are not part of GoodRelations - if ($config['checkIsGoodRelations']) { - if (!$this->goodRelationsBridge->exist($property->localName())) { - $this->logger->warning(sprintf('The property "%s" (type "%s") is not part of GoodRelations.', $property->localName(), $type->localName())); - } - } - - // Ignore or warn when properties are legacy - if (preg_match('/legacy spelling/', $property->get('rdfs:comment'))) { - if (isset($typeConfig['properties'])) { - $this->logger->warning(sprintf('The property "%s" (type "%s") is legacy.', $property->localName(), $type->localName())); - } else { - $this->logger->info(sprintf('The property "%s" (type "%s") is legacy. Ignoring.', $property->localName(), $type->localName())); - continue; - } - } - - $ranges = []; - if (isset($typeConfig['properties'][$property->localName()]['range']) && $typeConfig['properties'][$property->localName()]['range']) { - $ranges[] = $typeConfig['properties'][$property->localName()]['range']; - } else { - foreach ($property->all(self::SCHEMA_ORG_RANGE) as $range) { - if (!$typesDefined || $this->isDatatype($range->localName()) || isset($config['types'][$range->localName()])) { - $ranges[] = $range->localName(); - } - } - } - - $numberOfRanges = count($ranges); - if ($numberOfRanges === 0) { - $this->logger->error(sprintf('The property "%s" (type "%s") has an unknown type. Add its type to the config file.', $property->localName(), $type->localName())); - } else { - if ($numberOfRanges > 1) { - $this->logger->error(sprintf('The property "%s" (type "%s") has several types. Using the first one.', $property->localName(), $type->localName())); - } - - $cardinality = isset($typeConfig['properties'][$property->localName()]['cardinality']) ? $typeConfig['properties'][$property->localName()]['cardinality'] : false; - if (!$cardinality || $cardinality === CardinalitiesExtractor::CARDINALITY_UNKNOWN) { - $cardinality = $this->cardinalities[$property->localName()]; - } - - $isArray = in_array($cardinality, [ - CardinalitiesExtractor::CARDINALITY_1_N, - CardinalitiesExtractor::CARDINALITY_N_N, - ]); - $isNullable = !in_array($cardinality, [ - CardinalitiesExtractor::CARDINALITY_1_1, - CardinalitiesExtractor::CARDINALITY_1_N, - ]); - - $class['fields'][$property->localName()] = [ - 'name' => $property->localName(), - 'resource' => $property, - 'range' => $ranges[0], - 'cardinality' => $cardinality, - 'isArray' => $isArray, - 'isNullable' => $isNullable, - 'isId' => false, - ]; - if ($isArray) { - $class['hasConstructor'] = true; - - if ($config['doctrine']['useCollection'] && !in_array(self::DOCTRINE_COLLECTION_USE, $class['uses'])) { - $class['uses'][] = self::DOCTRINE_COLLECTION_USE; - } - } - } - } - - $classes[$type->localName()] = $class; - } - - // Second pass - foreach ($classes as &$class) { - if ($class['parent'] && isset($classes[$class['parent']])) { - $classes[$class['parent']]['hasChild'] = true; - $class['parentHasConstructor'] = $classes[$class['parent']]['hasConstructor']; - } - - foreach ($class['fields'] as &$field) { - $field['isEnum'] = isset($classes[$field['range']]) && $classes[$field['range']]['isEnum']; - } - } - - // Third pass - foreach ($classes as &$class) { - if (isset($config['types'][$class['name']]['abstract']) && null !== $config['types'][$class['name']]['abstract']) { - $class['abstract'] = $config['types'][$class['name']]['abstract']; - } else { - $class['abstract'] = $class['hasChild']; - } - } - - // Generate ID - if ($config['generateId']) { - foreach ($classes as &$class) { - if (!$class['hasChild'] && !$class['isEnum']) { - $class['fields'] = [ - 'id' => [ - 'name' => 'id', - 'resource' => null, - 'range' => 'Integer', - 'cardinality' => CardinalitiesExtractor::CARDINALITY_1_1, - 'isArray' => false, - 'isNullable' => false, - 'isEnum' => false, - 'isId' => true, - ], - ] + $class['fields']; - } - } - } - - // Initialize annotation generators - $annotationGenerators = []; - foreach ($config['annotationGenerators'] as $annotationGenerator) { - $generator = new $annotationGenerator($this->logger, $this->graphs, $this->cardinalities, $config, $classes); - - $annotationGenerators[] = $generator; - } - - if (isset($class['interfaceNamespace']) && $config['doctrine']['resolveTargetEntityConfigPath']) { - $interfaceMappings = []; - } - - $generatedFiles = []; - foreach ($classes as $className => &$class) { - $class['uses'] = $this->generateClassUses($annotationGenerators, $classes, $className); - $class['annotations'] = $this->generateClassAnnotations($annotationGenerators, $className); - $class['interfaceAnnotations'] = $this->generateInterfaceAnnotations($annotationGenerators, $className); - - foreach ($class['constants'] as $constantName => $constant) { - $class['constants'][$constantName]['annotations'] = $this->generateConstantAnnotations($annotationGenerators, $className, $constantName); - } - - foreach ($class['fields'] as $fieldName => &$field) { - $typeHint = false; - if ($this->isDateTime($field['range'])) { - $typeHint = '\\DateTime'; - } elseif (!($this->isDatatype($field['range']) || $field['isEnum'])) { - if (isset($classes[$field['range']]['interfaceName'])) { - $typeHint = $classes[$field['range']]['interfaceName']; - } else { - $typeHint = $classes[$field['range']]['name']; - } - } - - $field['typeHint'] = $typeHint; - $field['annotations'] = $this->generateFieldAnnotations($annotationGenerators, $className, $fieldName); - $field['getterAnnotations'] = $this->generateGetterAnnotations($annotationGenerators, $className, $fieldName); - - if ($field['isArray']) { - $field['adderAnnotations'] = $this->generateAdderAnnotations($annotationGenerators, $className, $fieldName); - $field['removerAnnotations'] = $this->generateRemoverAnnotations($annotationGenerators, $className, $fieldName); - } else { - $field['setterAnnotations'] = $this->generateSetterAnnotations($annotationGenerators, $className, $fieldName); - } - } - - $classDir = $this->namespaceToDir($config, $class['namespace']); - - if (!file_exists($classDir)) { - mkdir($classDir, 0777, true); - } - - $path = sprintf('%s%s.php', $classDir, $className); - $generatedFiles[] = $path; - - file_put_contents( - $path, - $this->twig->render('class.php.twig', [ - 'config' => $config, - 'class' => $class, - ]) - ); - - if (isset($class['interfaceNamespace'])) { - $interfaceDir = $this->namespaceToDir($config, $class['interfaceNamespace']); - - if (!file_exists($interfaceDir)) { - mkdir($interfaceDir, 0777, true); - } - - $path = sprintf('%s%s.php', $interfaceDir, $class['interfaceName']); - $generatedFiles[] = $path; - file_put_contents( - $path, - $this->twig->render('interface.php.twig', [ - 'config' => $config, - 'class' => $class, - ]) - ); - - if ($config['doctrine']['resolveTargetEntityConfigPath'] && !$class['abstract']) { - $interfaceMappings[$class['interfaceNamespace'].'\\'.$class['interfaceName']] = $class['namespace'].'\\'.$className; - } - } - } - - if (isset($interfaceMappings) && $config['doctrine']['resolveTargetEntityConfigPath']) { - $file = $config['output'].'/'.$config['doctrine']['resolveTargetEntityConfigPath']; - $dir = dirname($file); - if (!file_exists($dir)) { - mkdir($dir, 0777, true); - } - - file_put_contents( - $file, - $this->twig->render('doctrine.xml.twig', ['mappings' => $interfaceMappings]) - ); - - $generatedFiles[] = $file; - } - - $this->fixCs($generatedFiles); - } - - /** - * Tests if a type is an enum. - * - * @param \EasyRdf_Resource $type - * - * @return bool - */ - private function isEnum(\EasyRdf_Resource $type) - { - $subClassOf = $type->get('rdfs:subClassOf'); - - return $subClassOf && $subClassOf->getUri() === self::SCHEMA_ORG_ENUMERATION; - } - - /** - * Create a maps between class an properties. - * - * @param array $types - * - * @return array - */ - private function createPropertiesMap(array $types) - { - $typesAsString = []; - $map = []; - foreach ($types as $type) { - $typesAsString[] = $type->getUri(); - $map[$type->getUri()] = []; - } - - foreach ($this->graphs as $graph) { - foreach ($graph->allOfType('rdf:Property') as $property) { - foreach ($property->all(self::SCHEMA_ORG_DOMAIN) as $domain) { - if (in_array($domain->getUri(), $typesAsString)) { - $map[$domain->getUri()][] = $property; - } - } - } - } - - return $map; - } - - /** - * Is this type a datatype? - * - * @param string $type - * - * @return bool - */ - private function isDatatype($type) - { - return in_array($type, ['Boolean', 'DataType', 'Date', 'DateTime', 'Float', 'Integer', 'Number', 'Text', 'Time', 'URL']); - } - - /** - * Is this type a \DateTime? - * - * @param $type - * - * @return bool - */ - private function isDateTime($type) - { - return in_array($type, ['Date', 'DateTime', 'Time']); - } - - /** - * Generates field's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $fieldName - * - * @return array - */ - private function generateFieldAnnotations($annotationGenerators, $className, $fieldName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateFieldAnnotations($className, $fieldName)); - } - - return $annotations; - } - - /** - * Generates constant's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $constantName - * - * @return array - */ - private function generateConstantAnnotations(array $annotationGenerators, $className, $constantName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateConstantAnnotations($className, $constantName)); - } - - return $annotations; - } - - /** - * Generates class' annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * - * @return array - */ - private function generateClassAnnotations(array $annotationGenerators, $className) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateClassAnnotations($className)); - } - - return $annotations; - } - - /** - * Generates interface's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * - * @return array - */ - private function generateInterfaceAnnotations(array $annotationGenerators, $className) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateInterfaceAnnotations($className)); - } - - return $annotations; - } - - /** - * Generates getter's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $fieldName - * - * @return array - */ - private function generateGetterAnnotations(array $annotationGenerators, $className, $fieldName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateGetterAnnotations($className, $fieldName)); - } - - return $annotations; - } - - /** - * Generates adder's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $fieldName - * - * @return array - */ - private function generateAdderAnnotations(array $annotationGenerators, $className, $fieldName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateAdderAnnotations($className, $fieldName)); - } - - return $annotations; - } - - /** - * Generates remover's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $fieldName - * - * @return array - */ - private function generateRemoverAnnotations(array $annotationGenerators, $className, $fieldName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateRemoverAnnotations($className, $fieldName)); - } - - return $annotations; - } - - /** - * Generates getter's annotations. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param string $className - * @param string $fieldName - * - * @return array - */ - private function generateSetterAnnotations(array $annotationGenerators, $className, $fieldName) - { - $annotations = []; - foreach ($annotationGenerators as $generator) { - $annotations = array_merge($annotations, $generator->generateSetterAnnotations($className, $fieldName)); - } - - return $annotations; - } - - /** - * Generates uses. - * - * @param \SchemaOrgModel\AnnotationGenerator\AnnotationGeneratorInterface[] $annotationGenerators - * @param array $classes - * @param string $className - * - * @return array - */ - private function generateClassUses($annotationGenerators, $classes, $className) - { - $uses = $classes[$className]['uses']; - - if ( - isset($classes[$className]['interfaceNamespace']) - && $classes[$className]['interfaceNamespace'] !== $classes[$className]['namespace'] - ) { - $uses[] = sprintf( - '%s\\%s', - $classes[$className]['interfaceNamespace'], - $classes[$className]['interfaceName'] - ); - } - - foreach ($classes[$className]['fields'] as $field) { - if (isset($classes[$field['range']]['interfaceName'])) { - $use = sprintf( - '%s\\%s', - $classes[$field['range']]['interfaceNamespace'], - $classes[$field['range']]['interfaceName'] - ); - - if (!in_array($use, $uses)) { - $uses[] = $use; - } - } - } - - foreach ($annotationGenerators as $generator) { - $uses = array_merge($uses, $generator->generateUses($className)); - } - - // Order alphabetically - sort($uses); - - return $uses; - } - - /** - * Converts a namespace to a directory path according to PSR-4. - * - * @param array $config - * @param string $namespace - * - * @return string - */ - private function namespaceToDir($config, $namespace) - { - return sprintf('%s/%s/', $config['output'], strtr($namespace, '\\', '/')); - } - - /** - * Uses PHP CS Fixer to make generated files following PSR and Symfony Coding Standards. - * - * @param array $files - */ - private function fixCs(array $files) - { - $config = new Config(); - $fixer = new Fixer(); - $fixer->registerBuiltInConfigs(); - $fixer->registerBuiltInFixers(); - - $resolver = new ConfigurationResolver(); - $resolver - ->setAllFixers($fixer->getFixers()) - ->setConfig($config) - ->setOptions(array( - 'level' => 'symfony', - 'fixers' => null, - 'progress' => false, - )) - ->resolve() - ; - - $config->fixers($resolver->getFixers()); - - $finder = []; - foreach ($files as $file) { - $finder[] = new \SplFileInfo($file); - } - - $config->finder(new \ArrayIterator($finder)); - $fixer->fix($config); - } -} diff --git a/src/SchemaOrgModel/TypesGeneratorConfiguration.php b/src/SchemaOrgModel/TypesGeneratorConfiguration.php deleted file mode 100644 index 4b440de3..00000000 --- a/src/SchemaOrgModel/TypesGeneratorConfiguration.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace SchemaOrgModel; - -use Symfony\Component\Config\Definition\Builder\TreeBuilder; -use Symfony\Component\Config\Definition\ConfigurationInterface; - -/** - * Types Generator Configuration. - * - * @author Kévin Dunglas - */ -class TypesGeneratorConfiguration implements ConfigurationInterface -{ - const SCHEMA_ORG_RDFA_URL = 'http://schema.org/docs/schema_org_rdfa.html'; - const GOOD_RELATIONS_OWL_URL = 'http://purl.org/goodrelations/v1.owl'; - - /** - * {@inheritdoc} - */ - public function getConfigTreeBuilder() - { - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('config'); - $rootNode - ->children() - ->arrayNode('rdfa') - ->info('RDFa files to use') - ->defaultValue([ - self::SCHEMA_ORG_RDFA_URL, - ]) - ->prototype('scalar')->end() - ->end() - ->arrayNode('relations') - ->info('OWL relation files to use') - ->defaultValue([ - self::GOOD_RELATIONS_OWL_URL, - ]) - ->prototype('scalar')->end() - ->end() - ->booleanNode('debug')->defaultFalse()->info('Debug mode')->end() - ->booleanNode('generateId')->defaultTrue()->info('Automatically add an id field to entities')->end() - ->booleanNode('useInterface')->defaultFalse()->info('Generate interfaces and use Doctrine\'s Resolve Target Entity feature')->end() - ->booleanNode('checkIsGoodRelations')->defaultFalse()->info('Emit a warning if a property is not derived from GoodRelations')->end() - ->scalarNode('header')->defaultFalse()->info('A license or any text to use as header of generated files')->example('// (c) Kévin Dunglas ')->end() - ->arrayNode('namespaces') - ->addDefaultsIfNotSet() - ->info('PHP namespaces') - ->children() - ->scalarNode('entity')->defaultValue('SchemaOrg\Entity')->info('The namespace of the generated entities')->example('Acme\Entity')->end() - ->scalarNode('enum')->defaultValue('SchemaOrg\Enum')->info('The namespace of the generated enumerations')->example('Acme\Enum')->end() - ->scalarNode('interface')->defaultValue('SchemaOrg\Model')->info('The namespace of the generated interfaces')->example('Acme\Model')->end() - ->end() - ->end() - ->arrayNode('doctrine') - ->addDefaultsIfNotSet() - ->info('Doctrine') - ->children() - ->booleanNode('useCollection')->defaultTrue()->info('Use Doctrine\'s ArrayCollection instead of standard arrays')->end() - ->scalarNode('resolveTargetEntityConfigPath')->defaultNull()->info('The Resolve Target Entity Listener config file pass')->end() - ->end() - ->end() - ->scalarNode('author')->defaultFalse()->info('The value of the phpDoc\'s @author annotation')->example('Kévin Dunglas ')->end() - ->enumNode('fieldVisibility')->values(['private', 'protected', 'public'])->defaultValue('private')->cannotBeEmpty()->info('Visibility of entities fields')->end() - ->arrayNode('types') - ->info('Schema.org\'s types to use') - ->useAttributeAsKey('id') - ->prototype('array') - ->children() - ->booleanNode('abstract')->defaultNull()->info('Is the class abstract? (null to guess)')->end() - ->arrayNode('namespaces') - ->addDefaultsIfNotSet() - ->info('Type namespaces') - ->children() - ->scalarNode('class')->defaultNull()->info('The namespace for the generated class (override any other defined namespace)')->end() - ->scalarNode('interface')->defaultNull()->info('The namespace for the generated interface (override any other defined namespace)')->end() - ->end() - ->end() - ->arrayNode('doctrine') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('inheritanceMapping')->defaultNull()->info('The Doctrine inheritance mapping type (override the guessed one)')->end() - ->end() - ->end() - ->scalarNode('parent')->defaultNull()->info('The parent class, set to false for a top level class')->end() - ->arrayNode('properties') - ->info('Properties of this type to use') - ->useAttributeAsKey('id') - ->prototype('array') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('range')->defaultNull()->info('The property range')->example('Offer')->end() - ->enumNode('cardinality')->defaultValue(CardinalitiesExtractor::CARDINALITY_UNKNOWN)->values([ - CardinalitiesExtractor::CARDINALITY_0_1, - CardinalitiesExtractor::CARDINALITY_0_N, - CardinalitiesExtractor::CARDINALITY_1_1, - CardinalitiesExtractor::CARDINALITY_1_N, - CardinalitiesExtractor::CARDINALITY_N_0, - CardinalitiesExtractor::CARDINALITY_N_1, - CardinalitiesExtractor::CARDINALITY_N_N, - CardinalitiesExtractor::CARDINALITY_UNKNOWN, - ])->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->arrayNode('annotationGenerators') - ->info('Annotation generators to use') - ->defaultValue([ - 'SchemaOrgModel\AnnotationGenerator\PhpDocAnnotationGenerator', - 'SchemaOrgModel\AnnotationGenerator\ConstraintAnnotationGenerator', - 'SchemaOrgModel\AnnotationGenerator\DoctrineOrmAnnotationGenerator', - ]) - ->prototype('scalar')->end() - ->end() - ->end() - ; - - return $treeBuilder; - } -} diff --git a/src/TwigBuilder.php b/src/TwigBuilder.php new file mode 100644 index 00000000..c066b3a2 --- /dev/null +++ b/src/TwigBuilder.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use Twig\Environment; +use Twig\Extension\DebugExtension; +use Twig\Loader\FilesystemLoader; + +final class TwigBuilder +{ + /** + * @param Configuration $config + */ + public function build(array $config): Environment + { + $templatePaths = $config['generatorTemplates']; + $templatePaths[] = __DIR__.'/../templates/'; + $loader = new FilesystemLoader($templatePaths); + + $twig = new Environment($loader, ['autoescape' => false, 'debug' => $config['debug']]); + if ($config['debug']) { + $twig->addExtension(new DebugExtension()); + } + + return $twig; + } +} diff --git a/src/TypesGenerator.php b/src/TypesGenerator.php new file mode 100644 index 00000000..23f3ba7a --- /dev/null +++ b/src/TypesGenerator.php @@ -0,0 +1,513 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator; + +use ApiPlatform\SchemaGenerator\ClassMutator\AnnotationsAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\AttributeAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassIdAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassInterfaceMutator; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassParentMutator; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassPropertiesAppender; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassPropertiesTypehintMutator; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PropertyGenerator\PropertyGeneratorInterface; +use ApiPlatform\SchemaGenerator\Schema\ClassMutator\EnumClassMutator as SchemaEnumClassMutator; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; +use ApiPlatform\SchemaGenerator\Schema\PropertyGenerator\IdPropertyGenerator; +use ApiPlatform\SchemaGenerator\Schema\PropertyGenerator\PropertyGenerator; +use ApiPlatform\SchemaGenerator\Schema\TypeConverter; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\RdfNamespace; +use EasyRdf\Resource as RdfResource; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\LoggerInterface; +use Symfony\Component\String\Inflector\InflectorInterface; + +/** + * Generates entity files. + * + * @author Kévin Dunglas + */ +class TypesGenerator +{ + use LoggerAwareTrait; + + /** + * @var string + * + * @internal + */ + public const SCHEMA_ORG_ENUMERATION = 'https://schema.org/Enumeration'; + + /** + * @var string[] the RDF types of classes in the vocabs + */ + public static array $classTypes = [ + 'rdfs:Class', + 'owl:Class', + ]; + + /** + * @var string[] the RDF types of properties in the vocabs + */ + public static array $propertyTypes = [ + 'rdf:Property', + 'owl:ObjectProperty', + 'owl:DatatypeProperty', + ]; + + /** + * @var string[] the RDF types of domains in the vocabs + */ + public static array $domainProperties = [ + 'schema:domainIncludes', + 'rdfs:domain', + ]; + + private PhpTypeConverterInterface $phpTypeConverter; + private InflectorInterface $inflector; + private CardinalitiesExtractor $cardinalitiesExtractor; + private PropertyGeneratorInterface $propertyGenerator; + + public function __construct(InflectorInterface $inflector, PhpTypeConverterInterface $phpTypeConverter, CardinalitiesExtractor $cardinalitiesExtractor, GoodRelationsBridge $goodRelationsBridge) + { + $this->inflector = $inflector; + $this->phpTypeConverter = $phpTypeConverter; + $this->cardinalitiesExtractor = $cardinalitiesExtractor; + $this->propertyGenerator = new PropertyGenerator($goodRelationsBridge, new TypeConverter(), $phpTypeConverter); + + RdfNamespace::set('schema', 'https://schema.org/'); + } + + /** + * Generates files. + * + * @param RdfGraph[] $graphs + * @param Configuration $config + * + * @return Class_[] + */ + public function generate(array $graphs, array $config): array + { + if (!$graphs) { + throw new \InvalidArgumentException('At least one graph must be injected.'); + } + + [$typeNamesToGenerate, $types] = $this->defineTypesToGenerate($graphs, $config); + + $classes = []; + $propertiesMap = $this->createPropertiesMap($graphs, $types, $config); + $cardinalities = $this->cardinalitiesExtractor->extract($graphs); + + foreach ($types as $typeName => $type) { + if ($class = $this->buildClass($graphs, $cardinalities, $typeName, $type, $propertiesMap, $config)) { + $classes[$typeName] = $class; + } + } + + foreach ($typeNamesToGenerate as $typeNameToGenerate) { + $class = $classes[$typeNameToGenerate]; + while (($parent = $class->parent()) && !$class->isParentEnum()) { + if (!isset($classes[$parent])) { + $this->logger ? $this->logger->error(\sprintf('The type "%s" (parent of "%s") doesn\'t exist', $parent, $class->rdfType())) : null; + break; + } + if (!\in_array($parent, $typeNamesToGenerate, true)) { + $typeNamesToGenerate[] = $parent; + } + $class = $classes[$parent]; + } + } + /** + * @var array $classes + */ + $classes = array_intersect_key($classes, array_flip($typeNamesToGenerate)); + $types = array_intersect_key($types, array_flip($typeNamesToGenerate)); + + $referencedByClasses = []; + + // Second pass + foreach ($classes as $class) { + if ($class->hasParent() && !$class->isParentEnum()) { + $parentClass = $classes[$class->parent()] ?? null; + if ($parentClass) { + $parentClass->hasChild = true; + $class->parentHasConstructor = $parentClass->hasConstructor; + } + } + + foreach ($class->properties() as $property) { + if (!$property instanceof SchemaProperty) { + throw new \LogicException(\sprintf('Property "%s" has to be an instance of "%s".', $property->name(), SchemaProperty::class)); + } + $typeName = $property->rangeName; + if (isset($classes[$typeName])) { + $property->reference = $classes[$typeName]; + $referencedByClasses[$typeName][$class->name()] = $class; + } + } + + (new ClassPropertiesTypehintMutator($this->phpTypeConverter, $config, $classes))($class, []); + } + + // Third pass + foreach ($classes as $class) { + $class->isReferencedBy = $referencedByClasses[$class->name()] ?? []; + /* @var $class SchemaClass */ + $class->isAbstract = $config['types'][$class->name()]['abstract'] + // Class is abstract if it has child and if it is not referenced by a relation + ?? ($class->hasChild && !$class->isReferencedBy); + + // When including all properties, ignore properties already set on parent + if (($config['types'][$class->name()]['allProperties'] ?? true) && isset($classes[$class->parent()])) { + $type = $class->resource(); + foreach ($propertiesMap[$type->getUri()] as $property) { + if (!\is_string($propertyName = $property->localName())) { + continue; + } + if (!$class->hasProperty($propertyName)) { + continue; + } + + $parentConfig = $config['types'][$class->parent()] ?? null; + $parentClass = $classes[$class->parent()]; + + while ($parentClass) { + if (\array_key_exists($propertyName, $parentConfig['properties'] ?? []) || \in_array($property, $propertiesMap[$parentClass->rdfType()], true)) { + $class->removePropertyByName($propertyName); + continue 2; + } + + $parentConfig = $parentClass->parent() ? ($config['types'][$parentClass->parent()] ?? null) : null; + $parentClass = $parentClass->parent() && isset($classes[$parentClass->parent()]) ? $classes[$parentClass->parent()] : null; + } + } + } + } + + // Generate ID + if ($config['id']['generate']) { + foreach ($classes as $class) { + (new ClassIdAppender(new IdPropertyGenerator(), $config))($class, []); + } + } + + // Initialize annotation generators + $annotationGenerators = []; + foreach ($config['annotationGenerators'] as $annotationGenerator) { + $generator = new $annotationGenerator($this->phpTypeConverter, $this->inflector, $config, $classes); + if (method_exists($generator, 'setLogger')) { + $generator->setLogger($this->logger); + } + + $annotationGenerators[] = $generator; + } + + // Initialize attribute generators + $attributeGenerators = []; + foreach ($config['attributeGenerators'] as $attributeGenerator) { + $generator = new $attributeGenerator($this->phpTypeConverter, $this->inflector, $config, $classes); + if (method_exists($generator, 'setLogger')) { + $generator->setLogger($this->logger); + } + + $attributeGenerators[] = $generator; + } + + $attributeAppender = new AttributeAppender($classes, $attributeGenerators); + foreach ($classes as $class) { + (new AnnotationsAppender($classes, $annotationGenerators, $types))($class, []); + $attributeAppender($class, []); + } + foreach ($classes as $class) { + $attributeAppender->appendLate($class); + } + + return $classes; + } + + /** + * @param RdfGraph[] $graphs + * @param array $cardinalities + * @param array $propertiesMap + * @param Configuration $config + */ + private function buildClass(array $graphs, array $cardinalities, string $typeName, RdfResource $type, array $propertiesMap, array $config): ?SchemaClass + { + if ($type->isA('owl:DeprecatedClass')) { + if (!isset($config['types'][$typeName])) { + return null; + } + + $this->logger ? $this->logger->warning('The type "{type}" is deprecated', ['type' => $type->getUri()]) : null; + } + + $typeConfig = $config['types'][$typeName] ?? null; + $parent = $typeConfig['parent'] ?? null; + $class = new SchemaClass($typeName, $type, $parent); + $class->operations = $typeConfig['operations'] ?? []; + + if ($class->isEnum()) { + (new SchemaEnumClassMutator( + $this->phpTypeConverter, + $graphs, + $config['namespaces']['enum'] + ))($class, []); + } else { + $class->namespace = $typeConfig['namespaces']['class'] ?? $config['namespaces']['entity']; + + // Interfaces + if ($config['useInterface']) { + $interfaceNamespace = isset($typeConfig['namespaces']['interface']) && $typeConfig['namespaces']['interface'] ? $typeConfig['namespaces']['interface'] : $config['namespaces']['interface']; + (new ClassInterfaceMutator($interfaceNamespace))($class, []); + } + + $classParentMutator = new ClassParentMutator($config, $this->phpTypeConverter); + if ($this->logger) { + $classParentMutator->setLogger($this->logger); + } + ($classParentMutator)($class, []); + } + + $classPropertiesAppender = new ClassPropertiesAppender($this->propertyGenerator, $config, $propertiesMap); + if ($this->logger) { + $classPropertiesAppender->setLogger($this->logger); + } + ($classPropertiesAppender)($class, ['graphs' => $graphs, 'cardinalities' => $cardinalities]); + $class->isEmbeddable = $typeConfig['embeddable'] ?? false; + + if ($config['doctrine']['useCollection']) { + $class->addUse(new Use_(ArrayCollection::class)); + $class->addUse(new Use_(Collection::class)); + } + + return $class; + } + + /** + * Gets the parent classes of the current one and add them to $parentClasses array. + * + * @param RdfGraph[] $graphs + * @param RdfResource[] $parentClasses + * + * @return RdfResource[] + */ + private function getParentClasses(array $graphs, RdfResource $resource, array $parentClasses = []): array + { + if ([] === $parentClasses) { + return $this->getParentClasses($graphs, $resource, [$resource]); + } + + $filterBNodes = fn ($parentClasses) => array_filter($parentClasses, fn ($parentClass) => !$parentClass->isBNode()); + if (!$subclasses = $resource->all('rdfs:subClassOf', 'resource')) { + return $filterBNodes($parentClasses); + } + + $parentClassUri = $subclasses[0]->getUri(); + $parentClasses[] = $subclasses[0]; + + foreach ($graphs as $graph) { + foreach (self::$classTypes as $classType) { + foreach ($graph->allOfType($classType) as $type) { + if ($type->getUri() === $parentClassUri) { + return $this->getParentClasses($graphs, $type, $parentClasses); + } + } + } + } + + return $filterBNodes($parentClasses); + } + + /** + * Creates a map between classes and properties. + * + * @param RdfGraph[] $graphs + * @param RdfResource[] $types + * @param Configuration $config + * + * @return array + */ + private function createPropertiesMap(array $graphs, array $types, array $config): array + { + $typesResources = []; + $map = []; + foreach ($types as $type) { + // get all parent classes until the root + $parentClasses = $this->getParentClasses($graphs, $type); + $typesResources[] = [ + 'resources' => $parentClasses, + 'uris' => array_map(static fn (RdfResource $parentClass) => $parentClass->getUri(), $parentClasses), + 'names' => array_map(fn (RdfResource $parentClass) => \is_string($parentClass->localName()) ? $this->phpTypeConverter->escapeIdentifier($parentClass->localName()) : $parentClass->getUri(), $parentClasses), + ]; + $map[$type->getUri()] = []; + } + + foreach ($graphs as $graph) { + foreach (self::$propertyTypes as $propertyType) { + /** @var RdfResource $property */ + foreach ($graph->allOfType($propertyType) as $property) { + if ($property->isBNode()) { + continue; + } + + foreach (self::$domainProperties as $domainPropertyType) { + foreach ($property->all($domainPropertyType, 'resource') as $domain) { + $this->addPropertyToMap($property, $domain, $typesResources, $config, $map); + } + } + } + } + } + + return $map; + } + + /** + * @param array{resources: RdfResource[], uris: string[], names: string[]}[] $typesResources + * @param Configuration $config + * @param array $map + */ + private function addPropertyToMap(RdfResource $property, RdfResource $domain, array $typesResources, array $config, array &$map): void + { + $propertyName = $property->getUri(); + if (\is_string($property->localName())) { + $propertyName = $property->localName(); + } + $deprecated = $property->isA('owl:DeprecatedProperty'); + + if ($domain->isBNode()) { + if (null !== ($unionOf = $domain->get('owl:unionOf'))) { + $this->addPropertyToMap($property, $unionOf, $typesResources, $config, $map); + + return; + } + + if (null !== ($rdfFirst = $domain->get('rdf:first'))) { + $this->addPropertyToMap($property, $rdfFirst, $typesResources, $config, $map); + if (null !== ($rdfRest = $domain->get('rdf:rest'))) { + $this->addPropertyToMap($property, $rdfRest, $typesResources, $config, $map); + } + } + + return; + } + + foreach ($typesResources as $typesResourceHierarchy) { + foreach ($typesResourceHierarchy['uris'] as $k => $typeUri) { + if ($domain->getUri() !== $typeUri) { + continue; + } + + $propertyConfig = $config['types'][$typesResourceHierarchy['names'][$k]]['properties'][$propertyName] ?? null; + + if ($propertyConfig['exclude'] ?? false) { + continue; + } + + if ($deprecated) { + if (null === $propertyConfig) { + continue; + } + + $this->logger ? $this->logger->warning('The property "{property}" of the type "{type}" is deprecated', ['property' => $property->getUri(), 'type' => $typeUri]) : null; + } + + $map[$typeUri][] = $property; + } + } + } + + /** + * @param RdfGraph[] $graphs + * @param Configuration $config + * + * @return array{0: string[], 1: array} + */ + private function defineTypesToGenerate(array $graphs, array $config): array + { + $typeNamesToGenerate = []; + $allTypes = []; + + foreach ($graphs as $graph) { + $vocabAllTypes = $config['vocabularies'][$graph->getUri()]['allTypes'] ?? $config['allTypes']; + foreach (self::$classTypes as $classType) { + foreach ($graph->allOfType($classType) as $type) { + if ($type->isBNode()) { + continue; + } + + $typeName = $this->phpTypeConverter->escapeIdentifier($type->localName()); + if (!($config['types'][$typeName]['exclude'] ?? false)) { + if ($config['resolveTypes'] || $vocabAllTypes) { + $allTypes[$typeName] = $type; + } + if ($vocabAllTypes) { + $typeNamesToGenerate[] = $typeName; + } + } + } + } + } + + foreach ($config['types'] as $typeName => $typeConfig) { + if ($typeConfig['exclude']) { + continue; + } + $vocabularyNamespace = $typeConfig['vocabularyNamespace'] ?? $config['vocabularyNamespace']; + + $resource = null; + foreach ($graphs as $graph) { + $resources = $graph->resources(); + + $typeIri = $vocabularyNamespace.$typeName; + if (isset($resources[$typeIri])) { + $resource = $graph->resource($typeIri); + break; + } + } + + $typeName = $this->phpTypeConverter->escapeIdentifier($typeName); + if ($resource) { + $allTypes[$typeName] = $resource; + if (!\in_array($typeName, $typeNamesToGenerate, true)) { + $typeNamesToGenerate[] = $typeName; + } + } else { + $this->logger ? $this->logger->warning('Type "{typeName}" cannot be found. Using "{guessFrom}" type to generate entity.', ['typeName' => $typeName, 'guessFrom' => $typeConfig['guessFrom']]) : null; + if (isset($graph)) { + $type = $graph->resource($vocabularyNamespace.$typeConfig['guessFrom']); + $allTypes[$typeName] = $type; + if (!\in_array($typeName, $typeNamesToGenerate, true)) { + $typeNamesToGenerate[] = $typeName; + } + } + } + } + + return [$typeNamesToGenerate, $allTypes]; + } + + public function setLogger(LoggerInterface $logger): void + { + $this->logger = $logger; + if (method_exists($this->propertyGenerator, 'setLogger')) { + $this->propertyGenerator->setLogger($logger); + } + } +} diff --git a/templates/class.php.twig b/templates/class.php.twig deleted file mode 100644 index d8adc177..00000000 --- a/templates/class.php.twig +++ /dev/null @@ -1,111 +0,0 @@ -{# - # (c) Kévin Dunglas - # - # This source file is subject to the MIT license that is bundled - # with this source code in the file LICENSE. - #} -{{ field.name }} = new ArrayCollection(); -{% endif %} -{% endfor %} - } -{% endif %} - -{% for field in class.fields %} -{% if field.isArray %} - /** -{% for annotation in field.adderAnnotations %} - * {{ annotation }} -{% endfor %} - */ - public function add{{ field.name|ucfirst }}({% if field.typeHint and not field.isEnum %}{{ field.typeHint }} {% endif %}${{ field.name }}) - { - $this->{{ field.name }}[] = {% if field.isEnum %}(string) {% endif %}${{ field.name }}; - - return $this; - } - - /** -{% for annotation in field.removerAnnotations %} - * {{ annotation }} -{% endfor %} - */ - public function remove{{ field.name|ucfirst }}({% if field.typeHint %}{{ field.typeHint }} {% endif %}${{ field.name }}) - { - $key = array_search({% if field.isEnum %}(string) {% endif %}${{ field.name }}, $this->{{ field.name }}, true); - if (false !== $key) { - unset($this->{{ field.name }}[$key]); - } - - return $this; - } -{% else %} - /** -{% for annotation in field.setterAnnotations %} - * {{ annotation }} -{% endfor %} - */ - public function set{{ field.name|ucfirst }}({% if field.typeHint %}{{ field.typeHint }} {% endif %}${{ field.name }}{% if field.typeHint and field.isNullable %} = null{% endif %}) - { - $this->{{ field.name }} = ${{ field.name }}; - - return $this; - } -{% endif %} - - /** -{% for annotation in field.getterAnnotations %} - * {{ annotation }} -{% endfor %} - */ - public function get{{ field.name|ucfirst }}() - { - return $this->{{ field.name }}; - } - -{% endfor %} -} diff --git a/templates/doctrine.yaml.twig b/templates/doctrine.yaml.twig new file mode 100644 index 00000000..88ecf1de --- /dev/null +++ b/templates/doctrine.yaml.twig @@ -0,0 +1,6 @@ +doctrine: + orm: + resolve_target_entities: +{% for interface, class in mappings %} + {{ interface }}: {{ class }} +{% endfor %} diff --git a/templates/interface.php.twig b/templates/interface.php.twig deleted file mode 100644 index 3d0c1ef4..00000000 --- a/templates/interface.php.twig +++ /dev/null @@ -1,20 +0,0 @@ -{# - # (c) Kévin Dunglas - # - # This source file is subject to the MIT license that is bundled - # with this source code in the file LICENSE. - #} - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AnnotationGenerator; + +use ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator; +use ApiPlatform\SchemaGenerator\Model\Class_; +use ApiPlatform\SchemaGenerator\Model\Interface_; +use ApiPlatform\SchemaGenerator\Model\Property; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\String\Inflector\EnglishInflector; + +class PhpDocAnnotationGeneratorTest extends TestCase +{ + private PhpDocAnnotationGenerator $generator; + + protected function setUp(): void + { + $configuration = new SchemaGeneratorConfiguration(); + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'author' => 'Bill', + ]]); + + $this->generator = new PhpDocAnnotationGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + $processedConfiguration, + [], + ); + } + + #[DataProvider('provideGenerateClassAnnotationsCases')] + public function testGenerateClassAnnotations(Class_ $class, array $annotations): void + { + $this->assertSame($annotations, $this->generator->generateClassAnnotations($class)); + } + + public static function provideGenerateClassAnnotationsCases(): \Generator + { + $class = new SchemaClass('Res', new RdfResource('https://schema.org/Res')); + $class->interface = new Interface_('Interface', '/foo'); + yield 'with interface' => [$class, ['{@inheritdoc}', '', '@author Bill']]; + + $graph = new RdfGraph(); + yield 'with resource' => [new SchemaClass('Res', new RdfResource('https://schema.org/Res', $graph)), ['@see https://schema.org/Res', '@author Bill']]; + } + + #[DataProvider('provideGeneratePropertyAnnotationsCases')] + public function testGeneratePropertyAnnotations(Property $property, string $className, array $annotations): void + { + $this->assertSame($annotations, $this->generator->generatePropertyAnnotations($property, $className)); + } + + public static function provideGeneratePropertyAnnotationsCases(): \Generator + { + $property = new SchemaProperty('telephone'); + $graph = new RdfGraph(); + $resource = new RdfResource('https://schema.org/telephone', $graph); + $resource->addResource('rdfs:comment', 'The telephone number.
@number'); + $property->resource = $resource; + + yield 'property with description' => [$property, 'Place', ['The telephone **number**. ', ' \@number', '', '@see https://schema.org/telephone', '']]; + + $property = new SchemaProperty('review'); + $graph = new RdfGraph(); + $resource = new RdfResource('https://schema.org/review', $graph); + $resource->addResource('rdfs:comment', 'A review of the item.'); + $property->resource = $resource; + $property->typeHint = 'array'; + $property->type = new ArrayType(new SchemaPrimitiveType('string')); + $property->range = new RdfResource('https://schema.org/Text'); + + yield 'array of strings property' => [$property, 'Place', ['@var string[]|null A review of the item.', '@see https://schema.org/review', '']]; + + $property = new SchemaProperty('address'); + $graph = new RdfGraph(); + $property->isNullable = false; + $property->typeHint = 'array'; + $property->type = new ArrayType(); + $property->reference = new SchemaClass('PostalAddress', new RdfResource('https://schema.org/PostalAddress', $graph)); + + yield 'reference property' => [$property, 'Place', ['@var Collection ', '']]; + } +} diff --git a/tests/AttributeGenerator/ApiPlatformCoreAttributeGeneratorTest.php b/tests/AttributeGenerator/ApiPlatformCoreAttributeGeneratorTest.php new file mode 100644 index 00000000..3ff3a6f6 --- /dev/null +++ b/tests/AttributeGenerator/ApiPlatformCoreAttributeGeneratorTest.php @@ -0,0 +1,139 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\Core\Annotation\ApiProperty as OldApiProperty; +use ApiPlatform\Core\Annotation\ApiResource as OldApiResource; +use ApiPlatform\Metadata\ApiProperty; +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\Delete; +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\Patch; +use ApiPlatform\Metadata\Post; +use ApiPlatform\Metadata\Put; +use ApiPlatform\SchemaGenerator\AttributeGenerator\ApiPlatformCoreAttributeGenerator; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Nette\PhpGenerator\Literal; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Component\String\Inflector\EnglishInflector; + +/** + * @author Kévin Dunglas + */ +class ApiPlatformCoreAttributeGeneratorTest extends TestCase +{ + private function generator(bool $oldAttributes = false): ApiPlatformCoreAttributeGenerator + { + return new ApiPlatformCoreAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + ['apiPlatformOldAttributes' => $oldAttributes], + [], + ); + } + + #[DataProvider('provideGenerateClassAttributesCases')] + public function testGenerateClassAttributes(SchemaClass $class, array $attributes, bool $oldAttributes = false): void + { + $this->assertEquals($attributes, $this->generator($oldAttributes)->generateClassAttributes($class)); + } + + public static function provideGenerateClassAttributesCases(): \Generator + { + yield 'classical' => [new SchemaClass('Res', new RdfResource('https://schema.org/Res', new RdfGraph())), [new Attribute('ApiResource', ['types' => ['https://schema.org/Res']])]]; + + yield 'classical (old)' => [new SchemaClass('Res', new RdfResource('https://schema.org/Res', new RdfGraph())), [new Attribute('ApiResource', ['iri' => 'https://schema.org/Res'])], true]; + + $class = new SchemaClass('WithOperations', new RdfResource('https://schema.org/WithOperations', new RdfGraph())); + $class->operations = [ + 'Get' => ['routeName' => 'api_about_get'], + ]; + yield 'with operations' => [$class, [new Attribute('ApiResource', ['types' => ['https://schema.org/WithOperations'], 'operations' => [new Literal('new Get(...?:)', [['routeName' => 'api_about_get']])]])]]; + + $class = new SchemaClass('WithOperations', new RdfResource('https://schema.org/WithOperations', new RdfGraph())); + $class->operations = [ + ['class' => 'Get', 'routeName' => 'api_about_get'], + ['class' => 'Get', 'routeName' => 'api_alternate_get'], + ]; + yield 'with numeric operations' => [$class, [new Attribute('ApiResource', ['types' => ['https://schema.org/WithOperations'], 'operations' => [new Literal('new Get(...?:)', [['routeName' => 'api_about_get']]), new Literal('new Get(...?:)', [['routeName' => 'api_alternate_get']])]])]]; + + $class = new SchemaClass('WithOperations', new RdfResource('https://schema.org/WithOperations', new RdfGraph())); + $class->operations = [ + 'item' => ['get' => ['route_name' => 'api_about_get']], + 'collection' => [], + ]; + yield 'with operations (old)' => [$class, [new Attribute('ApiResource', ['iri' => 'https://schema.org/WithOperations', 'itemOperations' => ['get' => ['route_name' => 'api_about_get']], 'collectionOperations' => []])], true]; + + $class = new SchemaClass('HasChild', new RdfResource('https://schema.org/HasChild')); + $class->hasChild = true; + yield 'has child' => [$class, []]; + + $resource = new RdfResource('https://schema.org/MyEnum', new RdfGraph()); + $resource->add('rdfs:subClassOf', ['type' => 'uri', 'value' => TypesGenerator::SCHEMA_ORG_ENUMERATION]); + $class = new SchemaClass('Enum', $resource); + yield 'enum' => [$class, []]; + + yield 'with short name' => [new SchemaClass('WithShortName', new RdfResource('https://schema.org/DifferentLocalName', new RdfGraph())), [new Attribute('ApiResource', ['shortName' => 'DifferentLocalName', 'types' => ['https://schema.org/DifferentLocalName']])]]; + } + + #[DataProvider('provideGeneratePropertyAttributesCases')] + public function testGeneratePropertyAttributes(Property $property, array $attributes, bool $oldAttributes = false): void + { + $this->assertEquals($attributes, $this->generator($oldAttributes)->generatePropertyAttributes($property, 'Res')); + } + + public static function provideGeneratePropertyAttributesCases(): \Generator + { + $property = new Property('prop'); + $property->resource = new RdfResource('https://schema.org/prop'); + yield 'classical' => [$property, [new Attribute('ApiProperty', ['types' => ['https://schema.org/prop']])]]; + + $property = new Property('prop'); + $property->resource = new RdfResource('https://schema.org/prop'); + yield 'classical (old)' => [$property, [new Attribute('ApiProperty', ['iri' => 'https://schema.org/prop'])], true]; + } + + public function testGenerateCustomPropertyAttributes(): void + { + $this->assertSame([], $this->generator()->generatePropertyAttributes((new Property('customProp'))->markAsCustom(), 'Res')); + } + + public function testGenerateUses(): void + { + $this->assertEquals([ + new Use_(OldApiResource::class), + new Use_(OldApiProperty::class), + ], $this->generator(true)->generateUses(new SchemaClass('Res', new RdfResource('https://schema.org/Res', new RdfGraph())))); + + $this->assertEquals([ + new Use_(ApiResource::class), + new Use_(ApiProperty::class), + new Use_(Get::class), + new Use_(Put::class), + new Use_(Patch::class), + new Use_(Delete::class), + new Use_(GetCollection::class), + new Use_(Post::class), + ], $this->generator()->generateUses(new SchemaClass('Res', new RdfResource('https://schema.org/Res', new RdfGraph())))); + } +} diff --git a/tests/AttributeGenerator/ConfigurationAttributeGeneratorTest.php b/tests/AttributeGenerator/ConfigurationAttributeGeneratorTest.php new file mode 100644 index 00000000..e6198269 --- /dev/null +++ b/tests/AttributeGenerator/ConfigurationAttributeGeneratorTest.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\ConfigurationAttributeGenerator; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Component\String\Inflector\EnglishInflector; + +class ConfigurationAttributeGeneratorTest extends TestCase +{ + #[DataProvider('provideGenerateClassAttributesCases')] + public function testGenerateClassAttributes(SchemaClass $class, array $config, array $attributes): void + { + $this->assertEquals($attributes, $this->generator($config)->generateClassAttributes($class)); + } + + public static function provideGenerateClassAttributesCases(): \Generator + { + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph())); + + yield 'no configuration' => [$class, [], []]; + + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph())); + + yield 'type configuration' => [ + $class, + ['types' => ['Foo' => ['attributes' => [['ApiResource' => ['routePrefix' => '/prefix']]]]]], + [new Attribute('ApiResource', ['routePrefix' => '/prefix', 'mergeable' => false])], + ]; + + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph(SchemaGeneratorConfiguration::SCHEMA_ORG_URI))); + $expectedAttribute = new Attribute('ApiResource', ['routePrefix' => '/prefix']); + $expectedAttribute->append = false; + $expectedAttribute->mergeable = false; + + yield 'vocab configuration' => [ + $class, + ['vocabularies' => [SchemaGeneratorConfiguration::SCHEMA_ORG_URI => ['attributes' => [['ApiResource' => ['routePrefix' => '/prefix']]]]]], + [$expectedAttribute], + ]; + + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph(SchemaGeneratorConfiguration::SCHEMA_ORG_URI))); + + yield 'vocab and type configuration' => [ + $class, + [ + 'vocabularies' => [SchemaGeneratorConfiguration::SCHEMA_ORG_URI => ['attributes' => [['ApiResource' => ['routePrefix' => '/prefix']]]]], + 'types' => ['Foo' => ['attributes' => [['ApiResource' => ['security' => "is_granted('ROLE_USER')"]]]]], + ], + [new Attribute('ApiResource', ['security' => "is_granted('ROLE_USER')", 'mergeable' => false])], + ]; + } + + #[DataProvider('provideGeneratePropertyAttributesCases')] + public function testGeneratePropertyAttributes(Property $property, array $config, array $attributes): void + { + $this->assertEquals($attributes, $this->generator($config)->generatePropertyAttributes($property, 'Res')); + } + + public static function provideGeneratePropertyAttributesCases(): \Generator + { + $property = new Property('prop'); + + yield 'no configuration' => [$property, [], []]; + + $property = new Property('prop'); + + yield 'type configuration' => [ + $property, + ['types' => ['Res' => ['properties' => ['prop' => ['attributes' => [['ApiResource' => ['security' => "is_granted('ROLE_USER')"]]]]]]]], + [new Attribute('ApiResource', ['security' => "is_granted('ROLE_USER')", 'mergeable' => false])], + ]; + } + + #[DataProvider('provideGenerateUsesCases')] + public function testGenerateUses(SchemaClass $class, array $config, array $uses): void + { + $this->assertEquals($uses, $this->generator($config)->generateUses($class)); + } + + public static function provideGenerateUsesCases(): \Generator + { + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph())); + + yield 'no configuration' => [$class, ['uses' => []], []]; + + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', new RdfGraph())); + + yield 'type configuration' => [ + $class, + ['uses' => ['Symfony\Component\Validator\Constraints' => ['alias' => 'Assert']]], + [new Use_('Symfony\Component\Validator\Constraints', 'Assert')], + ]; + } + + private function generator(array $config = []): ConfigurationAttributeGenerator + { + return new ConfigurationAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + $config, + [], + ); + } +} diff --git a/tests/AttributeGenerator/ConstraintAttributeGeneratorTest.php b/tests/AttributeGenerator/ConstraintAttributeGeneratorTest.php new file mode 100644 index 00000000..496e18a0 --- /dev/null +++ b/tests/AttributeGenerator/ConstraintAttributeGeneratorTest.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Nette\PhpGenerator\Literal; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; +use Symfony\Component\String\Inflector\EnglishInflector; + +class ConstraintAttributeGeneratorTest extends TestCase +{ + private ConstraintAttributeGenerator $generator; + + protected function setUp(): void + { + $this->generator = new ConstraintAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + ['id' => ['generationStrategy' => 'uuid']], + [], + ); + } + + #[DataProvider('provideGenerateClassAttributesCases')] + public function testGenerateClassAttributes(SchemaClass $class, array $attributes): void + { + $this->assertEquals($attributes, $this->generator->generateClassAttributes($class)); + } + + public static function provideGenerateClassAttributesCases(): \Generator + { + $graph = new RdfGraph(); + $resource = new RdfResource('https://schema.org/Enum', $graph); + $resource->add('rdfs:subClassOf', ['type' => 'uri', 'value' => TypesGenerator::SCHEMA_ORG_ENUMERATION]); + + yield 'enum' => [new SchemaClass('Enum', $resource), []]; + + $graph = new RdfGraph(); + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', $graph)); + $uniqueProperty = new Property('bar'); + $uniqueProperty->isUnique = true; + $class->addProperty($uniqueProperty); + + yield 'one unique property' => [$class, [new Attribute('UniqueEntity', ['bar'])]]; + + $graph = new RdfGraph(); + $class = new SchemaClass('Foo', new RdfResource('https://schema.org/Foo', $graph)); + $uniqueProperty = new Property('bar'); + $uniqueProperty->isUnique = true; + $class->addProperty($uniqueProperty); + $uniqueProperty = new Property('baz'); + $uniqueProperty->isUnique = true; + $class->addProperty($uniqueProperty); + + yield 'multiple unique properties' => [$class, [new Attribute('UniqueEntity', ['fields' => ['bar', 'baz']])]]; + } + + #[DataProvider('provideGeneratePropertyAttributesCases')] + public function testGeneratePropertyAttributes(Property $property, array $attributes): void + { + $this->assertEquals($attributes, $this->generator->generatePropertyAttributes($property, 'Res')); + } + + public static function provideGeneratePropertyAttributesCases(): \Generator + { + $property = new Property('prop'); + $property->isId = true; + yield 'uuid' => [$property, [new Attribute('Assert\Uuid')]]; + + $property = new Property('prop'); + $property->resource = new RdfResource('https://schema.org/email'); + $property->type = new SchemaPrimitiveType('string'); + $property->isNullable = false; + yield 'email' => [$property, [new Attribute('Assert\Email'), new Attribute('Assert\NotNull')]]; + + $property = new Property('prop'); + $property->reference = new SchemaClass('Enum', new RdfResource('https://schema.org/Enum', new RdfGraph())); + $property->isEnum = true; + $property->type = new ArrayType(); + yield 'enum' => [$property, [new Attribute('Assert\Choice', ['callback' => [new Literal('Enum::class'), 'toArray'], 'multiple' => true])]]; + } + + public function testGenerateUses(): void + { + $this->assertEquals([new Use_('Symfony\Component\Validator\Constraints', 'Assert'), new Use_(UniqueEntity::class)], $this->generator->generateUses(new SchemaClass('Res', new RdfResource('https://schema.org/Res', new RdfGraph())))); + } + + public function testGenerateNoUsesForEnum(): void + { + $graph = new RdfGraph(); + $myEnum = new RdfResource('https://schema.org/MyEnum', $graph); + $myEnum->add('rdfs:subClassOf', ['type' => 'uri', 'value' => TypesGenerator::SCHEMA_ORG_ENUMERATION]); + $this->assertSame([], $this->generator->generateUses(new SchemaClass('MyEnum', $myEnum))); + } +} diff --git a/tests/AttributeGenerator/DoctrineMongoDBAttributeGeneratorTest.php b/tests/AttributeGenerator/DoctrineMongoDBAttributeGeneratorTest.php new file mode 100644 index 00000000..42dcc0e9 --- /dev/null +++ b/tests/AttributeGenerator/DoctrineMongoDBAttributeGeneratorTest.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineMongoDBAttributeGenerator; +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Nette\PhpGenerator\Literal; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\String\Inflector\EnglishInflector; + +class DoctrineMongoDBAttributeGeneratorTest extends TestCase +{ + private DoctrineMongoDBAttributeGenerator $generator; + + private array $classMap = []; + + protected function setUp(): void + { + $graph = new RdfGraph(); + + $thing = new SchemaClass('Thing', new RdfResource('https://schema.org/Thing', $graph)); + $thing->isAbstract = true; + $thing->hasChild = true; + $this->classMap[$thing->name()] = $thing; + + $organization = new SchemaClass('Organization', new RdfResource('https://schema.org/Organization', $graph)); + $this->classMap[$organization->name()] = $organization; + + $product = new SchemaClass('Product', new RdfResource('https://schema.org/Product', $graph), 'Thing'); + $product->hasChild = true; + $product->isReferencedBy = [$organization]; + $this->classMap[$product->name()] = $product; + + $vehicle = new SchemaClass('Vehicle', new RdfResource('htts://schema.org/Vehicle', $graph), 'Product'); + $vehicle->hasChild = true; + $vehicle->isAbstract = true; + $idProperty = new Property('id'); + $idProperty->rangeName = 'identifier'; + $idProperty->range = new RdfResource('https://schema.org/identifier'); + $idProperty->type = new SchemaPrimitiveType('string'); + $idProperty->isId = true; + $vehicle->addProperty($idProperty); + $enumProperty = new Property('enum'); + $enumProperty->rangeName = 'Thing'; + $enumProperty->range = new RdfResource('https://schema.org/Thing'); + $enumProperty->reference = new SchemaClass('Thing', new RdfResource('htts://schema.org/Thing', $graph)); + $enumProperty->isEnum = true; + $enumProperty->type = new ArrayType(); + $vehicle->addProperty($enumProperty); + $collectionProperty = new Property('collection'); + $collectionProperty->rangeName = 'string'; + $collectionProperty->range = new RdfResource('http://www.w3.org/2001/XMLSchema#string'); + $collectionProperty->type = new ArrayType(new SchemaPrimitiveType('string')); + $vehicle->addProperty($collectionProperty); + $weightProperty = new Property('weight'); + $weightProperty->rangeName = 'nonPositiveInteger'; + $weightProperty->range = new RdfResource('http://www.w3.org/2001/XMLSchema#nonPositiveInteger'); + $weightProperty->type = new SchemaPrimitiveType('nonPositiveInteger'); + $vehicle->addProperty($weightProperty); + $productProperty = new Property('product'); + $productProperty->rangeName = 'Product'; + $productProperty->range = new RdfResource('https://schema.org/Product'); + $productProperty->reference = $product; + $vehicle->addProperty($productProperty); + $relationProperty = new Property('relation'); + $relationProperty->rangeName = 'Person'; + $relationProperty->range = new RdfResource('https://schema.org/Person'); + $relationProperty->reference = new SchemaClass('Person', new RdfResource('htts://schema.org/Person', $graph)); + $relationProperty->cardinality = CardinalitiesExtractor::CARDINALITY_1_1; + $vehicle->addProperty($relationProperty); + $relationsProperty = new Property('relations'); + $relationsProperty->rangeName = 'Person'; + $relationsProperty->range = new RdfResource('https://schema.org/Person'); + $relationsProperty->reference = new SchemaClass('Person', new RdfResource('htts://schema.org/Person', $graph)); + $relationsProperty->cardinality = CardinalitiesExtractor::CARDINALITY_1_N; + $relationsProperty->type = new ArrayType(); + $vehicle->addProperty($relationsProperty); + + $this->classMap[$vehicle->name()] = $vehicle; + + $car = new SchemaClass('Car', new RdfResource('https://schema.org/Car', $graph), 'Vehicle'); + $this->classMap[$car->name()] = $car; + + $myEnum = new RdfResource('https://schema.org/MyEnum', $graph); + $myEnum->add('rdfs:subClassOf', ['type' => 'uri', 'value' => TypesGenerator::SCHEMA_ORG_ENUMERATION]); + $myEnumClass = new SchemaClass('MyEnum', $myEnum); + $this->classMap[$myEnumClass->name()] = $myEnumClass; + + $configuration = new SchemaGeneratorConfiguration(); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'id' => ['generationStrategy' => 'auto', 'writable' => true], + 'types' => [ + 'Product' => null, + // Vehicle is not added deliberately + ], + ]]); + + $this->generator = new DoctrineMongoDBAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + $processedConfiguration, + $this->classMap + ); + } + + public function testGenerateClassAttributes(): void + { + $this->assertSame([], $this->generator->generateClassAttributes($this->classMap['MyEnum'])); + $this->assertEquals([new Attribute('MongoDB\MappedSuperclass')], $this->generator->generateClassAttributes($this->classMap['Thing'])); + $this->assertEquals([ + new Attribute('MongoDB\Document'), + new Attribute('MongoDB\InheritanceType', ['SINGLE_COLLECTION']), + new Attribute('MongoDB\DiscriminatorField', ['discr']), + new Attribute('MongoDB\DiscriminatorMap', [['product' => new Literal('Product::class'), 'car' => new Literal('Car::class')]]), + ], $this->generator->generateClassAttributes($this->classMap['Product'])); + $this->assertEquals([new Attribute('MongoDB\Document')], $this->generator->generateClassAttributes($this->classMap['Car'])); + } + + public function testGeneratePropertyAttributes(): void + { + $this->assertEquals( + [new Attribute('MongoDB\Id', ['strategy' => 'INCREMENT'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('id'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('MongoDB\Field', ['type' => 'simple_array'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('enum'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('MongoDB\Field', ['type' => 'collection'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('collection'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('MongoDB\Field', ['type' => 'integer'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('weight'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('MongoDB\ReferenceOne', ['targetDocument' => 'Person'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('MongoDB\ReferenceMany', ['targetDocument' => 'Person'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relations'), 'Vehicle') + ); + } +} diff --git a/tests/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGeneratorTest.php b/tests/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGeneratorTest.php new file mode 100644 index 00000000..072cc266 --- /dev/null +++ b/tests/AttributeGenerator/DoctrineOrmAssociationOverrideAttributeGeneratorTest.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAssociationOverrideAttributeGenerator; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Nette\PhpGenerator\Literal; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\String\Inflector\EnglishInflector; + +class DoctrineOrmAssociationOverrideAttributeGeneratorTest extends TestCase +{ + private DoctrineOrmAssociationOverrideAttributeGenerator $generator; + + private array $classMap = []; + + protected function setUp(): void + { + $graph = new RdfGraph(); + + $thing = new SchemaClass('Thing', new RdfResource('https://schema.org/Thing', $graph)); + $thing->isAbstract = true; + $thing->hasChild = true; + $imageProperty = new Property('image'); + $imageProperty->addAttribute(new Attribute('ORM\JoinTable', ['name' => 'thing_image'])); + $imageProperty->addAttribute(new Attribute('ORM\InverseJoinColumn', ['nullable' => false, 'unique' => true])); + $thing->addProperty($imageProperty); + $this->classMap[$thing->name()] = $thing; + + $creativeWork = new SchemaClass('CreativeWork', new RdfResource('https://schema.org/CreativeWork', $graph), 'Thing'); + $creativeWork->hasChild = true; + $this->classMap[$creativeWork->name()] = $creativeWork; + + $article = new SchemaClass('Article', new RdfResource('htts://schema.org/Article', $graph), 'CreativeWork'); + $article->hasChild = true; + $article->isAbstract = true; + $speakableProperty = new Property('speakable'); + $speakableProperty->addAttribute(new Attribute('ORM\JoinTable', ['name' => 'article_speakable'])); + $speakableProperty->addAttribute(new Attribute('ORM\JoinColumn', ['nullable' => false])); + $article->addProperty($speakableProperty); + $this->classMap[$article->name()] = $article; + + $newsArticle = new SchemaClass('NewsArticle', new RdfResource('https://schema.org/NewsArticle', $graph), 'Article'); + $newsArticle->hasChild = true; + $newsArticle->isAbstract = true; + $printSectionProperty = new Property('printSection'); + $printSectionProperty->addAttribute(new Attribute('ORM\JoinTable', ['name' => 'news_article_print_section'])); + $newsArticle->addProperty($printSectionProperty); + $this->classMap[$newsArticle->name()] = $newsArticle; + + $opinionNewsArticle = new SchemaClass('OpinionNewsArticle', new RdfResource('https://schema.org/OpinionNewsArticle', $graph), 'NewsArticle'); + $this->classMap[$opinionNewsArticle->name()] = $opinionNewsArticle; + + $configuration = new SchemaGeneratorConfiguration(); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'doctrine' => [ + 'maxIdentifierLength' => 40, + ], + ]]); + + $this->generator = new DoctrineOrmAssociationOverrideAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + $processedConfiguration, + $this->classMap + ); + } + + public function testGenerateLateClassAttributes(): void + { + $this->assertEquals([new Attribute('ORM\AssociationOverrides', [[ + new Literal("new ORM\AssociationOverride(...?:)", [['name' => 'printSection', 'joinTable' => new Literal('new ORM\JoinTable(...?:)', [['name' => 'join_table_9aff121e']]), 'joinColumns' => [new Literal('new ORM\JoinColumn(...?:)', [[]])], 'inverseJoinColumns' => [new Literal('new ORM\InverseJoinColumn(...?:)', [[]])]]]), + new Literal("new ORM\AssociationOverride(...?:)", [['name' => 'speakable', 'joinTable' => new Literal('new ORM\JoinTable(...?:)', [['name' => 'article_speakable_opinion_news_article']]), 'joinColumns' => [new Literal('new ORM\JoinColumn(...?:)', [['nullable' => false]])], 'inverseJoinColumns' => [new Literal('new ORM\InverseJoinColumn(...?:)', [[]])]]]), + ]])], $this->generator->generateLateClassAttributes($this->classMap['OpinionNewsArticle'])); + $this->assertEquals([new Attribute('ORM\AssociationOverrides', [[ + new Literal("new ORM\AssociationOverride(...?:)", [['name' => 'image', 'joinTable' => new Literal('new ORM\JoinTable(...?:)', [['name' => 'thing_image_creative_work']]), 'joinColumns' => [new Literal('new ORM\JoinColumn(...?:)', [[]])], 'inverseJoinColumns' => [new Literal('new ORM\InverseJoinColumn(...?:)', [['nullable' => false, 'unique' => true]])]]]), + ]])], $this->generator->generateLateClassAttributes($this->classMap['CreativeWork'])); + $this->assertEquals([], $this->generator->generateLateClassAttributes($this->classMap['Thing'])); + $this->assertEquals([], $this->generator->generateLateClassAttributes($this->classMap['Article'])); + $this->assertEquals([], $this->generator->generateLateClassAttributes($this->classMap['NewsArticle'])); + } +} diff --git a/tests/AttributeGenerator/DoctrineOrmAttributeGeneratorTest.php b/tests/AttributeGenerator/DoctrineOrmAttributeGeneratorTest.php new file mode 100644 index 00000000..a8a11942 --- /dev/null +++ b/tests/AttributeGenerator/DoctrineOrmAttributeGeneratorTest.php @@ -0,0 +1,250 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\AttributeGenerator; + +use ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAttributeGenerator; +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\Model\Attribute; +use ApiPlatform\SchemaGenerator\Model\Type\ArrayType; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use Nette\PhpGenerator\Literal; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\String\Inflector\EnglishInflector; + +/** + * @author Erik Saunier + */ +class DoctrineOrmAttributeGeneratorTest extends TestCase +{ + private DoctrineOrmAttributeGenerator $generator; + + private array $classMap = []; + + protected function setUp(): void + { + $graph = new RdfGraph(); + + $thing = new SchemaClass('Thing', new RdfResource('https://schema.org/Thing', $graph)); + $thing->isAbstract = true; + $thing->hasChild = true; + $this->classMap[$thing->name()] = $thing; + + $organization = new SchemaClass('Organization', new RdfResource('https://schema.org/Organization', $graph)); + $this->classMap[$organization->name()] = $organization; + + $product = new SchemaClass('Product', new RdfResource('https://schema.org/Product', $graph), 'Thing'); + $product->hasChild = true; + $product->isReferencedBy = [$organization]; + $this->classMap[$product->name()] = $product; + + $vehicle = new SchemaClass('Vehicle', new RdfResource('htts://schema.org/Vehicle', $graph), 'Product'); + $vehicle->hasChild = true; + $vehicle->isAbstract = true; + $idProperty = new Property('id'); + $idProperty->rangeName = 'identifier'; + $idProperty->range = new RdfResource('https://schema.org/identifier'); + $idProperty->type = new SchemaPrimitiveType('string'); + $idProperty->isId = true; + $vehicle->addProperty($idProperty); + $enumProperty = new Property('enum'); + $enumProperty->rangeName = 'Thing'; + $enumProperty->range = new RdfResource('https://schema.org/Thing'); + $enumProperty->isEnum = true; + $enumProperty->type = new ArrayType(); + $enumProperty->reference = new SchemaClass('Thing', new RdfResource('htts://schema.org/Thing', $graph)); + $vehicle->addProperty($enumProperty); + $collectionProperty = new Property('collection'); + $collectionProperty->rangeName = 'string'; + $collectionProperty->range = new RdfResource('http://www.w3.org/2001/XMLSchema#string'); + $collectionProperty->type = new ArrayType(new SchemaPrimitiveType('string')); + $vehicle->addProperty($collectionProperty); + $weightProperty = new Property('weight'); + $weightProperty->rangeName = 'nonPositiveInteger'; + $weightProperty->range = new RdfResource('http://www.w3.org/2001/XMLSchema#nonPositiveInteger'); + $weightProperty->type = new SchemaPrimitiveType('nonPositiveInteger'); + $vehicle->addProperty($weightProperty); + $prefixedWeightProperty = new Property('prefixedWeight'); + $prefixedWeightProperty->isEmbedded = true; + $prefixedWeightProperty->rangeName = 'QuantitativeValue'; + $prefixedWeightProperty->range = new RdfResource('https://schema.org/QuantitativeValue'); + $prefixedWeightProperty->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $vehicle->addProperty($prefixedWeightProperty); + $productProperty = new Property('product'); + $productProperty->rangeName = 'Product'; + $productProperty->range = new RdfResource('https://schema.org/Product'); + $productProperty->reference = $product; + $vehicle->addProperty($productProperty); + $relation01Property = new Property('relation0_1'); + $relation01Property->rangeName = 'QuantitativeValue'; + $relation01Property->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relation01Property->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relation01Property->cardinality = CardinalitiesExtractor::CARDINALITY_0_1; + $vehicle->addProperty($relation01Property); + $relation11Property = new Property('relation1_1'); + $relation11Property->rangeName = 'QuantitativeValue'; + $relation11Property->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relation11Property->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relation11Property->cardinality = CardinalitiesExtractor::CARDINALITY_1_1; + $vehicle->addProperty($relation11Property); + $relationN0Property = new Property('relationN_0'); + $relationN0Property->rangeName = 'QuantitativeValue'; + $relationN0Property->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relationN0Property->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relationN0Property->cardinality = CardinalitiesExtractor::CARDINALITY_N_0; + $vehicle->addProperty($relationN0Property); + $relationN1Property = new Property('relationN_1'); + $relationN1Property->rangeName = 'QuantitativeValue'; + $relationN1Property->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relationN1Property->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relationN1Property->cardinality = CardinalitiesExtractor::CARDINALITY_N_1; + $vehicle->addProperty($relationN1Property); + $relation0NProperty = new Property('relation0_N'); + $relation0NProperty->rangeName = 'QuantitativeValue'; + $relation0NProperty->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relation0NProperty->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relation0NProperty->cardinality = CardinalitiesExtractor::CARDINALITY_0_N; + $relation0NProperty->type = new ArrayType(); + $vehicle->addProperty($relation0NProperty); + $relation1NProperty = new Property('relation1_N'); + $relation1NProperty->rangeName = 'QuantitativeValue'; + $relation1NProperty->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relation1NProperty->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relation1NProperty->cardinality = CardinalitiesExtractor::CARDINALITY_1_N; + $relation1NProperty->type = new ArrayType(); + $vehicle->addProperty($relation1NProperty); + $relation1NSelfReferencingProperty = new Property('relation1_N_self_referencing'); + $relation1NSelfReferencingProperty->rangeName = 'Vehicle'; + $relation1NSelfReferencingProperty->range = new RdfResource('https://schema.org/Vehicle'); + $relation1NSelfReferencingProperty->reference = new SchemaClass('Vehicle', new RdfResource('htts://schema.org/Vehicle', $graph)); + $relation1NSelfReferencingProperty->cardinality = CardinalitiesExtractor::CARDINALITY_1_N; + $relation1NSelfReferencingProperty->type = new ArrayType(); + $vehicle->addProperty($relation1NSelfReferencingProperty); + $relationNNProperty = new Property('relationN_N'); + $relationNNProperty->rangeName = 'QuantitativeValue'; + $relationNNProperty->range = new RdfResource('https://schema.org/QuantitativeValue'); + $relationNNProperty->reference = new SchemaClass('QuantitativeValue', new RdfResource('htts://schema.org/QuantitativeValue', $graph)); + $relationNNProperty->cardinality = CardinalitiesExtractor::CARDINALITY_N_N; + $relationNNProperty->type = new ArrayType(); + $vehicle->addProperty($relationNNProperty); + + $this->classMap[$vehicle->name()] = $vehicle; + + $car = new SchemaClass('Car', new RdfResource('https://schema.org/Car', $graph), 'Vehicle'); + $this->classMap[$car->name()] = $car; + + $quantitativeValue = new SchemaClass('QuantitativeValue', new RdfResource('https://schema.org/QuantitativeValue', $graph)); + $quantitativeValue->isEmbeddable = true; + $this->classMap[$quantitativeValue->name()] = $quantitativeValue; + + $myEnum = new RdfResource('https://schema.org/MyEnum', $graph); + $myEnum->add('rdfs:subClassOf', ['type' => 'uri', 'value' => TypesGenerator::SCHEMA_ORG_ENUMERATION]); + $myEnumClass = new SchemaClass('MyEnum', $myEnum); + $this->classMap[$myEnumClass->name()] = $myEnumClass; + + $configuration = new SchemaGeneratorConfiguration(); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'id' => ['generationStrategy' => 'auto', 'writable' => true], + 'types' => [ + 'Product' => null, + // Vehicle is not added deliberately + ], + ]]); + + $this->generator = new DoctrineOrmAttributeGenerator( + new PhpTypeConverter(), + new EnglishInflector(), + $processedConfiguration, + $this->classMap + ); + } + + public function testGenerateClassAttributes(): void + { + $this->assertSame([], $this->generator->generateClassAttributes($this->classMap['MyEnum'])); + $this->assertEquals([new Attribute('ORM\MappedSuperclass')], $this->generator->generateClassAttributes($this->classMap['Thing'])); + $this->assertEquals([ + new Attribute('ORM\Entity'), + new Attribute('ORM\InheritanceType', ['JOINED']), + new Attribute('ORM\DiscriminatorColumn', ['name' => 'discr']), + new Attribute('ORM\DiscriminatorMap', [['product' => new Literal('Product::class'), 'car' => new Literal('Car::class')]]), + ], $this->generator->generateClassAttributes($this->classMap['Product'])); + $this->assertEquals([new Attribute('ORM\Entity')], $this->generator->generateClassAttributes($this->classMap['Car'])); + $this->assertEquals([new Attribute('ORM\Embeddable')], $this->generator->generateClassAttributes($this->classMap['QuantitativeValue'])); + } + + public function testGeneratePropertyAttributes(): void + { + $this->assertEquals( + [new Attribute('ORM\Id'), new Attribute('ORM\Column', ['type' => 'integer'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('id'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\Column', ['type' => 'simple_array', 'nullable' => true])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('enum'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\Column', ['type' => 'json', 'nullable' => true, 'name' => '`collection`'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('collection'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\Column', ['type' => 'integer', 'nullable' => true])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('weight'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\Embedded', ['class' => 'App\Entity\QuantitativeValue'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('prefixedWeight'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\OneToOne', ['targetEntity' => 'App\Entity\QuantitativeValue'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation0_1'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\OneToOne', ['targetEntity' => 'App\Entity\QuantitativeValue']), new Attribute('ORM\JoinColumn', ['nullable' => false])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation1_1'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToOne', ['targetEntity' => 'App\Entity\QuantitativeValue'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relationN_0'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToOne', ['targetEntity' => 'App\Entity\QuantitativeValue']), new Attribute('ORM\JoinColumn', ['nullable' => false])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relationN_1'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToMany', ['targetEntity' => 'App\Entity\QuantitativeValue']), new Attribute('ORM\JoinTable', ['name' => 'vehicle_quantitative_value_relation0_n']), new Attribute('ORM\InverseJoinColumn', ['unique' => true])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation0_N'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToMany', ['targetEntity' => 'App\Entity\QuantitativeValue']), new Attribute('ORM\JoinTable', ['name' => 'vehicle_quantitative_value_relation1_n']), new Attribute('ORM\InverseJoinColumn', ['nullable' => false, 'unique' => true])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation1_N'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToMany', ['targetEntity' => 'App\Entity\Vehicle']), new Attribute('ORM\JoinTable', ['name' => 'vehicle_vehicle_relation1_n_self_referencing']), new Attribute('ORM\InverseJoinColumn', ['name' => 'relation1_n_self_referencing_vehicle_id', 'nullable' => false, 'unique' => true])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relation1_N_self_referencing'), 'Vehicle') + ); + $this->assertEquals( + [new Attribute('ORM\ManyToMany', ['targetEntity' => 'App\Entity\QuantitativeValue']), new Attribute('ORM\JoinTable', ['name' => 'vehicle_quantitative_value_relation_nn'])], + $this->generator->generatePropertyAttributes($this->classMap['Vehicle']->getPropertyByName('relationN_N'), 'Vehicle') + ); + } +} diff --git a/tests/ClassMutator/ClassParentMutatorTest.php b/tests/ClassMutator/ClassParentMutatorTest.php new file mode 100644 index 00000000..5ed3d84e --- /dev/null +++ b/tests/ClassMutator/ClassParentMutatorTest.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\ClassMutator; + +use ApiPlatform\SchemaGenerator\ClassMutator\ClassParentMutator; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Prophecy\PhpUnit\ProphecyTrait; +use Prophecy\Prophecy\ObjectProphecy; +use Psr\Log\LoggerInterface; +use Symfony\Component\Config\Definition\Processor; + +class ClassParentMutatorTest extends TestCase +{ + use ProphecyTrait; + + private ObjectProphecy $loggerProphecy; + private ClassParentMutator $classParentMutator; + + protected function setUp(): void + { + $this->loggerProphecy = $this->prophesize(LoggerInterface::class); + + $configuration = new SchemaGeneratorConfiguration(); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'types' => [ + 'BlogPosting' => ['parent' => 'SocialMediaPosting'], + 'SocialMediaPosting' => ['namespaces' => ['class' => 'socialMediaNamespace']], + ], + ]]); + + $this->classParentMutator = new ClassParentMutator($processedConfiguration, new PhpTypeConverter()); + $this->classParentMutator->setLogger($this->loggerProphecy->reveal()); + } + + #[DataProvider('provideInvokeTestCases')] + public function testInvoke(SchemaClass $class, SchemaClass $expectedClass, ?string $loggerMessage = null): void + { + if ($loggerMessage) { + $this->loggerProphecy->info($loggerMessage)->shouldBeCalled(); + } + + ($this->classParentMutator)($class, []); + + $this->assertEquals($expectedClass, $class); + } + + /** + * @return \Generator + */ + public static function provideInvokeTestCases(): \Generator + { + $graph = new RdfGraph(); + $product = new SchemaClass('Product', new RdfResource('https://schema.org/Product', $graph)); + yield 'no parent' => [clone $product, clone $product]; + + $graph = new RdfGraph(); + $graph->addResource('https://schema.org/CreativeWork', 'rdfs:subClassOf', 'https://schema.org/Thing'); + $creativeWork = new SchemaClass('CreativeWork', new RdfResource('https://schema.org/CreativeWork', $graph)); + yield 'with subclass' => [clone $creativeWork, (clone $creativeWork)->withParent('Thing')]; + + $graph = new RdfGraph(); + $graph->addResource('https://schema.org/CreativeWork', 'rdfs:subClassOf', 'https://schema.org/Work'); + $graph->addResource('https://schema.org/CreativeWork', 'rdfs:subClassOf', 'https://schema.org/Thing'); + $creativeWork = new SchemaClass('CreativeWork', new RdfResource('https://schema.org/CreativeWork', $graph)); + yield 'with multiple subclasses' => [clone $creativeWork, (clone $creativeWork)->withParent('Work'), 'The type "https://schema.org/CreativeWork" has several supertypes. Using the first one.']; + + $graph = new RdfGraph(); + $blogPosting = new SchemaClass('BlogPosting', new RdfResource('https://schema.org/BlogPosting', $graph)); + yield 'with parent' => [clone $blogPosting, (clone $blogPosting)->withParent('SocialMediaPosting')->addUse(new Use_('socialMediaNamespace\SocialMediaPosting'))]; + } +} diff --git a/tests/ClassMutator/ClassPropertiesAppenderTest.php b/tests/ClassMutator/ClassPropertiesAppenderTest.php new file mode 100644 index 00000000..0b5600cd --- /dev/null +++ b/tests/ClassMutator/ClassPropertiesAppenderTest.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\ClassMutator; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\ClassMutator\ClassPropertiesAppender; +use ApiPlatform\SchemaGenerator\GoodRelationsBridge; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property; +use ApiPlatform\SchemaGenerator\Schema\Model\Type\PrimitiveType as SchemaPrimitiveType; +use ApiPlatform\SchemaGenerator\Schema\PropertyGenerator\PropertyGenerator as SchemaPropertyGenerator; +use ApiPlatform\SchemaGenerator\Schema\TypeConverter; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Prophecy\PhpUnit\ProphecyTrait; +use Prophecy\Prophecy\ObjectProphecy; +use Psr\Log\LoggerInterface; +use Symfony\Component\Config\Definition\Processor; + +class ClassPropertiesAppenderTest extends TestCase +{ + use ProphecyTrait; + + private RdfGraph $graph; + private ObjectProphecy $loggerProphecy; + private ClassPropertiesAppender $classPropertiesAppender; + + protected function setUp(): void + { + $this->loggerProphecy = $this->prophesize(LoggerInterface::class); + + $propertyGenerator = new SchemaPropertyGenerator(new GoodRelationsBridge([]), new TypeConverter(), new PhpTypeConverter()); + + $configuration = new SchemaGeneratorConfiguration(); + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'types' => [ + 'Person' => ['properties' => ['givenName' => []]], + ], + ]]); + + $this->graph ??= new RdfGraph(); + + $this->graph->addResource('https://schema.org/articleBody', 'rdf:type', 'rdf:Property'); + $this->graph->addResource('https://schema.org/articleBody', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $this->graph->addResource('https://schema.org/articleSection', 'rdf:type', 'rdf:Property'); + $this->graph->addResource('https://schema.org/articleSection', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $this->graph->addResource('https://schema.org/givenName', 'rdf:type', 'rdfs:Property'); + $this->graph->addResource('https://schema.org/givenName', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $propertiesMap = [ + 'https://schema.org/Article' => [new RdfResource('https://schema.org/articleBody', $this->graph), new RdfResource('https://schema.org/articleSection', $this->graph)], + 'https://schema.org/Person' => [new RdfResource('https://schema.org/givenName', $this->graph)], + ]; + + $this->classPropertiesAppender = new ClassPropertiesAppender($propertyGenerator, $processedConfiguration, $propertiesMap); + $this->classPropertiesAppender->setLogger($this->loggerProphecy->reveal()); + } + + #[DataProvider('provideInvokeTestCases')] + public function testInvoke(SchemaClass $class, SchemaClass $expectedClass, ?RdfGraph &$graph = null, ?string $loggerMessage = null): void + { + if ($graph) { + $this->graph = $graph; + $this->setUp(); + } + + if ($loggerMessage) { + $this->loggerProphecy->warning($loggerMessage)->shouldBeCalled(); + } + + ($this->classPropertiesAppender)($class, ['graphs' => [], 'cardinalities' => []]); + + $this->assertEquals($expectedClass, $class); + } + + /** + * @return \Generator + */ + public static function provideInvokeTestCases(): \Generator + { + $product = new SchemaClass('Product', new RdfResource('https://schema.org/Product')); + yield 'no configuration no properties in map' => [clone $product, clone $product, null, 'Properties for "https://schema.org/Product" not found in the map.']; + + $article = new SchemaClass('Article', new RdfResource('https://schema.org/Article')); + $graph = new RdfGraph(); + $expectedArticleBodyProperty = new Property('articleBody'); + $expectedArticleBodyProperty->cardinality = CardinalitiesExtractor::CARDINALITY_UNKNOWN; + $expectedArticleBodyProperty->resource = new RdfResource('https://schema.org/articleBody', $graph); + $expectedArticleBodyProperty->range = new RdfResource('https://schema.org/Text', $graph); + $expectedArticleBodyProperty->rangeName = 'Text'; + $expectedArticleBodyProperty->type = new SchemaPrimitiveType('string'); + $expectedArticleBodyProperty->isNullable = true; + $expectedArticleSectionProperty = new Property('articleSection'); + $expectedArticleSectionProperty->cardinality = CardinalitiesExtractor::CARDINALITY_UNKNOWN; + $expectedArticleSectionProperty->resource = new RdfResource('https://schema.org/articleSection', $graph); + $expectedArticleSectionProperty->range = new RdfResource('https://schema.org/Text', $graph); + $expectedArticleSectionProperty->rangeName = 'Text'; + $expectedArticleSectionProperty->type = new SchemaPrimitiveType('string'); + $expectedArticleSectionProperty->isNullable = true; + yield 'no configuration' => [clone $article, (clone $article)->addProperty($expectedArticleBodyProperty)->addProperty($expectedArticleSectionProperty), $graph]; + + $graph = new RdfGraph(); + $person = new SchemaClass('Person', new RdfResource('https://schema.org/Person', $graph)); + $expectedGivenNameProperty = new Property('givenName'); + $expectedGivenNameProperty->cardinality = CardinalitiesExtractor::CARDINALITY_UNKNOWN; + $expectedGivenNameProperty->resource = new RdfResource('https://schema.org/givenName', $graph); + $expectedGivenNameProperty->range = new RdfResource('https://schema.org/Text', $graph); + $expectedGivenNameProperty->rangeName = 'Text'; + $expectedGivenNameProperty->type = new SchemaPrimitiveType('string'); + $expectedGivenNameProperty->isNullable = true; + $expectedGivenNameProperty->isRequired = true; + yield 'with configuration' => [clone $person, (clone $person)->addProperty($expectedGivenNameProperty), $graph]; + } +} diff --git a/tests/Command/DumpConfigurationTest.php b/tests/Command/DumpConfigurationTest.php new file mode 100644 index 00000000..f8ce7614 --- /dev/null +++ b/tests/Command/DumpConfigurationTest.php @@ -0,0 +1,283 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\Command; + +use ApiPlatform\SchemaGenerator\Command\DumpConfigurationCommand; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\Tester\CommandTester; + +/** + * @author Kévin Dunglas + */ +class DumpConfigurationTest extends TestCase +{ + public function testDumpConfiguration(): void + { + $commandTester = new CommandTester(new DumpConfigurationCommand()); + $this->assertEquals(0, $commandTester->execute([])); + $this->assertEquals(<<<'YAML' +config: + openApi: + file: null + + # RDF vocabularies + vocabularies: + + # Prototype + uri: + + # RDF vocabulary to use + uri: ~ # Example: 'https://schema.org/version/latest/schemaorg-current-https.rdf' + + # RDF vocabulary format + format: null # Example: rdfxml + + # Generate all types for this vocabulary, even if an explicit configuration exists. If allTypes is enabled globally, it can be disabled for this particular vocabulary + allTypes: null + + # Attributes (merged with generated attributes) + attributes: [] + + # Namespace of the vocabulary to import + vocabularyNamespace: 'https://schema.org/' # Example: 'http://www.w3.org/ns/activitystreams#' + + # Relations configuration + relations: + + # OWL relation URIs containing cardinality information in the GoodRelations format + uris: # Example: 'https://www.heppnetz.de/ontologies/goodrelations/v1.owl' + + # Default: + - https://www.heppnetz.de/ontologies/goodrelations/v1.owl + + # The default cardinality to use when it cannot be extracted + defaultCardinality: (1..1) # One of "(0..1)"; "(0..*)"; "(1..1)"; "(1..*)"; "(*..0)"; "(*..1)"; "(*..*)" + + # Debug mode + debug: false + + # Use old API Platform attributes (API Platform < 2.7) + apiPlatformOldAttributes: false + + # IDs configuration + id: + + # Automatically add an id field to entities + generate: true + + # The ID generation strategy to use ("none" to not let the database generate IDs). + generationStrategy: auto # One of "auto"; "none"; "uuid"; "mongoid" + + # Is the ID writable? Only applicable if "generationStrategy" is "uuid". + writable: false + + # Generate interfaces and use Doctrine's Resolve Target Entity feature + useInterface: false + + # Emit a warning if a property is not derived from GoodRelations + checkIsGoodRelations: false + + # A license or any text to use as header of generated files + header: null # Example: '// (c) Kévin Dunglas ' + + # PHP namespaces + namespaces: + + # The global namespace's prefix + prefix: null # Example: App\ + + # The namespace of the generated entities + entity: App\Entity # Example: App\Entity + + # The namespace of the generated enumerations + enum: App\Enum # Example: App\Enum + + # The namespace of the generated interfaces + interface: App\Model # Example: App\Model + + # Custom uses (for instance if you use a custom attribute) + uses: + + # Prototype + name: + + # Name of this use + name: ~ # Example: App\Attributes\MyAttribute + + # The alias to use for this use + alias: null + + # Doctrine + doctrine: + + # Use Doctrine's ArrayCollection instead of standard arrays + useCollection: true + + # The Resolve Target Entity Listener config file path + resolveTargetEntityConfigPath: null + + # The Resolve Target Entity Listener config file type + resolveTargetEntityConfigType: XML # One of "XML"; "yaml" + + # Doctrine inheritance attributes (if set, no other attributes are generated) + inheritanceAttributes: [] + + # The inheritance type to use when an entity is referenced by another and has child + inheritanceType: JOINED # One of "JOINED"; "SINGLE_TABLE"; "SINGLE_COLLECTION"; "TABLE_PER_CLASS"; "COLLECTION_PER_CLASS"; "NONE" + + # Maximum length of any given database identifier, like tables or column names + maxIdentifierLength: 63 + + # Symfony Validator Component + validator: + + # Generate @Assert\Type annotation + assertType: false + + # The value of the phpDoc's @author annotation + author: false # Example: 'Kévin Dunglas ' + + # Visibility of entities fields + fieldVisibility: private # One of "private"; "protected"; "public" + + # Set this flag to false to not generate getter, setter, adder and remover methods + accessorMethods: true + + # Set this flag to true to generate fluent setter, adder and remover methods + fluentMutatorMethods: false + rangeMapping: + + # Prototype + name: ~ + + # Generate all types, even if an explicit configuration exists + allTypes: false + + # If a type is present in a vocabulary but not explicitly imported (types) or if the vocabulary is not totally imported (allTypes), it will be generated + resolveTypes: false + + # Types to import from the vocabulary + types: + + # Prototype + id: + + # Exclude this type, even if "allTypes" is set to true" + exclude: false + + # Namespace of the vocabulary of this type (defaults to the global "vocabularyNamespace" entry) + vocabularyNamespace: null # Example: 'http://www.w3.org/ns/activitystreams#' + + # Is the class abstract? (null to guess) + abstract: null + + # Is the class embeddable? + embeddable: false + + # Type namespaces + namespaces: + + # The namespace for the generated class (override any other defined namespace) + class: null + + # The namespace for the generated interface (override any other defined namespace) + interface: null + + # Attributes (merged with generated attributes) + attributes: [] + + # The parent class, set to false for a top level class + parent: false + + # If declaring a custom class, this will be the class from which properties type will be guessed + guessFrom: Thing + + # Operations for the class + operations: [] + + # Import all existing properties + allProperties: false + + # Properties of this type to use + properties: + + # Prototype + id: + + # Exclude this property, even if "allProperties" is set to true" + exclude: false + + # The property range + range: null # Example: Offer + cardinality: unknown # One of "(0..1)"; "(0..*)"; "(1..1)"; "(1..*)"; "(*..0)"; "(*..1)"; "(*..*)"; "unknown" + + # Symfony Serialization Groups + groups: [] + + # The doctrine mapped by attribute + mappedBy: null # Example: partOfSeason + + # The doctrine inversed by attribute + inversedBy: null # Example: episodes + + # Is the property readable? + readable: true + + # Is the property writable? + writable: true + + # Is the property nullable? (if null, cardinality will be used: will be true if no cardinality found) + nullable: null + + # The property default value + defaultValue: null + + # Is the property required? + required: true + + # The property unique + unique: false + + # Is the property embedded? + embedded: false + + # Attributes (merged with generated attributes) + attributes: [] + + # Annotation generators to use + annotationGenerators: + + # Default: + - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator + + # Attribute generators to use + attributeGenerators: + + # Defaults: + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAssociationOverrideAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\ApiPlatformCoreAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConfigurationAttributeGenerator + + # Directories for custom generator twig templates + generatorTemplates: [] + + +YAML + , + $commandTester->getDisplay() + ); + } +} diff --git a/tests/Command/ExtractCardinalitiesCommandTest.php b/tests/Command/ExtractCardinalitiesCommandTest.php new file mode 100644 index 00000000..8ef3c115 --- /dev/null +++ b/tests/Command/ExtractCardinalitiesCommandTest.php @@ -0,0 +1,1481 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\Command; + +use ApiPlatform\SchemaGenerator\Command\ExtractCardinalitiesCommand; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\Tester\CommandTester; + +/** + * @author Kévin Dunglas + */ +class ExtractCardinalitiesCommandTest extends TestCase +{ + public function testExtractCardinalities(): void + { + $commandTester = new CommandTester(new ExtractCardinalitiesCommand()); + $this->assertEquals(0, $commandTester->execute( + ['--vocabulary-file' => __DIR__.'/../data/schema.rdf', '--cardinality-file' => __DIR__.'/../data/goodrelations.owl'] + )); + + $this->assertEquals(<<<'JSON' +{ + "https:\/\/schema.org\/modifiedTime": "(0..1)", + "https:\/\/schema.org\/productionDate": "(0..1)", + "https:\/\/schema.org\/highPrice": "(0..1)", + "https:\/\/schema.org\/taxID": "(0..1)", + "https:\/\/schema.org\/identifier": "(0..1)", + "https:\/\/schema.org\/securityScreening": "(0..1)", + "https:\/\/schema.org\/musicReleaseFormat": "unknown", + "https:\/\/schema.org\/returnShippingFeesAmount": "unknown", + "https:\/\/schema.org\/bankAccountType": "(0..1)", + "https:\/\/schema.org\/broadcastDisplayName": "(0..1)", + "https:\/\/schema.org\/negativeNotes": "unknown", + "https:\/\/schema.org\/cashBack": "unknown", + "https:\/\/schema.org\/colorist": "(0..1)", + "https:\/\/schema.org\/loanPaymentAmount": "(0..1)", + "https:\/\/schema.org\/constrainingProperty": "unknown", + "https:\/\/schema.org\/typicalCreditsPerTerm": "(0..1)", + "https:\/\/schema.org\/bloodSupply": "(0..1)", + "https:\/\/schema.org\/bodyLocation": "unknown", + "https:\/\/schema.org\/copyrightNotice": "unknown", + "https:\/\/schema.org\/honorificSuffix": "unknown", + "https:\/\/schema.org\/layoutImage": "unknown", + "https:\/\/schema.org\/image": "unknown", + "https:\/\/schema.org\/billingIncrement": "(0..1)", + "https:\/\/schema.org\/cvdNumTotBeds": "unknown", + "https:\/\/schema.org\/orderItemNumber": "(0..1)", + "https:\/\/schema.org\/processorRequirements": "unknown", + "https:\/\/schema.org\/eventAttendanceMode": "(0..1)", + "https:\/\/schema.org\/floorLimit": "unknown", + "https:\/\/schema.org\/estimatedSalary": "unknown", + "https:\/\/schema.org\/duplicateTherapy": "unknown", + "https:\/\/schema.org\/accessCode": "unknown", + "https:\/\/schema.org\/startOffset": "(0..1)", + "https:\/\/schema.org\/worksFor": "unknown", + "https:\/\/schema.org\/jobStartDate": "(0..1)", + "https:\/\/schema.org\/availabilityStarts": "(0..1)", + "https:\/\/schema.org\/requirements": "unknown", + "https:\/\/schema.org\/softwareRequirements": "unknown", + "https:\/\/schema.org\/returnPolicyCountry": "(0..1)", + "https:\/\/schema.org\/teaches": "(0..1)", + "https:\/\/schema.org\/intensity": "unknown", + "https:\/\/schema.org\/learningResourceType": "(0..1)", + "https:\/\/schema.org\/percentile10": "(0..1)", + "https:\/\/schema.org\/taxonomicRange": "(0..1)", + "https:\/\/schema.org\/isInvolvedInBiologicalProcess": "(0..1)", + "https:\/\/schema.org\/hiringOrganization": "unknown", + "https:\/\/schema.org\/partOfOrder": "(0..1)", + "https:\/\/schema.org\/inStoreReturnsOffered": "unknown", + "https:\/\/schema.org\/discountCurrency": "(0..1)", + "https:\/\/schema.org\/tool": "unknown", + "https:\/\/schema.org\/instrument": "(0..1)", + "https:\/\/schema.org\/volumeNumber": "unknown", + "https:\/\/schema.org\/position": "(0..1)", + "https:\/\/schema.org\/maximumAttendeeCapacity": "(0..1)", + "https:\/\/schema.org\/collection": "unknown", + "https:\/\/schema.org\/object": "(0..1)", + "https:\/\/schema.org\/targetCollection": "unknown", + "https:\/\/schema.org\/correction": "unknown", + "https:\/\/schema.org\/floorLevel": "(0..1)", + "https:\/\/schema.org\/underName": "(0..1)", + "https:\/\/schema.org\/currenciesAccepted": "(0..1)", + "https:\/\/schema.org\/fileFormat": "unknown", + "https:\/\/schema.org\/encodingFormat": "unknown", + "https:\/\/schema.org\/subReservation": "(0..1)", + "https:\/\/schema.org\/reviewAspect": "unknown", + "https:\/\/schema.org\/ineligibleRegion": "(0..*)", + "https:\/\/schema.org\/stageAsNumber": "(0..1)", + "https:\/\/schema.org\/isProprietary": "(0..1)", + "https:\/\/schema.org\/hasOccupation": "(0..1)", + "https:\/\/schema.org\/drug": "unknown", + "https:\/\/schema.org\/itemLocation": "unknown", + "https:\/\/schema.org\/location": "(0..1)", + "https:\/\/schema.org\/interactingDrug": "unknown", + "https:\/\/schema.org\/smokingAllowed": "unknown", + "https:\/\/schema.org\/cvdNumC19OverflowPats": "unknown", + "https:\/\/schema.org\/lodgingUnitDescription": "unknown", + "https:\/\/schema.org\/knownVehicleDamages": "unknown", + "https:\/\/schema.org\/archivedAt": "unknown", + "https:\/\/schema.org\/runsTo": "(0..1)", + "https:\/\/schema.org\/broadcastSignalModulation": "(0..1)", + "https:\/\/schema.org\/priceCurrency": "(1..1)", + "https:\/\/schema.org\/dateModified": "(0..1)", + "https:\/\/schema.org\/touristType": "(0..*)", + "https:\/\/schema.org\/editEIDR": "unknown", + "https:\/\/schema.org\/geoMidpoint": "unknown", + "https:\/\/schema.org\/quest": "(0..1)", + "https:\/\/schema.org\/softwareAddOn": "unknown", + "https:\/\/schema.org\/lodgingUnitType": "unknown", + "https:\/\/schema.org\/thumbnail": "unknown", + "https:\/\/schema.org\/fromLocation": "unknown", + "https:\/\/schema.org\/businessFunction": "(1..*)", + "https:\/\/schema.org\/arrivalAirport": "(0..1)", + "https:\/\/schema.org\/energyEfficiencyScaleMin": "unknown", + "https:\/\/schema.org\/customer": "unknown", + "https:\/\/schema.org\/includesHealthPlanFormulary": "unknown", + "https:\/\/schema.org\/startDate": "(0..1)", + "https:\/\/schema.org\/mpn": "(0..*)", + "https:\/\/schema.org\/geoRadius": "unknown", + "https:\/\/schema.org\/numberOfBathroomsTotal": "(0..1)", + "https:\/\/schema.org\/expectedPrognosis": "(0..1)", + "https:\/\/schema.org\/arrivalTerminal": "unknown", + "https:\/\/schema.org\/valuePattern": "unknown", + "https:\/\/schema.org\/gtin12": "(0..1)", + "https:\/\/schema.org\/gtin": "unknown", + "https:\/\/schema.org\/startTime": "(0..1)", + "https:\/\/schema.org\/breadcrumb": "unknown", + "https:\/\/schema.org\/gracePeriod": "(0..1)", + "https:\/\/schema.org\/audio": "unknown", + "https:\/\/schema.org\/eligibleRegion": "(0..*)", + "https:\/\/schema.org\/areaServed": "(0..1)", + "https:\/\/schema.org\/actionAccessibilityRequirement": "unknown", + "https:\/\/schema.org\/lastReviewed": "unknown", + "https:\/\/schema.org\/error": "unknown", + "https:\/\/schema.org\/address": "unknown", + "https:\/\/schema.org\/hasMolecularFunction": "unknown", + "https:\/\/schema.org\/noBylinesPolicy": "unknown", + "https:\/\/schema.org\/publishingPrinciples": "(0..1)", + "https:\/\/schema.org\/subtitleLanguage": "unknown", + "https:\/\/schema.org\/sku": "(0..*)", + "https:\/\/schema.org\/endTime": "(0..1)", + "https:\/\/schema.org\/maximumEnrollment": "(0..1)", + "https:\/\/schema.org\/diversityStaffingReport": "unknown", + "https:\/\/schema.org\/directors": "unknown", + "https:\/\/schema.org\/director": "unknown", + "https:\/\/schema.org\/clipNumber": "unknown", + "https:\/\/schema.org\/materialExtent": "(0..1)", + "https:\/\/schema.org\/imagingTechnique": "unknown", + "https:\/\/schema.org\/doseUnit": "(0..1)", + "https:\/\/schema.org\/trailer": "(0..1)", + "https:\/\/schema.org\/emissionsCO2": "(0..1)", + "https:\/\/schema.org\/hasEnergyConsumptionDetails": "unknown", + "https:\/\/schema.org\/accountMinimumInflow": "unknown", + "https:\/\/schema.org\/discussionUrl": "unknown", + "https:\/\/schema.org\/seriousAdverseOutcome": "unknown", + "https:\/\/schema.org\/assesses": "(0..1)", + "https:\/\/schema.org\/cvdNumC19MechVentPats": "unknown", + "https:\/\/schema.org\/guidelineDate": "unknown", + "https:\/\/schema.org\/previousStartDate": "unknown", + "https:\/\/schema.org\/loanType": "(0..1)", + "https:\/\/schema.org\/lyricist": "(0..1)", + "https:\/\/schema.org\/jobLocation": "unknown", + "https:\/\/schema.org\/variantCover": "unknown", + "https:\/\/schema.org\/sdDatePublished": "unknown", + "https:\/\/schema.org\/unsaturatedFatContent": "(0..1)", + "https:\/\/schema.org\/dosageForm": "unknown", + "https:\/\/schema.org\/follows": "(0..*)", + "https:\/\/schema.org\/numAdults": "(0..1)", + "https:\/\/schema.org\/numberOfSeasons": "(0..1)", + "https:\/\/schema.org\/populationType": "unknown", + "https:\/\/schema.org\/actionStatus": "unknown", + "https:\/\/schema.org\/partOfSeason": "(0..1)", + "https:\/\/schema.org\/isPartOf": "(0..1)", + "https:\/\/schema.org\/repeatFrequency": "unknown", + "https:\/\/schema.org\/frequency": "unknown", + "https:\/\/schema.org\/citation": "unknown", + "https:\/\/schema.org\/tourBookingPage": "unknown", + "https:\/\/schema.org\/bccRecipient": "unknown", + "https:\/\/schema.org\/recipient": "unknown", + "https:\/\/schema.org\/deliveryLeadTime": "(0..1)", + "https:\/\/schema.org\/letterer": "(0..1)", + "https:\/\/schema.org\/directApply": "(0..*)", + "https:\/\/schema.org\/lyrics": "(0..1)", + "https:\/\/schema.org\/merchantReturnLink": "unknown", + "https:\/\/schema.org\/legislationType": "(0..1)", + "https:\/\/schema.org\/genre": "unknown", + "https:\/\/schema.org\/contactPoints": "unknown", + "https:\/\/schema.org\/contactPoint": "unknown", + "https:\/\/schema.org\/regionDrained": "(0..1)", + "https:\/\/schema.org\/reviews": "unknown", + "https:\/\/schema.org\/review": "unknown", + "https:\/\/schema.org\/workLocation": "unknown", + "https:\/\/schema.org\/exceptDate": "unknown", + "https:\/\/schema.org\/headline": "unknown", + "https:\/\/schema.org\/postalCodeBegin": "unknown", + "https:\/\/schema.org\/slogan": "unknown", + "https:\/\/schema.org\/penciler": "(0..1)", + "https:\/\/schema.org\/employerOverview": "unknown", + "https:\/\/schema.org\/tissueSample": "(0..1)", + "https:\/\/schema.org\/datasetTimeInterval": "(0..1)", + "https:\/\/schema.org\/temporalCoverage": "(0..1)", + "https:\/\/schema.org\/dateIssued": "(0..1)", + "https:\/\/schema.org\/accountOverdraftLimit": "unknown", + "https:\/\/schema.org\/modelDate": "(0..1)", + "https:\/\/schema.org\/bookingAgent": "unknown", + "https:\/\/schema.org\/broker": "unknown", + "https:\/\/schema.org\/buyer": "unknown", + "https:\/\/schema.org\/participant": "unknown", + "https:\/\/schema.org\/productGroupID": "unknown", + "https:\/\/schema.org\/includesAttraction": "unknown", + "https:\/\/schema.org\/numberOfPartialBathrooms": "unknown", + "https:\/\/schema.org\/backstory": "unknown", + "https:\/\/schema.org\/nonprofitStatus": "unknown", + "https:\/\/schema.org\/restockingFee": "unknown", + "https:\/\/schema.org\/petsAllowed": "unknown", + "https:\/\/schema.org\/rsvpResponse": "(0..1)", + "https:\/\/schema.org\/numberOfRooms": "(0..*)", + "https:\/\/schema.org\/candidate": "unknown", + "https:\/\/schema.org\/structuralClass": "(0..1)", + "https:\/\/schema.org\/area": "(0..1)", + "https:\/\/schema.org\/serviceArea": "(0..1)", + "https:\/\/schema.org\/readBy": "unknown", + "https:\/\/schema.org\/actor": "unknown", + "https:\/\/schema.org\/recognizingAuthority": "unknown", + "https:\/\/schema.org\/specialCommitments": "unknown", + "https:\/\/schema.org\/containedIn": "(0..1)", + "https:\/\/schema.org\/containedInPlace": "(0..1)", + "https:\/\/schema.org\/mediaAuthenticityCategory": "unknown", + "https:\/\/schema.org\/webFeed": "(0..1)", + "https:\/\/schema.org\/monoisotopicMolecularWeight": "(0..1)", + "https:\/\/schema.org\/albumReleaseType": "(0..1)", + "https:\/\/schema.org\/healthcareReportingData": "unknown", + "https:\/\/schema.org\/loanPaymentFrequency": "unknown", + "https:\/\/schema.org\/childMaxAge": "unknown", + "https:\/\/schema.org\/addOn": "(0..*)", + "https:\/\/schema.org\/naics": "(0..*)", + "https:\/\/schema.org\/loanTerm": "(0..1)", + "https:\/\/schema.org\/duration": "(0..1)", + "https:\/\/schema.org\/trackingUrl": "unknown", + "https:\/\/schema.org\/healthPlanCostSharing": "unknown", + "https:\/\/schema.org\/legislationResponsible": "unknown", + "https:\/\/schema.org\/associatedMedia": "unknown", + "https:\/\/schema.org\/url": "unknown", + "https:\/\/schema.org\/ratingExplanation": "unknown", + "https:\/\/schema.org\/interactionType": "(0..1)", + "https:\/\/schema.org\/globalLocationNumber": "(0..1)", + "https:\/\/schema.org\/unnamedSourcesPolicy": "unknown", + "https:\/\/schema.org\/cvdFacilityId": "unknown", + "https:\/\/schema.org\/alignmentType": "unknown", + "https:\/\/schema.org\/seeks": "(0..*)", + "https:\/\/schema.org\/isResizable": "(0..1)", + "https:\/\/schema.org\/minimumPaymentDue": "(0..1)", + "https:\/\/schema.org\/availableAtOrFrom": "(0..*)", + "https:\/\/schema.org\/embeddedTextCaption": "unknown", + "https:\/\/schema.org\/caption": "(0..1)", + "https:\/\/schema.org\/skills": "unknown", + "https:\/\/schema.org\/totalPrice": "(0..1)", + "https:\/\/schema.org\/numberOfAxles": "(0..*)", + "https:\/\/schema.org\/healthPlanNetworkTier": "(0..*)", + "https:\/\/schema.org\/loanMortgageMandateAmount": "unknown", + "https:\/\/schema.org\/bed": "(0..1)", + "https:\/\/schema.org\/possibleTreatment": "unknown", + "https:\/\/schema.org\/billingStart": "unknown", + "https:\/\/schema.org\/telephone": "(0..1)", + "https:\/\/schema.org\/publicationType": "(0..1)", + "https:\/\/schema.org\/vehicleTransmission": "(0..*)", + "https:\/\/schema.org\/distribution": "unknown", + "https:\/\/schema.org\/homeTeam": "(0..1)", + "https:\/\/schema.org\/competitor": "unknown", + "https:\/\/schema.org\/dateSent": "(0..1)", + "https:\/\/schema.org\/currentExchangeRate": "(0..1)", + "https:\/\/schema.org\/occupancy": "(0..*)", + "https:\/\/schema.org\/storageRequirements": "unknown", + "https:\/\/schema.org\/title": "(0..1)", + "https:\/\/schema.org\/authenticator": "(0..1)", + "https:\/\/schema.org\/numberedPosition": "unknown", + "https:\/\/schema.org\/studyLocation": "(0..1)", + "https:\/\/schema.org\/branch": "(0..1)", + "https:\/\/schema.org\/arterialBranch": "(0..1)", + "https:\/\/schema.org\/diseaseSpreadStatistics": "unknown", + "https:\/\/schema.org\/callSign": "unknown", + "https:\/\/schema.org\/isAcceptingNewPatients": "(0..1)", + "https:\/\/schema.org\/iupacName": "unknown", + "https:\/\/schema.org\/creativeWorkStatus": "(0..1)", + "https:\/\/schema.org\/legalStatus": "(0..1)", + "https:\/\/schema.org\/sourceOrganization": "(0..1)", + "https:\/\/schema.org\/bioChemInteraction": "unknown", + "https:\/\/schema.org\/numberOfAvailableAccommodationUnits": "unknown", + "https:\/\/schema.org\/geoEquals": "unknown", + "https:\/\/schema.org\/course": "unknown", + "https:\/\/schema.org\/exerciseCourse": "unknown", + "https:\/\/schema.org\/videoFrameSize": "(0..1)", + "https:\/\/schema.org\/percentile25": "(0..1)", + "https:\/\/schema.org\/freeShippingThreshold": "unknown", + "https:\/\/schema.org\/orderDelivery": "(0..1)", + "https:\/\/schema.org\/numberOfPlayers": "unknown", + "https:\/\/schema.org\/torque": "(0..*)", + "https:\/\/schema.org\/foodWarning": "unknown", + "https:\/\/schema.org\/physiologicalBenefits": "unknown", + "https:\/\/schema.org\/actionPlatform": "(0..*)", + "https:\/\/schema.org\/flightNumber": "(0..1)", + "https:\/\/schema.org\/isLocatedInSubcellularLocation": "(0..1)", + "https:\/\/schema.org\/isSimilarTo": "(0..*)", + "https:\/\/schema.org\/coverageStartTime": "(0..1)", + "https:\/\/schema.org\/printColumn": "(0..1)", + "https:\/\/schema.org\/monthlyMinimumRepaymentAmount": "(0..1)", + "https:\/\/schema.org\/labelDetails": "unknown", + "https:\/\/schema.org\/foodEvent": "unknown", + "https:\/\/schema.org\/seatingCapacity": "(0..*)", + "https:\/\/schema.org\/offersPrescriptionByMail": "unknown", + "https:\/\/schema.org\/acceptsReservations": "unknown", + "https:\/\/schema.org\/restPeriods": "unknown", + "https:\/\/schema.org\/originAddress": "unknown", + "https:\/\/schema.org\/includesHealthPlanNetwork": "unknown", + "https:\/\/schema.org\/availableDeliveryMethod": "(0..*)", + "https:\/\/schema.org\/landlord": "unknown", + "https:\/\/schema.org\/eligibleCustomerType": "(0..*)", + "https:\/\/schema.org\/instructor": "unknown", + "https:\/\/schema.org\/postalCodeEnd": "unknown", + "https:\/\/schema.org\/realEstateAgent": "unknown", + "https:\/\/schema.org\/numberOfItems": "(0..1)", + "https:\/\/schema.org\/claimReviewed": "unknown", + "https:\/\/schema.org\/relatedTo": "(0..1)", + "https:\/\/schema.org\/vehicleEngine": "unknown", + "https:\/\/schema.org\/itemListElement": "unknown", + "https:\/\/schema.org\/unitText": "unknown", + "https:\/\/schema.org\/suggestedGender": "(0..1)", + "https:\/\/schema.org\/measuredProperty": "(0..1)", + "https:\/\/schema.org\/assemblyVersion": "unknown", + "https:\/\/schema.org\/brand": "(0..*)", + "https:\/\/schema.org\/broadcaster": "(0..1)", + "https:\/\/schema.org\/creditedTo": "(0..1)", + "https:\/\/schema.org\/postalCodeRange": "unknown", + "https:\/\/schema.org\/interestRate": "(0..1)", + "https:\/\/schema.org\/feesAndCommissionsSpecification": "unknown", + "https:\/\/schema.org\/sdPublisher": "unknown", + "https:\/\/schema.org\/passengerPriorityStatus": "(0..1)", + "https:\/\/schema.org\/stage": "(0..1)", + "https:\/\/schema.org\/downloadUrl": "unknown", + "https:\/\/schema.org\/availableLanguage": "unknown", + "https:\/\/schema.org\/browserRequirements": "unknown", + "https:\/\/schema.org\/suggestedAge": "(0..1)", + "https:\/\/schema.org\/postalCode": "(0..1)", + "https:\/\/schema.org\/programPrerequisites": "unknown", + "https:\/\/schema.org\/publicTransportClosuresInfo": "unknown", + "https:\/\/schema.org\/resultComment": "unknown", + "https:\/\/schema.org\/result": "(0..1)", + "https:\/\/schema.org\/schoolClosuresInfo": "unknown", + "https:\/\/schema.org\/suggestedMinAge": "unknown", + "https:\/\/schema.org\/courseCode": "(0..1)", + "https:\/\/schema.org\/actionableFeedbackPolicy": "unknown", + "https:\/\/schema.org\/contactlessPayment": "unknown", + "https:\/\/schema.org\/healthPlanDrugOption": "unknown", + "https:\/\/schema.org\/numberOfBedrooms": "(0..1)", + "https:\/\/schema.org\/chemicalComposition": "(0..1)", + "https:\/\/schema.org\/attendees": "unknown", + "https:\/\/schema.org\/attendee": "unknown", + "https:\/\/schema.org\/healthCondition": "(0..*)", + "https:\/\/schema.org\/resultReview": "unknown", + "https:\/\/schema.org\/unitCode": "(1..1)", + "https:\/\/schema.org\/healthPlanNetworkId": "unknown", + "https:\/\/schema.org\/composer": "(0..1)", + "https:\/\/schema.org\/suitableForDiet": "unknown", + "https:\/\/schema.org\/seatNumber": "(0..1)", + "https:\/\/schema.org\/countriesNotSupported": "unknown", + "https:\/\/schema.org\/procedureType": "(0..1)", + "https:\/\/schema.org\/catalog": "unknown", + "https:\/\/schema.org\/includedInDataCatalog": "unknown", + "https:\/\/schema.org\/map": "unknown", + "https:\/\/schema.org\/hasMap": "unknown", + "https:\/\/schema.org\/namedPosition": "unknown", + "https:\/\/schema.org\/roleName": "unknown", + "https:\/\/schema.org\/endDate": "(0..1)", + "https:\/\/schema.org\/accessibilityHazard": "unknown", + "https:\/\/schema.org\/requiredMaxAge": "unknown", + "https:\/\/schema.org\/appliesToPaymentMethod": "(1..*)", + "https:\/\/schema.org\/openingHoursSpecification": "(0..*)", + "https:\/\/schema.org\/qualifications": "unknown", + "https:\/\/schema.org\/dateVehicleFirstRegistered": "(0..1)", + "https:\/\/schema.org\/bioChemSimilarity": "unknown", + "https:\/\/schema.org\/primaryPrevention": "unknown", + "https:\/\/schema.org\/suggestedMeasurement": "unknown", + "https:\/\/schema.org\/printEdition": "(0..1)", + "https:\/\/schema.org\/lesserOrEqual": "(0..*)", + "https:\/\/schema.org\/musicalKey": "(0..1)", + "https:\/\/schema.org\/width": "(0..1)", + "https:\/\/schema.org\/exerciseRelatedDiet": "unknown", + "https:\/\/schema.org\/branchOf": "(0..1)", + "https:\/\/schema.org\/parentOrganization": "(0..1)", + "https:\/\/schema.org\/quarantineGuidelines": "unknown", + "https:\/\/schema.org\/median": "(0..1)", + "https:\/\/schema.org\/molecularWeight": "unknown", + "https:\/\/schema.org\/broadcastAffiliateOf": "(0..*)", + "https:\/\/schema.org\/hasBioPolymerSequence": "unknown", + "https:\/\/schema.org\/hasRepresentation": "unknown", + "https:\/\/schema.org\/pathophysiology": "unknown", + "https:\/\/schema.org\/financialAidEligible": "unknown", + "https:\/\/schema.org\/inPlaylist": "(0..1)", + "https:\/\/schema.org\/minPrice": "(1..1)", + "https:\/\/schema.org\/amount": "(0..1)", + "https:\/\/schema.org\/availabilityEnds": "(0..1)", + "https:\/\/schema.org\/broadcastFrequency": "(0..1)", + "https:\/\/schema.org\/author": "(0..1)", + "https:\/\/schema.org\/geoContains": "unknown", + "https:\/\/schema.org\/maintainer": "unknown", + "https:\/\/schema.org\/offerCount": "(0..1)", + "https:\/\/schema.org\/molecularFormula": "(0..1)", + "https:\/\/schema.org\/homeLocation": "unknown", + "https:\/\/schema.org\/hasPOS": "(0..*)", + "https:\/\/schema.org\/nerve": "(0..1)", + "https:\/\/schema.org\/minValue": "(0..1)", + "https:\/\/schema.org\/audienceType": "(0..1)", + "https:\/\/schema.org\/childMinAge": "unknown", + "https:\/\/schema.org\/driveWheelConfiguration": "(0..1)", + "https:\/\/schema.org\/engineType": "(0..1)", + "https:\/\/schema.org\/fuelCapacity": "(0..*)", + "https:\/\/schema.org\/musicArrangement": "unknown", + "https:\/\/schema.org\/appliesToDeliveryMethod": "(0..*)", + "https:\/\/schema.org\/performerIn": "unknown", + "https:\/\/schema.org\/menuAddOn": "(0..*)", + "https:\/\/schema.org\/transitTime": "(0..1)", + "https:\/\/schema.org\/leiCode": "unknown", + "https:\/\/schema.org\/requiredQuantity": "(0..*)", + "https:\/\/schema.org\/albums": "unknown", + "https:\/\/schema.org\/album": "unknown", + "https:\/\/schema.org\/sensoryRequirement": "unknown", + "https:\/\/schema.org\/value": "(0..1)", + "https:\/\/schema.org\/speed": "(0..*)", + "https:\/\/schema.org\/providesService": "(0..1)", + "https:\/\/schema.org\/bookFormat": "(0..1)", + "https:\/\/schema.org\/accountId": "(0..1)", + "https:\/\/schema.org\/departureTime": "(0..1)", + "https:\/\/schema.org\/additionalType": "unknown", + "https:\/\/schema.org\/gtin14": "(0..*)", + "https:\/\/schema.org\/relatedCondition": "unknown", + "https:\/\/schema.org\/runtime": "unknown", + "https:\/\/schema.org\/runtimePlatform": "unknown", + "https:\/\/schema.org\/busNumber": "(0..1)", + "https:\/\/schema.org\/hasHealthAspect": "unknown", + "https:\/\/schema.org\/vatID": "(0..1)", + "https:\/\/schema.org\/givenName": "unknown", + "https:\/\/schema.org\/fundedItem": "unknown", + "https:\/\/schema.org\/releaseDate": "(0..1)", + "https:\/\/schema.org\/clincalPharmacology": "unknown", + "https:\/\/schema.org\/clinicalPharmacology": "unknown", + "https:\/\/schema.org\/applicationStartDate": "(0..1)", + "https:\/\/schema.org\/hasDriveThroughService": "unknown", + "https:\/\/schema.org\/liveBlogUpdate": "unknown", + "https:\/\/schema.org\/discountCode": "unknown", + "https:\/\/schema.org\/partOfSystem": "(0..1)", + "https:\/\/schema.org\/ratingCount": "(0..1)", + "https:\/\/schema.org\/sender": "unknown", + "https:\/\/schema.org\/merchant": "unknown", + "https:\/\/schema.org\/seller": "unknown", + "https:\/\/schema.org\/numberOfLoanPayments": "(0..1)", + "https:\/\/schema.org\/countryOfOrigin": "(0..1)", + "https:\/\/schema.org\/vehicleIdentificationNumber": "(0..1)", + "https:\/\/schema.org\/serialNumber": "(0..*)", + "https:\/\/schema.org\/termsOfService": "unknown", + "https:\/\/schema.org\/targetProduct": "unknown", + "https:\/\/schema.org\/smiles": "unknown", + "https:\/\/schema.org\/permitAudience": "(0..1)", + "https:\/\/schema.org\/addressLocality": "(0..1)", + "https:\/\/schema.org\/orderItemStatus": "(0..1)", + "https:\/\/schema.org\/applicantLocationRequirements": "(0..*)", + "https:\/\/schema.org\/creditText": "(0..*)", + "https:\/\/schema.org\/accommodationFloorPlan": "unknown", + "https:\/\/schema.org\/codingSystem": "(0..1)", + "https:\/\/schema.org\/gtin8": "(0..*)", + "https:\/\/schema.org\/targetPlatform": "unknown", + "https:\/\/schema.org\/releaseNotes": "unknown", + "https:\/\/schema.org\/valueReference": "(0..*)", + "https:\/\/schema.org\/wordCount": "(0..1)", + "https:\/\/schema.org\/height": "(0..1)", + "https:\/\/schema.org\/borrower": "unknown", + "https:\/\/schema.org\/educationalCredentialAwarded": "unknown", + "https:\/\/schema.org\/itemShipped": "(0..*)", + "https:\/\/schema.org\/originalMediaContextDescription": "unknown", + "https:\/\/schema.org\/description": "(0..1)", + "https:\/\/schema.org\/characterAttribute": "unknown", + "https:\/\/schema.org\/eligibleDuration": "(0..1)", + "https:\/\/schema.org\/totalPaymentDue": "(0..1)", + "https:\/\/schema.org\/paymentMethod": "(0..1)", + "https:\/\/schema.org\/muscleAction": "(0..1)", + "https:\/\/schema.org\/merchantReturnDays": "unknown", + "https:\/\/schema.org\/hasMeasurement": "unknown", + "https:\/\/schema.org\/serverStatus": "unknown", + "https:\/\/schema.org\/departureGate": "unknown", + "https:\/\/schema.org\/relevantSpecialty": "unknown", + "https:\/\/schema.org\/numberOfPreviousOwners": "(0..*)", + "https:\/\/schema.org\/nsn": "unknown", + "https:\/\/schema.org\/beneficiaryBank": "unknown", + "https:\/\/schema.org\/drugUnit": "(0..1)", + "https:\/\/schema.org\/departureTerminal": "unknown", + "https:\/\/schema.org\/entertainmentBusiness": "unknown", + "https:\/\/schema.org\/weightTotal": "(0..*)", + "https:\/\/schema.org\/cutoffTime": "unknown", + "https:\/\/schema.org\/sdLicense": "unknown", + "https:\/\/schema.org\/reviewedBy": "unknown", + "https:\/\/schema.org\/correctionsPolicy": "unknown", + "https:\/\/schema.org\/employees": "unknown", + "https:\/\/schema.org\/employee": "unknown", + "https:\/\/schema.org\/weight": "(0..1)", + "https:\/\/schema.org\/originalMediaLink": "unknown", + "https:\/\/schema.org\/supersededBy": "unknown", + "https:\/\/schema.org\/repetitions": "unknown", + "https:\/\/schema.org\/costOrigin": "unknown", + "https:\/\/schema.org\/administrationRoute": "unknown", + "https:\/\/schema.org\/hasMenuItem": "unknown", + "https:\/\/schema.org\/productionCompany": "(0..1)", + "https:\/\/schema.org\/isLiveBroadcast": "(0..1)", + "https:\/\/schema.org\/cvdFacilityCounty": "unknown", + "https:\/\/schema.org\/mediaItemAppearance": "(0..*)", + "https:\/\/schema.org\/cvdNumC19HospPats": "unknown", + "https:\/\/schema.org\/reviewBody": "(0..1)", + "https:\/\/schema.org\/hasMerchantReturnPolicy": "unknown", + "https:\/\/schema.org\/diet": "unknown", + "https:\/\/schema.org\/opponent": "unknown", + "https:\/\/schema.org\/postOp": "unknown", + "https:\/\/schema.org\/biologicalRole": "unknown", + "https:\/\/schema.org\/character": "unknown", + "https:\/\/schema.org\/softwareHelp": "unknown", + "https:\/\/schema.org\/titleEIDR": "unknown", + "https:\/\/schema.org\/inProductGroupWithID": "unknown", + "https:\/\/schema.org\/termDuration": "(0..*)", + "https:\/\/schema.org\/accessibilityFeature": "unknown", + "https:\/\/schema.org\/text": "(0..1)", + "https:\/\/schema.org\/actors": "unknown", + "https:\/\/schema.org\/returnFees": "(0..1)", + "https:\/\/schema.org\/featureList": "unknown", + "https:\/\/schema.org\/affectedBy": "unknown", + "https:\/\/schema.org\/salaryCurrency": "(0..1)", + "https:\/\/schema.org\/pickupLocation": "unknown", + "https:\/\/schema.org\/knowsLanguage": "unknown", + "https:\/\/schema.org\/measurementTechnique": "(0..*)", + "https:\/\/schema.org\/paymentDue": "(0..1)", + "https:\/\/schema.org\/paymentDueDate": "(0..1)", + "https:\/\/schema.org\/referenceQuantity": "(0..1)", + "https:\/\/schema.org\/announcementLocation": "unknown", + "https:\/\/schema.org\/spatialCoverage": "(0..*)", + "https:\/\/schema.org\/option": "unknown", + "https:\/\/schema.org\/actionOption": "unknown", + "https:\/\/schema.org\/followee": "unknown", + "https:\/\/schema.org\/hasOfferCatalog": "unknown", + "https:\/\/schema.org\/encodings": "unknown", + "https:\/\/schema.org\/encoding": "unknown", + "https:\/\/schema.org\/temporal": "(0..1)", + "https:\/\/schema.org\/producer": "(0..1)", + "https:\/\/schema.org\/usedToDiagnose": "unknown", + "https:\/\/schema.org\/eduQuestionType": "unknown", + "https:\/\/schema.org\/addressCountry": "(0..1)", + "https:\/\/schema.org\/numberOfAirbags": "(0..1)", + "https:\/\/schema.org\/arrivalBusStop": "(0..1)", + "https:\/\/schema.org\/secondaryPrevention": "unknown", + "https:\/\/schema.org\/loanRepaymentForm": "unknown", + "https:\/\/schema.org\/sha256": "(0..1)", + "https:\/\/schema.org\/expectsAcceptanceOf": "unknown", + "https:\/\/schema.org\/responsibilities": "unknown", + "https:\/\/schema.org\/occupationalCredentialAwarded": "unknown", + "https:\/\/schema.org\/expectedArrivalUntil": "(0..1)", + "https:\/\/schema.org\/adverseOutcome": "unknown", + "https:\/\/schema.org\/exerciseType": "(0..*)", + "https:\/\/schema.org\/partySize": "unknown", + "https:\/\/schema.org\/estimatesRiskOf": "(0..1)", + "https:\/\/schema.org\/contentUrl": "unknown", + "https:\/\/schema.org\/advanceBookingRequirement": "(0..1)", + "https:\/\/schema.org\/diagnosis": "(0..*)", + "https:\/\/schema.org\/isRelatedTo": "(0..1)", + "https:\/\/schema.org\/regionsAllowed": "(0..1)", + "https:\/\/schema.org\/legislationLegalValue": "(0..1)", + "https:\/\/schema.org\/enginePower": "(0..*)", + "https:\/\/schema.org\/priceComponentType": "unknown", + "https:\/\/schema.org\/legislationDateVersion": "(0..1)", + "https:\/\/schema.org\/box": "unknown", + "https:\/\/schema.org\/postalCodePrefix": "unknown", + "https:\/\/schema.org\/customerRemorseReturnFees": "(0..1)", + "https:\/\/schema.org\/healthPlanCopay": "unknown", + "https:\/\/schema.org\/estimatedFlightDuration": "(0..1)", + "https:\/\/schema.org\/recipeCategory": "(0..1)", + "https:\/\/schema.org\/energyEfficiencyScaleMax": "unknown", + "https:\/\/schema.org\/processingTime": "unknown", + "https:\/\/schema.org\/masthead": "unknown", + "https:\/\/schema.org\/membershipPointsEarned": "(0..1)", + "https:\/\/schema.org\/alcoholWarning": "unknown", + "https:\/\/schema.org\/owns": "(0..*)", + "https:\/\/schema.org\/cholesterolContent": "(0..1)", + "https:\/\/schema.org\/defaultValue": "(0..1)", + "https:\/\/schema.org\/priceSpecification": "(0..*)", + "https:\/\/schema.org\/numberOfAccommodationUnits": "unknown", + "https:\/\/schema.org\/numberOfCredits": "(0..1)", + "https:\/\/schema.org\/foundingLocation": "(0..1)", + "https:\/\/schema.org\/calories": "(0..1)", + "https:\/\/schema.org\/discusses": "unknown", + "https:\/\/schema.org\/priceType": "(0..1)", + "https:\/\/schema.org\/coverageEndTime": "(0..1)", + "https:\/\/schema.org\/medicalSpecialty": "unknown", + "https:\/\/schema.org\/messageAttachment": "unknown", + "https:\/\/schema.org\/recordLabel": "(0..1)", + "https:\/\/schema.org\/claimInterpreter": "unknown", + "https:\/\/schema.org\/requiredMinAge": "unknown", + "https:\/\/schema.org\/cvdNumICUBeds": "unknown", + "https:\/\/schema.org\/contentSize": "unknown", + "https:\/\/schema.org\/associatedAnatomy": "(0..1)", + "https:\/\/schema.org\/isBasedOnUrl": "(0..1)", + "https:\/\/schema.org\/isBasedOn": "(0..1)", + "https:\/\/schema.org\/availableFrom": "unknown", + "https:\/\/schema.org\/deliveryTime": "(0..1)", + "https:\/\/schema.org\/reviewRating": "(0..1)", + "https:\/\/schema.org\/evidenceLevel": "unknown", + "https:\/\/schema.org\/sameAs": "unknown", + "https:\/\/schema.org\/hasCategoryCode": "unknown", + "https:\/\/schema.org\/hasDefinedTerm": "unknown", + "https:\/\/schema.org\/itemDefectReturnLabelSource": "(0..1)", + "https:\/\/schema.org\/normalRange": "unknown", + "https:\/\/schema.org\/cookTime": "(0..1)", + "https:\/\/schema.org\/performTime": "(0..1)", + "https:\/\/schema.org\/pickupTime": "unknown", + "https:\/\/schema.org\/antagonist": "(0..1)", + "https:\/\/schema.org\/mileageFromOdometer": "(0..*)", + "https:\/\/schema.org\/applicationSuite": "(0..1)", + "https:\/\/schema.org\/logo": "unknown", + "https:\/\/schema.org\/availableIn": "(0..1)", + "https:\/\/schema.org\/travelBans": "unknown", + "https:\/\/schema.org\/numberOfDoors": "(0..*)", + "https:\/\/schema.org\/status": "(0..1)", + "https:\/\/schema.org\/codeValue": "unknown", + "https:\/\/schema.org\/termCode": "unknown", + "https:\/\/schema.org\/deliveryAddress": "unknown", + "https:\/\/schema.org\/returnPolicyCategory": "unknown", + "https:\/\/schema.org\/episodes": "unknown", + "https:\/\/schema.org\/episode": "unknown", + "https:\/\/schema.org\/schemaVersion": "unknown", + "https:\/\/schema.org\/hasCourse": "unknown", + "https:\/\/schema.org\/byDay": "(0..*)", + "https:\/\/schema.org\/legislationDate": "(0..1)", + "https:\/\/schema.org\/dateCreated": "(0..1)", + "https:\/\/schema.org\/benefits": "unknown", + "https:\/\/schema.org\/jobBenefits": "unknown", + "https:\/\/schema.org\/howPerformed": "unknown", + "https:\/\/schema.org\/requiredCollateral": "unknown", + "https:\/\/schema.org\/rxcui": "(0..1)", + "https:\/\/schema.org\/abstract": "unknown", + "https:\/\/schema.org\/validFrom": "(0..1)", + "https:\/\/schema.org\/interpretedAsClaim": "unknown", + "https:\/\/schema.org\/medicineSystem": "(0..1)", + "https:\/\/schema.org\/applicationDeadline": "(0..1)", + "https:\/\/schema.org\/newsUpdatesAndGuidelines": "unknown", + "https:\/\/schema.org\/pageStart": "(0..1)", + "https:\/\/schema.org\/operatingSystem": "unknown", + "https:\/\/schema.org\/playersOnline": "unknown", + "https:\/\/schema.org\/healthPlanCoinsuranceOption": "unknown", + "https:\/\/schema.org\/tocContinuation": "unknown", + "https:\/\/schema.org\/chemicalRole": "unknown", + "https:\/\/schema.org\/endorsers": "unknown", + "https:\/\/schema.org\/funder": "unknown", + "https:\/\/schema.org\/sponsor": "unknown", + "https:\/\/schema.org\/earlyPrepaymentPenalty": "(0..1)", + "https:\/\/schema.org\/warning": "unknown", + "https:\/\/schema.org\/serviceType": "(0..1)", + "https:\/\/schema.org\/transFatContent": "(0..1)", + "https:\/\/schema.org\/faxNumber": "(0..1)", + "https:\/\/schema.org\/availableService": "unknown", + "https:\/\/schema.org\/publishedBy": "unknown", + "https:\/\/schema.org\/servicePhone": "(0..1)", + "https:\/\/schema.org\/subStructure": "(0..*)", + "https:\/\/schema.org\/priceComponent": "unknown", + "https:\/\/schema.org\/programType": "(0..1)", + "https:\/\/schema.org\/legislationChanges": "unknown", + "https:\/\/schema.org\/positiveNotes": "unknown", + "https:\/\/schema.org\/email": "unknown", + "https:\/\/schema.org\/termsPerYear": "(0..1)", + "https:\/\/schema.org\/nerveMotor": "(0..1)", + "https:\/\/schema.org\/drainsTo": "(0..1)", + "https:\/\/schema.org\/checkoutTime": "(0..1)", + "https:\/\/schema.org\/carrierRequirements": "(0..*)", + "https:\/\/schema.org\/accelerationTime": "(0..*)", + "https:\/\/schema.org\/totalJobOpenings": "(0..1)", + "https:\/\/schema.org\/workHours": "(0..1)", + "https:\/\/schema.org\/publishedOn": "unknown", + "https:\/\/schema.org\/domainIncludes": "(0..*)", + "https:\/\/schema.org\/hasMenuSection": "unknown", + "https:\/\/schema.org\/cvdNumC19OFMechVentPats": "unknown", + "https:\/\/schema.org\/bodyType": "unknown", + "https:\/\/schema.org\/cvdNumBedsOcc": "unknown", + "https:\/\/schema.org\/sensoryUnit": "(0..1)", + "https:\/\/schema.org\/utterances": "unknown", + "https:\/\/schema.org\/departureStation": "(0..1)", + "https:\/\/schema.org\/measuredValue": "(0..1)", + "https:\/\/schema.org\/programmingLanguage": "(0..1)", + "https:\/\/schema.org\/vehicleSeatingCapacity": "(0..*)", + "https:\/\/schema.org\/collectionSize": "(0..1)", + "https:\/\/schema.org\/netWorth": "(0..1)", + "https:\/\/schema.org\/leaseLength": "unknown", + "https:\/\/schema.org\/vehicleConfiguration": "unknown", + "https:\/\/schema.org\/eventSchedule": "unknown", + "https:\/\/schema.org\/expectedArrivalFrom": "(0..1)", + "https:\/\/schema.org\/conditionsOfAccess": "(0..*)", + "https:\/\/schema.org\/variableMeasured": "(0..1)", + "https:\/\/schema.org\/amenityFeature": "unknown", + "https:\/\/schema.org\/valueMinLength": "unknown", + "https:\/\/schema.org\/legalName": "(0..1)", + "https:\/\/schema.org\/branchCode": "unknown", + "https:\/\/schema.org\/isPlanForApartment": "(0..1)", + "https:\/\/schema.org\/spokenByCharacter": "(0..1)", + "https:\/\/schema.org\/strengthUnit": "(0..1)", + "https:\/\/schema.org\/billingPeriod": "(0..1)", + "https:\/\/schema.org\/publisherImprint": "(0..1)", + "https:\/\/schema.org\/afterMedia": "unknown", + "https:\/\/schema.org\/inAlbum": "(0..1)", + "https:\/\/schema.org\/replacee": "unknown", + "https:\/\/schema.org\/contributor": "unknown", + "https:\/\/schema.org\/customerRemorseReturnShippingFeesAmount": "(0..1)", + "https:\/\/schema.org\/taxonRank": "(0..1)", + "https:\/\/schema.org\/boardingGroup": "(0..1)", + "https:\/\/schema.org\/priceRange": "(0..1)", + "https:\/\/schema.org\/inker": "(0..1)", + "https:\/\/schema.org\/legislationPassedBy": "(0..1)", + "https:\/\/schema.org\/creator": "(0..1)", + "https:\/\/schema.org\/longitude": "(0..1)", + "https:\/\/schema.org\/elevation": "(0..1)", + "https:\/\/schema.org\/medicalAudience": "unknown", + "https:\/\/schema.org\/study": "unknown", + "https:\/\/schema.org\/ethicsPolicy": "unknown", + "https:\/\/schema.org\/printSection": "unknown", + "https:\/\/schema.org\/trailerWeight": "(0..*)", + "https:\/\/schema.org\/documentation": "unknown", + "https:\/\/schema.org\/ccRecipient": "unknown", + "https:\/\/schema.org\/purchaseDate": "(0..1)", + "https:\/\/schema.org\/guidelineSubject": "(0..1)", + "https:\/\/schema.org\/nextItem": "unknown", + "https:\/\/schema.org\/industry": "(0..1)", + "https:\/\/schema.org\/recognizedBy": "unknown", + "https:\/\/schema.org\/publisher": "(0..1)", + "https:\/\/schema.org\/associatedDisease": "unknown", + "https:\/\/schema.org\/bitrate": "(0..1)", + "https:\/\/schema.org\/doseSchedule": "unknown", + "https:\/\/schema.org\/vehicleInteriorColor": "(0..1)", + "https:\/\/schema.org\/diagram": "unknown", + "https:\/\/schema.org\/datePosted": "unknown", + "https:\/\/schema.org\/repeatCount": "unknown", + "https:\/\/schema.org\/interactionService": "(0..1)", + "https:\/\/schema.org\/domiciledMortgage": "unknown", + "https:\/\/schema.org\/typicalTest": "unknown", + "https:\/\/schema.org\/includedDataCatalog": "unknown", + "https:\/\/schema.org\/issuedBy": "(0..1)", + "https:\/\/schema.org\/familyName": "unknown", + "https:\/\/schema.org\/activityDuration": "unknown", + "https:\/\/schema.org\/videoFormat": "(0..1)", + "https:\/\/schema.org\/shippingSettingsLink": "unknown", + "https:\/\/schema.org\/educationalRole": "unknown", + "https:\/\/schema.org\/steeringPosition": "(0..1)", + "https:\/\/schema.org\/infectiousAgent": "(0..1)", + "https:\/\/schema.org\/lender": "unknown", + "https:\/\/schema.org\/shippingDetails": "unknown", + "https:\/\/schema.org\/reservationFor": "(0..1)", + "https:\/\/schema.org\/lowPrice": "(0..1)", + "https:\/\/schema.org\/supportingData": "unknown", + "https:\/\/schema.org\/refundType": "unknown", + "https:\/\/schema.org\/aircraft": "(0..1)", + "https:\/\/schema.org\/causeOf": "(0..1)", + "https:\/\/schema.org\/linkRelationship": "unknown", + "https:\/\/schema.org\/replacer": "unknown", + "https:\/\/schema.org\/answerExplanation": "unknown", + "https:\/\/schema.org\/providerMobility": "unknown", + "https:\/\/schema.org\/itemReviewed": "(0..1)", + "https:\/\/schema.org\/educationalAlignment": "unknown", + "https:\/\/schema.org\/associatedMediaReview": "unknown", + "https:\/\/schema.org\/associatedReview": "unknown", + "https:\/\/schema.org\/gameItem": "unknown", + "https:\/\/schema.org\/activeIngredient": "unknown", + "https:\/\/schema.org\/duringMedia": "unknown", + "https:\/\/schema.org\/valueAddedTaxIncluded": "(0..1)", + "https:\/\/schema.org\/free": "unknown", + "https:\/\/schema.org\/isAccessibleForFree": "(0..1)", + "https:\/\/schema.org\/amountOfThisGood": "(1..1)", + "https:\/\/schema.org\/musicCompositionForm": "(0..1)", + "https:\/\/schema.org\/numberOfEpisodes": "(0..1)", + "https:\/\/schema.org\/orderNumber": "(0..1)", + "https:\/\/schema.org\/greaterOrEqual": "(0..*)", + "https:\/\/schema.org\/streetAddress": "(0..1)", + "https:\/\/schema.org\/inChI": "unknown", + "https:\/\/schema.org\/propertyID": "unknown", + "https:\/\/schema.org\/recourseLoan": "(0..1)", + "https:\/\/schema.org\/isrcCode": "(0..1)", + "https:\/\/schema.org\/occupationalCategory": "unknown", + "https:\/\/schema.org\/estimatedCost": "(0..1)", + "https:\/\/schema.org\/differentialDiagnosis": "unknown", + "https:\/\/schema.org\/associatedArticle": "unknown", + "https:\/\/schema.org\/associatedClaimReview": "unknown", + "https:\/\/schema.org\/legislationTransposes": "unknown", + "https:\/\/schema.org\/legislationApplies": "unknown", + "https:\/\/schema.org\/preparation": "unknown", + "https:\/\/schema.org\/item": "unknown", + "https:\/\/schema.org\/significantLinks": "(0..1)", + "https:\/\/schema.org\/significantLink": "unknown", + "https:\/\/schema.org\/ticketToken": "unknown", + "https:\/\/schema.org\/comprisedOf": "unknown", + "https:\/\/schema.org\/honorificPrefix": "unknown", + "https:\/\/schema.org\/seasonNumber": "unknown", + "https:\/\/schema.org\/ownedFrom": "(0..1)", + "https:\/\/schema.org\/successorOf": "(0..*)", + "https:\/\/schema.org\/cvdCollectionDate": "unknown", + "https:\/\/schema.org\/broadcastSubChannel": "(0..1)", + "https:\/\/schema.org\/paymentAccepted": "unknown", + "https:\/\/schema.org\/typeOfBed": "(0..1)", + "https:\/\/schema.org\/includesObject": "(0..*)", + "https:\/\/schema.org\/wheelbase": "(0..*)", + "https:\/\/schema.org\/issn": "(0..1)", + "https:\/\/schema.org\/awayTeam": "(0..1)", + "https:\/\/schema.org\/endOffset": "(0..1)", + "https:\/\/schema.org\/cvdNumICUBedsOcc": "unknown", + "https:\/\/schema.org\/geoCoveredBy": "unknown", + "https:\/\/schema.org\/percentile75": "(0..1)", + "https:\/\/schema.org\/transcript": "unknown", + "https:\/\/schema.org\/verificationFactCheckingPolicy": "unknown", + "https:\/\/schema.org\/countryOfAssembly": "(0..1)", + "https:\/\/schema.org\/maximumIntake": "unknown", + "https:\/\/schema.org\/relatedStructure": "(0..*)", + "https:\/\/schema.org\/eligibleQuantity": "(0..1)", + "https:\/\/schema.org\/starRating": "unknown", + "https:\/\/schema.org\/produces": "(0..1)", + "https:\/\/schema.org\/serviceOutput": "(0..1)", + "https:\/\/schema.org\/fuelType": "(0..1)", + "https:\/\/schema.org\/employmentUnit": "unknown", + "https:\/\/schema.org\/timeOfDay": "(0..1)", + "https:\/\/schema.org\/broadcastServiceTier": "(0..1)", + "https:\/\/schema.org\/menu": "unknown", + "https:\/\/schema.org\/hasMenu": "unknown", + "https:\/\/schema.org\/vendor": "unknown", + "https:\/\/schema.org\/geoDisjoint": "unknown", + "https:\/\/schema.org\/coursePrerequisites": "unknown", + "https:\/\/schema.org\/cvdNumVent": "unknown", + "https:\/\/schema.org\/diversityPolicy": "unknown", + "https:\/\/schema.org\/additionalName": "unknown", + "https:\/\/schema.org\/commentTime": "(0..1)", + "https:\/\/schema.org\/validIn": "(0..1)", + "https:\/\/schema.org\/phoneticText": "unknown", + "https:\/\/schema.org\/tongueWeight": "(0..*)", + "https:\/\/schema.org\/maximumPhysicalAttendeeCapacity": "(0..1)", + "https:\/\/schema.org\/interactivityType": "(0..1)", + "https:\/\/schema.org\/worstRating": "(0..1)", + "https:\/\/schema.org\/toLocation": "unknown", + "https:\/\/schema.org\/artform": "unknown", + "https:\/\/schema.org\/inventoryLevel": "(0..1)", + "https:\/\/schema.org\/gender": "unknown", + "https:\/\/schema.org\/credentialCategory": "(0..1)", + "https:\/\/schema.org\/breastfeedingWarning": "unknown", + "https:\/\/schema.org\/availability": "(0..1)", + "https:\/\/schema.org\/events": "unknown", + "https:\/\/schema.org\/event": "unknown", + "https:\/\/schema.org\/targetDescription": "(0..1)", + "https:\/\/schema.org\/fuelEfficiency": "(0..1)", + "https:\/\/schema.org\/orderedItem": "(0..1)", + "https:\/\/schema.org\/marginOfError": "unknown", + "https:\/\/schema.org\/awards": "unknown", + "https:\/\/schema.org\/award": "unknown", + "https:\/\/schema.org\/baseSalary": "(0..1)", + "https:\/\/schema.org\/signOrSymptom": "unknown", + "https:\/\/schema.org\/seasons": "unknown", + "https:\/\/schema.org\/season": "unknown", + "https:\/\/schema.org\/expressedIn": "unknown", + "https:\/\/schema.org\/departureAirport": "(0..1)", + "https:\/\/schema.org\/userInteractionCount": "(0..1)", + "https:\/\/schema.org\/doesNotShip": "unknown", + "https:\/\/schema.org\/relatedAnatomy": "unknown", + "https:\/\/schema.org\/prescriptionStatus": "unknown", + "https:\/\/schema.org\/availableStrength": "unknown", + "https:\/\/schema.org\/isbn": "(0..1)", + "https:\/\/schema.org\/webCheckinTime": "(0..1)", + "https:\/\/schema.org\/acrissCode": "(0..1)", + "https:\/\/schema.org\/availableThrough": "unknown", + "https:\/\/schema.org\/includedComposition": "unknown", + "https:\/\/schema.org\/healthPlanCoinsuranceRate": "unknown", + "https:\/\/schema.org\/artMedium": "(0..1)", + "https:\/\/schema.org\/material": "unknown", + "https:\/\/schema.org\/healthPlanDrugTier": "(0..*)", + "https:\/\/schema.org\/itemListOrder": "unknown", + "https:\/\/schema.org\/ownershipFundingInfo": "unknown", + "https:\/\/schema.org\/accessibilityAPI": "unknown", + "https:\/\/schema.org\/returnMethod": "(0..1)", + "https:\/\/schema.org\/permissionType": "(0..1)", + "https:\/\/schema.org\/costCurrency": "(0..1)", + "https:\/\/schema.org\/maximumVirtualAttendeeCapacity": "(0..1)", + "https:\/\/schema.org\/governmentBenefitsInfo": "unknown", + "https:\/\/schema.org\/pattern": "unknown", + "https:\/\/schema.org\/inBroadcastLineup": "(0..1)", + "https:\/\/schema.org\/legislationJurisdiction": "(0..1)", + "https:\/\/schema.org\/jurisdiction": "unknown", + "https:\/\/schema.org\/deliveryMethod": "unknown", + "https:\/\/schema.org\/comment": "unknown", + "https:\/\/schema.org\/servingSize": "(0..1)", + "https:\/\/schema.org\/exchangeRateSpread": "(0..1)", + "https:\/\/schema.org\/articleSection": "(0..*)", + "https:\/\/schema.org\/associatedPathophysiology": "unknown", + "https:\/\/schema.org\/cvdNumC19HOPats": "unknown", + "https:\/\/schema.org\/checkinTime": "(0..1)", + "https:\/\/schema.org\/potentialAction": "unknown", + "https:\/\/schema.org\/athlete": "unknown", + "https:\/\/schema.org\/cssSelector": "unknown", + "https:\/\/schema.org\/beforeMedia": "unknown", + "https:\/\/schema.org\/nutrition": "unknown", + "https:\/\/schema.org\/experienceInPlaceOfEducation": "unknown", + "https:\/\/schema.org\/dropoffLocation": "unknown", + "https:\/\/schema.org\/isAvailableGenerically": "(0..1)", + "https:\/\/schema.org\/billingAddress": "(0..1)", + "https:\/\/schema.org\/tickerSymbol": "(0..1)", + "https:\/\/schema.org\/children": "unknown", + "https:\/\/schema.org\/tracks": "unknown", + "https:\/\/schema.org\/track": "unknown", + "https:\/\/schema.org\/nonProprietaryName": "(0..1)", + "https:\/\/schema.org\/model": "(0..1)", + "https:\/\/schema.org\/keywords": "unknown", + "https:\/\/schema.org\/departureBoatTerminal": "(0..1)", + "https:\/\/schema.org\/geoTouches": "unknown", + "https:\/\/schema.org\/educationalLevel": "(0..1)", + "https:\/\/schema.org\/closes": "(1..1)", + "https:\/\/schema.org\/broadcastChannelId": "(0..1)", + "https:\/\/schema.org\/guideline": "unknown", + "https:\/\/schema.org\/availableTest": "unknown", + "https:\/\/schema.org\/mapType": "unknown", + "https:\/\/schema.org\/geoIntersects": "unknown", + "https:\/\/schema.org\/previousItem": "unknown", + "https:\/\/schema.org\/numberOfForwardGears": "(0..*)", + "https:\/\/schema.org\/durationOfWarranty": "(0..1)", + "https:\/\/schema.org\/availableChannel": "unknown", + "https:\/\/schema.org\/infectiousAgentClass": "(0..1)", + "https:\/\/schema.org\/spatial": "(0..1)", + "https:\/\/schema.org\/validThrough": "(0..1)", + "https:\/\/schema.org\/byArtist": "(0..1)", + "https:\/\/schema.org\/competencyRequired": "unknown", + "https:\/\/schema.org\/healthPlanPharmacyCategory": "(0..1)", + "https:\/\/schema.org\/softwareVersion": "unknown", + "https:\/\/schema.org\/monthsOfExperience": "unknown", + "https:\/\/schema.org\/permittedUsage": "unknown", + "https:\/\/schema.org\/significance": "(0..1)", + "https:\/\/schema.org\/acquireLicensePage": "unknown", + "https:\/\/schema.org\/usageInfo": "(0..*)", + "https:\/\/schema.org\/arrivalTime": "(0..1)", + "https:\/\/schema.org\/broadcastOfEvent": "(0..1)", + "https:\/\/schema.org\/increasesRiskOf": "(0..1)", + "https:\/\/schema.org\/issuedThrough": "(0..1)", + "https:\/\/schema.org\/cvdNumBeds": "unknown", + "https:\/\/schema.org\/trialDesign": "unknown", + "https:\/\/schema.org\/busName": "(0..1)", + "https:\/\/schema.org\/carrier": "unknown", + "https:\/\/schema.org\/provider": "(0..1)", + "https:\/\/schema.org\/installUrl": "unknown", + "https:\/\/schema.org\/performers": "(0..1)", + "https:\/\/schema.org\/performer": "unknown", + "https:\/\/schema.org\/members": "unknown", + "https:\/\/schema.org\/member": "unknown", + "https:\/\/schema.org\/fiberContent": "(0..1)", + "https:\/\/schema.org\/programName": "(0..1)", + "https:\/\/schema.org\/serviceLocation": "(0..1)", + "https:\/\/schema.org\/foundingDate": "(0..1)", + "https:\/\/schema.org\/servesCuisine": "(0..1)", + "https:\/\/schema.org\/appearance": "unknown", + "https:\/\/schema.org\/workExample": "unknown", + "https:\/\/schema.org\/flightDistance": "(0..1)", + "https:\/\/schema.org\/customerRemorseReturnLabelSource": "(0..1)", + "https:\/\/schema.org\/byMonthDay": "(0..*)", + "https:\/\/schema.org\/code": "unknown", + "https:\/\/schema.org\/copyrightHolder": "(0..1)", + "https:\/\/schema.org\/sizeSystem": "(0..1)", + "https:\/\/schema.org\/loser": "unknown", + "https:\/\/schema.org\/agent": "(0..1)", + "https:\/\/schema.org\/alternativeOf": "unknown", + "https:\/\/schema.org\/aggregateRating": "(0..1)", + "https:\/\/schema.org\/contactType": "unknown", + "https:\/\/schema.org\/fuelConsumption": "(0..1)", + "https:\/\/schema.org\/commentCount": "(0..1)", + "https:\/\/schema.org\/targetPopulation": "unknown", + "https:\/\/schema.org\/contentRating": "unknown", + "https:\/\/schema.org\/payload": "(0..*)", + "https:\/\/schema.org\/releasedEvent": "(0..1)", + "https:\/\/schema.org\/icaoCode": "unknown", + "https:\/\/schema.org\/accessibilitySummary": "unknown", + "https:\/\/schema.org\/accessMode": "(0..1)", + "https:\/\/schema.org\/postOfficeBoxNumber": "(0..1)", + "https:\/\/schema.org\/knows": "(0..1)", + "https:\/\/schema.org\/musicBy": "(0..1)", + "https:\/\/schema.org\/jobLocationType": "unknown", + "https:\/\/schema.org\/missionCoveragePrioritiesPolicy": "unknown", + "https:\/\/schema.org\/pregnancyCategory": "unknown", + "https:\/\/schema.org\/typeOfGood": "(1..1)", + "https:\/\/schema.org\/colleagues": "unknown", + "https:\/\/schema.org\/colleague": "unknown", + "https:\/\/schema.org\/applicationCategory": "unknown", + "https:\/\/schema.org\/applicationSubCategory": "unknown", + "https:\/\/schema.org\/isGift": "(0..1)", + "https:\/\/schema.org\/hostingOrganization": "(0..1)", + "https:\/\/schema.org\/relatedTherapy": "unknown", + "https:\/\/schema.org\/proteinContent": "(0..1)", + "https:\/\/schema.org\/legislationLegalForce": "unknown", + "https:\/\/schema.org\/workPerformed": "unknown", + "https:\/\/schema.org\/workFeatured": "unknown", + "https:\/\/schema.org\/sodiumContent": "(0..1)", + "https:\/\/schema.org\/isicV4": "(0..*)", + "https:\/\/schema.org\/playerType": "unknown", + "https:\/\/schema.org\/acceptedOffer": "(0..*)", + "https:\/\/schema.org\/trackingNumber": "unknown", + "https:\/\/schema.org\/dateRead": "(0..1)", + "https:\/\/schema.org\/shippingDestination": "unknown", + "https:\/\/schema.org\/recipeInstructions": "unknown", + "https:\/\/schema.org\/step": "unknown", + "https:\/\/schema.org\/vehicleInteriorType": "(0..1)", + "https:\/\/schema.org\/accommodationCategory": "unknown", + "https:\/\/schema.org\/category": "(0..*)", + "https:\/\/schema.org\/addressRegion": "(0..1)", + "https:\/\/schema.org\/originatesFrom": "(0..1)", + "https:\/\/schema.org\/relatedDrug": "unknown", + "https:\/\/schema.org\/reservationStatus": "(0..1)", + "https:\/\/schema.org\/subStageSuffix": "(0..1)", + "https:\/\/schema.org\/albumProductionType": "unknown", + "https:\/\/schema.org\/commentText": "(0..1)", + "https:\/\/schema.org\/dateDeleted": "(0..1)", + "https:\/\/schema.org\/serviceAudience": "(0..1)", + "https:\/\/schema.org\/audience": "unknown", + "https:\/\/schema.org\/deathPlace": "(0..1)", + "https:\/\/schema.org\/cheatCode": "unknown", + "https:\/\/schema.org\/proficiencyLevel": "unknown", + "https:\/\/schema.org\/maxPrice": "(1..1)", + "https:\/\/schema.org\/surface": "unknown", + "https:\/\/schema.org\/artworkSurface": "(0..1)", + "https:\/\/schema.org\/itinerary": "(0..*)", + "https:\/\/schema.org\/valueName": "unknown", + "https:\/\/schema.org\/memoryRequirements": "unknown", + "https:\/\/schema.org\/gamePlatform": "(0..1)", + "https:\/\/schema.org\/risks": "unknown", + "https:\/\/schema.org\/prescribingInfo": "unknown", + "https:\/\/schema.org\/specialty": "unknown", + "https:\/\/schema.org\/salaryUponCompletion": "(0..1)", + "https:\/\/schema.org\/latitude": "(0..1)", + "https:\/\/schema.org\/prepTime": "(0..1)", + "https:\/\/schema.org\/eligibilityToWorkRequirement": "(0..1)", + "https:\/\/schema.org\/signDetected": "unknown", + "https:\/\/schema.org\/arrivalGate": "unknown", + "https:\/\/schema.org\/meetsEmissionStandard": "unknown", + "https:\/\/schema.org\/targetUrl": "(0..1)", + "https:\/\/schema.org\/characterName": "(0..1)", + "https:\/\/schema.org\/question": "unknown", + "https:\/\/schema.org\/geoCrosses": "unknown", + "https:\/\/schema.org\/inCodeSet": "unknown", + "https:\/\/schema.org\/inDefinedTermSet": "unknown", + "https:\/\/schema.org\/arrivalBoatTerminal": "(0..1)", + "https:\/\/schema.org\/video": "unknown", + "https:\/\/schema.org\/inChIKey": "unknown", + "https:\/\/schema.org\/printPage": "unknown", + "https:\/\/schema.org\/functionalClass": "(0..1)", + "https:\/\/schema.org\/transitTimeLabel": "unknown", + "https:\/\/schema.org\/isAccessoryOrSparePartFor": "(0..*)", + "https:\/\/schema.org\/relatedLink": "unknown", + "https:\/\/schema.org\/dayOfWeek": "(1..*)", + "https:\/\/schema.org\/equal": "(0..*)", + "https:\/\/schema.org\/version": "(0..1)", + "https:\/\/schema.org\/maps": "unknown", + "https:\/\/schema.org\/serviceUrl": "(0..1)", + "https:\/\/schema.org\/currency": "(0..1)", + "https:\/\/schema.org\/vehicleModelDate": "(0..1)", + "https:\/\/schema.org\/sugarContent": "(0..1)", + "https:\/\/schema.org\/uploadDate": "unknown", + "https:\/\/schema.org\/numChildren": "(0..1)", + "https:\/\/schema.org\/birthPlace": "(0..1)", + "https:\/\/schema.org\/isUnlabelledFallback": "(0..1)", + "https:\/\/schema.org\/yearBuilt": "(0..1)", + "https:\/\/schema.org\/endorsee": "unknown", + "https:\/\/schema.org\/language": "unknown", + "https:\/\/schema.org\/inLanguage": "(0..1)", + "https:\/\/schema.org\/speechToTextMarkup": "unknown", + "https:\/\/schema.org\/maxValue": "(0..1)", + "https:\/\/schema.org\/arrivalPlatform": "(0..1)", + "https:\/\/schema.org\/experienceRequirements": "unknown", + "https:\/\/schema.org\/valueRequired": "unknown", + "https:\/\/schema.org\/workPresented": "(0..1)", + "https:\/\/schema.org\/bookingTime": "(0..1)", + "https:\/\/schema.org\/textValue": "unknown", + "https:\/\/schema.org\/upvoteCount": "(0..1)", + "https:\/\/schema.org\/includedRiskFactor": "unknown", + "https:\/\/schema.org\/accessibilityControl": "unknown", + "https:\/\/schema.org\/variesBy": "unknown", + "https:\/\/schema.org\/physicalRequirement": "unknown", + "https:\/\/schema.org\/itemDefectReturnFees": "(0..1)", + "https:\/\/schema.org\/permissions": "(0..*)", + "https:\/\/schema.org\/parentItem": "(0..1)", + "https:\/\/schema.org\/algorithm": "(0..1)", + "https:\/\/schema.org\/stepValue": "(0..1)", + "https:\/\/schema.org\/dropoffTime": "unknown", + "https:\/\/schema.org\/procedure": "unknown", + "https:\/\/schema.org\/gtin13": "(0..*)", + "https:\/\/schema.org\/mealService": "unknown", + "https:\/\/schema.org\/hasDeliveryMethod": "unknown", + "https:\/\/schema.org\/departureBusStop": "(0..1)", + "https:\/\/schema.org\/iswcCode": "(0..1)", + "https:\/\/schema.org\/sizeGroup": "(0..1)", + "https:\/\/schema.org\/inverseOf": "unknown", + "https:\/\/schema.org\/orderQuantity": "(0..1)", + "https:\/\/schema.org\/mechanismOfAction": "(0..1)", + "https:\/\/schema.org\/doorTime": "(0..1)", + "https:\/\/schema.org\/floorSize": "(0..*)", + "https:\/\/schema.org\/programmingModel": "unknown", + "https:\/\/schema.org\/countryOfLastProcessing": "(0..1)", + "https:\/\/schema.org\/recommendationStrength": "unknown", + "https:\/\/schema.org\/usesDevice": "unknown", + "https:\/\/schema.org\/numberOfBeds": "(0..1)", + "https:\/\/schema.org\/securityClearanceRequirement": "unknown", + "https:\/\/schema.org\/requiresSubscription": "unknown", + "https:\/\/schema.org\/winner": "unknown", + "https:\/\/schema.org\/size": "unknown", + "https:\/\/schema.org\/translator": "unknown", + "https:\/\/schema.org\/firstAppearance": "unknown", + "https:\/\/schema.org\/artist": "(0..1)", + "https:\/\/schema.org\/sampleType": "unknown", + "https:\/\/schema.org\/codeSampleType": "unknown", + "https:\/\/schema.org\/healthPlanId": "(0..1)", + "https:\/\/schema.org\/application": "unknown", + "https:\/\/schema.org\/actionApplication": "unknown", + "https:\/\/schema.org\/partOfInvoice": "(0..1)", + "https:\/\/schema.org\/illustrator": "(0..1)", + "https:\/\/schema.org\/affiliation": "unknown", + "https:\/\/schema.org\/memberOf": "unknown", + "https:\/\/schema.org\/depth": "(0..1)", + "https:\/\/schema.org\/mentions": "unknown", + "https:\/\/schema.org\/trainingSalary": "(0..1)", + "https:\/\/schema.org\/sharedContent": "unknown", + "https:\/\/schema.org\/pagination": "unknown", + "https:\/\/schema.org\/predecessorOf": "(0..*)", + "https:\/\/schema.org\/numberOfFullBathrooms": "unknown", + "https:\/\/schema.org\/bookEdition": "(0..1)", + "https:\/\/schema.org\/exifData": "unknown", + "https:\/\/schema.org\/ticketNumber": "(0..1)", + "https:\/\/schema.org\/spouse": "(0..1)", + "https:\/\/schema.org\/identifyingExam": "unknown", + "https:\/\/schema.org\/numConstraints": "unknown", + "https:\/\/schema.org\/locationCreated": "(0..1)", + "https:\/\/schema.org\/sportsActivityLocation": "unknown", + "https:\/\/schema.org\/additionalProperty": "unknown", + "https:\/\/schema.org\/programMembershipUsed": "unknown", + "https:\/\/schema.org\/departurePlatform": "(0..1)", + "https:\/\/schema.org\/gameLocation": "unknown", + "https:\/\/schema.org\/screenCount": "(0..1)", + "https:\/\/schema.org\/arrivalStation": "(0..1)", + "https:\/\/schema.org\/scheduleTimezone": "(0..*)", + "https:\/\/schema.org\/billingDuration": "unknown", + "https:\/\/schema.org\/epidemiology": "(0..1)", + "https:\/\/schema.org\/seatingType": "(0..1)", + "https:\/\/schema.org\/recommendedIntake": "unknown", + "https:\/\/schema.org\/costCategory": "(0..1)", + "https:\/\/schema.org\/siblings": "unknown", + "https:\/\/schema.org\/sibling": "unknown", + "https:\/\/schema.org\/targetName": "(0..1)", + "https:\/\/schema.org\/thumbnailUrl": "unknown", + "https:\/\/schema.org\/deliveryStatus": "unknown", + "https:\/\/schema.org\/employmentType": "unknown", + "https:\/\/schema.org\/observationDate": "(0..1)", + "https:\/\/schema.org\/educationalUse": "(0..1)", + "https:\/\/schema.org\/benefitsSummaryUrl": "(0..1)", + "https:\/\/schema.org\/itemDefectReturnShippingFeesAmount": "unknown", + "https:\/\/schema.org\/courseWorkload": "(0..1)", + "https:\/\/schema.org\/mathExpression": "unknown", + "https:\/\/schema.org\/multipleValues": "unknown", + "https:\/\/schema.org\/geoOverlaps": "unknown", + "https:\/\/schema.org\/partOfTVSeries": "(0..1)", + "https:\/\/schema.org\/partOfSeries": "(0..1)", + "https:\/\/schema.org\/hasEnergyEfficiencyCategory": "unknown", + "https:\/\/schema.org\/inSupportOf": "unknown", + "https:\/\/schema.org\/strengthValue": "(0..1)", + "https:\/\/schema.org\/ownedThrough": "(0..1)", + "https:\/\/schema.org\/isFamilyFriendly": "(0..1)", + "https:\/\/schema.org\/polygon": "unknown", + "https:\/\/schema.org\/geoWithin": "unknown", + "https:\/\/schema.org\/founders": "unknown", + "https:\/\/schema.org\/founder": "unknown", + "https:\/\/schema.org\/roofLoad": "(0..*)", + "https:\/\/schema.org\/license": "unknown", + "https:\/\/schema.org\/renegotiableLoan": "unknown", + "https:\/\/schema.org\/readonlyValue": "unknown", + "https:\/\/schema.org\/educationRequirements": "unknown", + "https:\/\/schema.org\/replyToUrl": "(0..1)", + "https:\/\/schema.org\/hasCredential": "unknown", + "https:\/\/schema.org\/educationalProgramMode": "unknown", + "https:\/\/schema.org\/suggestedMaxAge": "unknown", + "https:\/\/schema.org\/iataCode": "unknown", + "https:\/\/schema.org\/recipe": "unknown", + "https:\/\/schema.org\/primaryImageOfPage": "unknown", + "https:\/\/schema.org\/downPayment": "unknown", + "https:\/\/schema.org\/returnLabelSource": "(0..1)", + "https:\/\/schema.org\/isConsumableFor": "(0..*)", + "https:\/\/schema.org\/legislationConsolidates": "unknown", + "https:\/\/schema.org\/validFor": "(0..1)", + "https:\/\/schema.org\/timeToComplete": "(0..1)", + "https:\/\/schema.org\/distance": "(0..1)", + "https:\/\/schema.org\/usesHealthPlanIdStandard": "(0..1)", + "https:\/\/schema.org\/videoQuality": "(0..1)", + "https:\/\/schema.org\/jobImmediateStart": "unknown", + "https:\/\/schema.org\/followup": "unknown", + "https:\/\/schema.org\/nonEqual": "(0..*)", + "https:\/\/schema.org\/editor": "unknown", + "https:\/\/schema.org\/scheduledTime": "(0..1)", + "https:\/\/schema.org\/exercisePlan": "unknown", + "https:\/\/schema.org\/byMonthWeek": "(0..*)", + "https:\/\/schema.org\/drugClass": "(0..1)", + "https:\/\/schema.org\/typicalAgeRange": "(0..1)", + "https:\/\/schema.org\/rangeIncludes": "(0..*)", + "https:\/\/schema.org\/grantee": "(0..1)", + "https:\/\/schema.org\/reservedTicket": "unknown", + "https:\/\/schema.org\/distinguishingSign": "unknown", + "https:\/\/schema.org\/acceptedPaymentMethod": "(0..*)", + "https:\/\/schema.org\/parentService": "unknown", + "https:\/\/schema.org\/healthPlanMarketingUrl": "(0..1)", + "https:\/\/schema.org\/byMonth": "(0..*)", + "https:\/\/schema.org\/naturalProgression": "(0..1)", + "https:\/\/schema.org\/reviewCount": "(0..1)", + "https:\/\/schema.org\/episodeNumber": "unknown", + "https:\/\/schema.org\/cookingMethod": "(0..1)", + "https:\/\/schema.org\/dataFeedElement": "unknown", + "https:\/\/schema.org\/valueMaxLength": "unknown", + "https:\/\/schema.org\/publication": "unknown", + "https:\/\/schema.org\/percentile90": "(0..1)", + "https:\/\/schema.org\/cvdNumC19Died": "unknown", + "https:\/\/schema.org\/potentialUse": "unknown", + "https:\/\/schema.org\/gettingTestedInfo": "unknown", + "https:\/\/schema.org\/httpMethod": "unknown", + "https:\/\/schema.org\/additionalNumberOfGuests": "unknown", + "https:\/\/schema.org\/foodEstablishment": "unknown", + "https:\/\/schema.org\/deathDate": "unknown", + "https:\/\/schema.org\/pageEnd": "(0..1)", + "https:\/\/schema.org\/bestRating": "(0..1)", + "https:\/\/schema.org\/acceptedAnswer": "(0..*)", + "https:\/\/schema.org\/suggestedAnswer": "unknown", + "https:\/\/schema.org\/productID": "(0..1)", + "https:\/\/schema.org\/opens": "(1..1)", + "https:\/\/schema.org\/geographicArea": "(0..1)", + "https:\/\/schema.org\/referencesOrder": "(0..*)", + "https:\/\/schema.org\/circle": "unknown", + "https:\/\/schema.org\/legislationIdentifier": "unknown", + "https:\/\/schema.org\/paymentUrl": "(0..1)", + "https:\/\/schema.org\/yearsInOperation": "(0..1)", + "https:\/\/schema.org\/serviceOperator": "(0..1)", + "https:\/\/schema.org\/price": "(0..1)", + "https:\/\/schema.org\/ticketedSeat": "(0..1)", + "https:\/\/schema.org\/acquiredFrom": "(0..1)", + "https:\/\/schema.org\/shippingLabel": "unknown", + "https:\/\/schema.org\/abridged": "unknown", + "https:\/\/schema.org\/membershipNumber": "unknown", + "https:\/\/schema.org\/specialOpeningHoursSpecification": "(0..1)", + "https:\/\/schema.org\/reportNumber": "(0..1)", + "https:\/\/schema.org\/paymentMethodId": "unknown", + "https:\/\/schema.org\/evidenceOrigin": "unknown", + "https:\/\/schema.org\/supplyTo": "(0..1)", + "https:\/\/schema.org\/name": "(0..1)", + "https:\/\/schema.org\/studySubject": "unknown", + "https:\/\/schema.org\/hospitalAffiliation": "unknown", + "https:\/\/schema.org\/serviceSmsNumber": "(0..1)", + "https:\/\/schema.org\/dependencies": "unknown", + "https:\/\/schema.org\/interactionCount": "unknown", + "https:\/\/schema.org\/interactionStatistic": "(0..1)", + "https:\/\/schema.org\/knowsAbout": "unknown", + "https:\/\/schema.org\/lesser": "(0..*)", + "https:\/\/schema.org\/issueNumber": "(0..1)", + "https:\/\/schema.org\/firstPerformance": "(0..1)", + "https:\/\/schema.org\/confirmationNumber": "unknown", + "https:\/\/schema.org\/remainingAttendeeCapacity": "(0..1)", + "https:\/\/schema.org\/query": "unknown", + "https:\/\/schema.org\/countriesSupported": "unknown", + "https:\/\/schema.org\/contentReferenceTime": "(0..1)", + "https:\/\/schema.org\/xpath": "unknown", + "https:\/\/schema.org\/scheduledPaymentDate": "(0..1)", + "https:\/\/schema.org\/device": "unknown", + "https:\/\/schema.org\/availableOnDevice": "unknown", + "https:\/\/schema.org\/photos": "unknown", + "https:\/\/schema.org\/photo": "unknown", + "https:\/\/schema.org\/subTest": "unknown", + "https:\/\/schema.org\/catalogNumber": "(0..1)", + "https:\/\/schema.org\/copyrightYear": "(0..1)", + "https:\/\/schema.org\/paymentStatus": "(0..1)", + "https:\/\/schema.org\/seatSection": "(0..1)", + "https:\/\/schema.org\/accountablePerson": "unknown", + "https:\/\/schema.org\/coach": "unknown", + "https:\/\/schema.org\/dateline": "unknown", + "https:\/\/schema.org\/priceValidUntil": "(0..1)", + "https:\/\/schema.org\/identifyingTest": "unknown", + "https:\/\/schema.org\/discount": "unknown", + "https:\/\/schema.org\/steps": "unknown", + "https:\/\/schema.org\/businessDays": "unknown", + "https:\/\/schema.org\/ingredients": "unknown", + "https:\/\/schema.org\/supply": "unknown", + "https:\/\/schema.org\/recipeIngredient": "unknown", + "https:\/\/schema.org\/greater": "(0..*)", + "https:\/\/schema.org\/openingHours": "(0..1)", + "https:\/\/schema.org\/numTracks": "(0..1)", + "https:\/\/schema.org\/sport": "unknown", + "https:\/\/schema.org\/duns": "(0..1)", + "https:\/\/schema.org\/activityFrequency": "unknown", + "https:\/\/schema.org\/sportsTeam": "unknown", + "https:\/\/schema.org\/publicAccess": "unknown", + "https:\/\/schema.org\/speakable": "(0..*)", + "https:\/\/schema.org\/boardingPolicy": "(0..1)", + "https:\/\/schema.org\/hasDigitalDocumentPermission": "unknown", + "https:\/\/schema.org\/pregnancyWarning": "unknown", + "https:\/\/schema.org\/answerCount": "(0..1)", + "https:\/\/schema.org\/articleBody": "(0..1)", + "https:\/\/schema.org\/disambiguatingDescription": "unknown", + "https:\/\/schema.org\/contraindication": "unknown", + "https:\/\/schema.org\/hoursAvailable": "(0..1)", + "https:\/\/schema.org\/additionalVariable": "unknown", + "https:\/\/schema.org\/broadcastFrequencyValue": "(0..1)", + "https:\/\/schema.org\/alternateName": "unknown", + "https:\/\/schema.org\/productSupported": "(0..1)", + "https:\/\/schema.org\/seatRow": "(0..1)", + "https:\/\/schema.org\/diseasePreventionInfo": "unknown", + "https:\/\/schema.org\/tocEntry": "unknown", + "https:\/\/schema.org\/hasPart": "unknown", + "https:\/\/schema.org\/timeRequired": "unknown", + "https:\/\/schema.org\/overdosage": "unknown", + "https:\/\/schema.org\/parents": "unknown", + "https:\/\/schema.org\/parent": "unknown", + "https:\/\/schema.org\/occupationLocation": "unknown", + "https:\/\/schema.org\/studyDesign": "unknown", + "https:\/\/schema.org\/incentives": "unknown", + "https:\/\/schema.org\/incentiveCompensation": "unknown", + "https:\/\/schema.org\/embedUrl": "unknown", + "https:\/\/schema.org\/organizer": "unknown", + "https:\/\/schema.org\/warrantyPromise": "(0..*)", + "https:\/\/schema.org\/warranty": "(0..*)", + "https:\/\/schema.org\/passengerSequenceNumber": "(0..1)", + "https:\/\/schema.org\/applicableLocation": "(0..1)", + "https:\/\/schema.org\/artEdition": "(0..1)", + "https:\/\/schema.org\/trainNumber": "(0..1)", + "https:\/\/schema.org\/biomechnicalClass": "(0..1)", + "https:\/\/schema.org\/line": "unknown", + "https:\/\/schema.org\/broadcastTimezone": "(0..1)", + "https:\/\/schema.org\/encodingType": "(0..*)", + "https:\/\/schema.org\/totalTime": "(0..1)", + "https:\/\/schema.org\/includedInHealthInsurancePlan": "(0..1)", + "https:\/\/schema.org\/healthPlanCopayOption": "unknown", + "https:\/\/schema.org\/geo": "(0..1)", + "https:\/\/schema.org\/recipeCuisine": "(0..1)", + "https:\/\/schema.org\/toRecipient": "unknown", + "https:\/\/schema.org\/itemCondition": "unknown", + "https:\/\/schema.org\/hasCourseInstance": "unknown", + "https:\/\/schema.org\/numberOfPages": "(0..1)", + "https:\/\/schema.org\/proprietaryName": "unknown", + "https:\/\/schema.org\/color": "(0..1)", + "https:\/\/schema.org\/aspect": "unknown", + "https:\/\/schema.org\/mainContentOfPage": "unknown", + "https:\/\/schema.org\/engineDisplacement": "(0..*)", + "https:\/\/schema.org\/eligibleTransactionVolume": "(0..1)", + "https:\/\/schema.org\/yearlyRevenue": "(0..1)", + "https:\/\/schema.org\/carbohydrateContent": "(0..1)", + "https:\/\/schema.org\/shippingRate": "(0..1)", + "https:\/\/schema.org\/nationality": "unknown", + "https:\/\/schema.org\/ratingValue": "(0..1)", + "https:\/\/schema.org\/sportsEvent": "unknown", + "https:\/\/schema.org\/contentType": "(0..*)", + "https:\/\/schema.org\/numberOfEmployees": "(0..1)", + "https:\/\/schema.org\/connectedTo": "unknown", + "https:\/\/schema.org\/alternativeHeadline": "unknown", + "https:\/\/schema.org\/codeRepository": "unknown", + "https:\/\/schema.org\/returnPolicySeasonalOverride": "unknown", + "https:\/\/schema.org\/eventStatus": "unknown", + "https:\/\/schema.org\/observedNode": "(0..1)", + "https:\/\/schema.org\/servicePostalAddress": "(0..1)", + "https:\/\/schema.org\/representativeOfPage": "unknown", + "https:\/\/schema.org\/dietFeatures": "unknown", + "https:\/\/schema.org\/partOfEpisode": "(0..1)", + "https:\/\/schema.org\/courseMode": "(0..1)", + "https:\/\/schema.org\/vehicleSpecialUsage": "unknown", + "https:\/\/schema.org\/safetyConsideration": "unknown", + "https:\/\/schema.org\/handlingTime": "(0..1)", + "https:\/\/schema.org\/playMode": "unknown", + "https:\/\/schema.org\/workload": "unknown", + "https:\/\/schema.org\/screenshot": "unknown", + "https:\/\/schema.org\/costPerUnit": "(0..1)", + "https:\/\/schema.org\/insertion": "(0..1)", + "https:\/\/schema.org\/expires": "unknown", + "https:\/\/schema.org\/downvoteCount": "(0..1)", + "https:\/\/schema.org\/orderStatus": "(0..1)", + "https:\/\/schema.org\/manufacturer": "(0..1)", + "https:\/\/schema.org\/sourcedFrom": "(0..1)", + "https:\/\/schema.org\/possibleComplication": "unknown", + "https:\/\/schema.org\/gameTip": "unknown", + "https:\/\/schema.org\/geoCovers": "unknown", + "https:\/\/schema.org\/accessModeSufficient": "unknown", + "https:\/\/schema.org\/musicGroupMember": "unknown", + "https:\/\/schema.org\/department": "unknown", + "https:\/\/schema.org\/riskFactor": "unknown", + "https:\/\/schema.org\/requiredGender": "unknown", + "https:\/\/schema.org\/urlTemplate": "unknown", + "https:\/\/schema.org\/applicationContact": "unknown", + "https:\/\/schema.org\/jobTitle": "(0..1)", + "https:\/\/schema.org\/educationalFramework": "(0..1)", + "https:\/\/schema.org\/fileSize": "unknown", + "https:\/\/schema.org\/recipeYield": "(0..1)", + "https:\/\/schema.org\/yield": "(0..1)", + "https:\/\/schema.org\/blogPosts": "unknown", + "https:\/\/schema.org\/blogPost": "unknown", + "https:\/\/schema.org\/warrantyScope": "(0..1)", + "https:\/\/schema.org\/contactOption": "unknown", + "https:\/\/schema.org\/target": "unknown", + "https:\/\/schema.org\/expertConsiderations": "unknown", + "https:\/\/schema.org\/dissolutionDate": "(0..1)", + "https:\/\/schema.org\/datePublished": "unknown", + "https:\/\/schema.org\/validUntil": "(0..1)", + "https:\/\/schema.org\/fatContent": "(0..1)", + "https:\/\/schema.org\/cvdNumVentUse": "unknown", + "https:\/\/schema.org\/orderDate": "unknown", + "https:\/\/schema.org\/cargoVolume": "(0..*)", + "https:\/\/schema.org\/transmissionMethod": "unknown", + "https:\/\/schema.org\/preOp": "unknown", + "https:\/\/schema.org\/trainName": "(0..1)", + "https:\/\/schema.org\/dateReceived": "(0..1)", + "https:\/\/schema.org\/saturatedFatContent": "(0..1)", + "https:\/\/schema.org\/relevantOccupation": "(0..1)", + "https:\/\/schema.org\/birthDate": "unknown", + "https:\/\/schema.org\/annualPercentageRate": "(0..1)", + "https:\/\/schema.org\/subEvents": "unknown", + "https:\/\/schema.org\/subEvent": "unknown", + "https:\/\/schema.org\/reservationId": "unknown", + "https:\/\/schema.org\/assembly": "unknown", + "https:\/\/schema.org\/executableLibraryName": "unknown", + "https:\/\/schema.org\/doseValue": "(0..1)", + "https:\/\/schema.org\/tributary": "(0..1)", + "https:\/\/schema.org\/recordedIn": "(0..1)", + "https:\/\/schema.org\/recordedAt": "(0..1)", + "https:\/\/schema.org\/exampleOfWork": "unknown", + "https:\/\/schema.org\/isVariantOf": "(0..1)", + "https:\/\/schema.org\/hasVariant": "unknown", + "https:\/\/schema.org\/parentTaxon": "unknown", + "https:\/\/schema.org\/childTaxon": "unknown", + "https:\/\/schema.org\/offers": "(0..*)", + "https:\/\/schema.org\/itemOffered": "(0..1)", + "https:\/\/schema.org\/translationOfWork": "(0..1)", + "https:\/\/schema.org\/workTranslation": "unknown", + "https:\/\/schema.org\/subTrip": "unknown", + "https:\/\/schema.org\/partOfTrip": "unknown", + "https:\/\/schema.org\/dataset": "unknown", + "https:\/\/schema.org\/encodesBioChemEntity": "unknown", + "https:\/\/schema.org\/isEncodedByBioChemEntity": "(0..1)", + "https:\/\/schema.org\/subjectOf": "unknown", + "https:\/\/schema.org\/about": "(0..1)", + "https:\/\/schema.org\/recordingOf": "(0..1)", + "https:\/\/schema.org\/recordedAs": "unknown", + "https:\/\/schema.org\/providesBroadcastService": "(0..1)", + "https:\/\/schema.org\/hasBroadcastChannel": "unknown", + "https:\/\/schema.org\/subOrganization": "unknown", + "https:\/\/schema.org\/releaseOf": "(0..1)", + "https:\/\/schema.org\/albumRelease": "unknown", + "https:\/\/schema.org\/containsSeason": "unknown", + "https:\/\/schema.org\/offeredBy": "unknown", + "https:\/\/schema.org\/makesOffer": "(0..*)", + "https:\/\/schema.org\/superEvent": "unknown", + "https:\/\/schema.org\/game": "unknown", + "https:\/\/schema.org\/gameServer": "(0..1)", + "https:\/\/schema.org\/hasBioChemEntityPart": "unknown", + "https:\/\/schema.org\/isPartOfBioChemEntity": "(0..1)", + "https:\/\/schema.org\/contentLocation": "(0..1)", + "https:\/\/schema.org\/containsPlace": "(0..1)", + "https:\/\/schema.org\/encodesCreativeWork": "(0..1)", + "https:\/\/schema.org\/holdingArchive": "unknown", + "https:\/\/schema.org\/archiveHeld": "unknown", + "https:\/\/schema.org\/alumniOf": "unknown", + "https:\/\/schema.org\/alumni": "unknown", + "https:\/\/schema.org\/mainEntity": "unknown", + "https:\/\/schema.org\/mainEntityOfPage": "unknown" +} + +JSON + , $commandTester->getDisplay()); + } +} diff --git a/tests/Command/GenerateCommandTest.php b/tests/Command/GenerateCommandTest.php new file mode 100644 index 00000000..c9c60a88 --- /dev/null +++ b/tests/Command/GenerateCommandTest.php @@ -0,0 +1,552 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\Command; + +use ApiPlatform\SchemaGenerator\Command\GenerateCommand; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Tester\CommandTester; +use Symfony\Component\Filesystem\Filesystem; + +/** + * @author Kévin Dunglas + */ +class GenerateCommandTest extends TestCase +{ + private Filesystem $fs; + + protected function setUp(): void + { + $this->fs = new Filesystem(); + } + + #[DataProvider('getArguments')] + public function testCommand(string $output, string $config): void + { + $this->fs->mkdir($output); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $output, 'config' => $config])); + } + + public static function getArguments(): iterable + { + yield 'blog' => [__DIR__.'/../../build/blog/', __DIR__.'/../config/blog.yaml']; + yield 'ecommerce' => [__DIR__.'/../../build/ecommerce/', __DIR__.'/../config/ecommerce.yaml']; + yield 'vgo' => [__DIR__.'/../../build/vgo/', __DIR__.'/../config/vgo.yaml']; + yield 'address-book' => [__DIR__.'/../../build/mongodb/address-book/', __DIR__.'/../config/mongodb/address-book.yaml']; + yield 'mongodb-ecommerce' => [__DIR__.'/../../build/mongodb/ecommerce/', __DIR__.'/../config/mongodb/ecommerce.yaml']; + } + + public function testDoctrineCollection(): void + { + $outputDir = __DIR__.'/../../build/address-book'; + $config = __DIR__.'/../config/address-book.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/AddressBook/Entity/Person.php"); + $this->assertStringContainsString('use Doctrine\Common\Collections\ArrayCollection;', $person); + $this->assertStringContainsString('use Doctrine\Common\Collections\Collection;', $person); + $this->assertStringNotContainsString('extends', $person); + + $this->assertStringContainsString(<<<'PHP' + public function getFriends(): Collection + { + return $this->friends; + } +PHP + , $person); + } + + public function testCustomAttributes(): void + { + $outputDir = __DIR__.'/../../build/custom-attributes'; + $config = __DIR__.'/../config/custom-attributes.yaml'; + $this->fs->mkdir($outputDir); + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $book = file_get_contents("$outputDir/App/Entity/Book.php"); + + // Attributes given as ordered map (omap). + $this->assertStringContainsString(<<<'PHP' +use ApiPlatform\Metadata\ApiProperty; +use ApiPlatform\Metadata\ApiResource; +use App\Attributes\MyAttribute; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * A book. + * + * @see https://schema.org/Book + */ +#[ORM\Entity] +#[ApiResource(types: ['https://schema.org/Book'], routePrefix: '/library')] +#[ORM\UniqueConstraint(name: 'isbn', columns: ['isbn'])] +#[ORM\UniqueConstraint(name: 'title', columns: ['title'])] +#[MyAttribute] +class Book +{ +PHP + , $book); + + // Attributes given as unordered map. + $this->assertStringContainsString(<<<'PHP' + #[ORM\OneToMany(targetEntity: 'App\Entity\Review', mappedBy: 'book', cascade: ['persist', 'remove'])] +PHP + , $book); + $this->assertStringContainsString(<<<'PHP' + #[ORM\OrderBy(name: 'ASC')] +PHP + , $book); + // Generated attribute could be merged with next one that is a configured one. + $this->assertStringContainsString(<<<'PHP' + #[ORM\InverseJoinColumn(nullable: false, unique: true, name: 'first_join_column')] +PHP + , $book); + // Configured attribute could not be merged with next one and it is treated + // as repeated. + $this->assertStringContainsString(<<<'PHP' + #[ORM\InverseJoinColumn(name: 'second_join_column')] +PHP + , $book); + } + + public function testFluentMutators(): void + { + $outputDir = __DIR__.'/../../build/fluent-mutators'; + $config = __DIR__.'/../config/fluent-mutators.yaml'; + $this->fs->mkdir($outputDir); + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + $this->assertStringContainsString(<<<'PHP' + public function setUrl(?string $url): self + { + $this->url = $url; + + return $this; + } +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function addFriend(Person $friend): self + { + $this->friends[] = $friend; + + return $this; + } + + public function removeFriend(Person $friend): self + { + $this->friends->removeElement($friend); + + return $this; + } +PHP + , $person); + } + + public function testDoNotGenerateAccessorMethods(): void + { + $outputDir = __DIR__.'/../../build/public-properties'; + $config = __DIR__.'/../config/public-properties.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + $this->assertStringContainsString('public ?string $name', $person); + $this->assertStringNotContainsString('function get', $person); + $this->assertStringNotContainsString('function set', $person); + $this->assertStringNotContainsString('function add', $person); + $this->assertStringNotContainsString('function remove', $person); + } + + public function testImplicitAndExplicitPropertyInheritance(): void + { + $outputDir = __DIR__.'/../../build/inherited-properties'; + $config = __DIR__.'/../config/inherited-properties.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $creativeWork = file_get_contents("$outputDir/App/Entity/CreativeWork.php"); + $this->assertStringContainsString('class CreativeWork extends Thing', $creativeWork); + $this->assertStringContainsString('private ?string $copyrightYear = null;', $creativeWork); + $this->assertStringContainsString('public function getCopyrightYear(): ?string', $creativeWork); + $this->assertStringContainsString('public function setCopyrightYear(?string $copyrightYear): void', $creativeWork); + $this->assertStringNotContainsString('$name;', $creativeWork); + $this->assertStringNotContainsString('getName(', $creativeWork); + $this->assertStringNotContainsString('setName(', $creativeWork); + + $webPage = file_get_contents("$outputDir/App/Entity/WebPage.php"); + $this->assertStringContainsString('class WebPage extends CreativeWork', $webPage); + $this->assertStringContainsString('private ?string $relatedLink = null;', $webPage); + $this->assertStringContainsString('public function getRelatedLink(): ?string', $webPage); + $this->assertStringContainsString('public function setRelatedLink(?string $relatedLink): void', $webPage); + $this->assertStringNotContainsString('$copyrightYear;', $webPage); + $this->assertStringNotContainsString('getCopyrightYear(', $webPage); + $this->assertStringNotContainsString('setCopyrightYear(', $webPage); + $this->assertStringNotContainsString('$name;', $webPage); + $this->assertStringNotContainsString('getName(', $webPage); + $this->assertStringNotContainsString('setName(', $webPage); + } + + public function testPropertyDefault(): void + { + $outputDir = __DIR__.'/../../build/property-default'; + $config = __DIR__.'/../config/property-default.yaml'; + $this->fs->mkdir($outputDir); + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $book = file_get_contents("$outputDir/App/Entity/Book.php"); + + $this->assertStringContainsString(<<<'PHP' + private string $availability = 'https://schema.org/InStock'; +PHP + , $book); + } + + public function testReadableWritable(): void + { + $outputDir = __DIR__.'/../../build/readable-writable'; + $config = __DIR__.'/../config/readable-writable.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + $this->assertStringContainsString('private ?string $sameAs = null;', $person); + $this->assertStringContainsString('public function getId(): ?int', $person); + $this->assertStringNotContainsString('setId(', $person); + $this->assertStringContainsString('private ?string $name = null;', $person); + $this->assertStringContainsString('public function getName(): ?string', $person); + $this->assertStringNotContainsString('setName(', $person); + $this->assertStringContainsString('public function getFriends(', $person); + $this->assertStringNotContainsString('addFriend(', $person); + $this->assertStringNotContainsString('removeFriend(', $person); + $this->assertStringNotContainsString('setSameAs(', $person); + } + + public function testGeneratedId(): void + { + $outputDir = __DIR__.'/../../build/generated-id'; + $config = __DIR__.'/../config/generated-id.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + + $this->assertStringContainsString(<<<'PHP' + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'AUTO')] + #[ORM\Column(type: 'integer')] + private ?int $id = null; +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function getId(): ?int + { + return $this->id; + } +PHP + , $person); + + $this->assertStringNotContainsString('setId(', $person); + } + + public function testNonGeneratedId(): void + { + $outputDir = __DIR__.'/../../build/non-generated-id'; + $config = __DIR__.'/../config/non-generated-id.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + + $this->assertStringContainsString(<<<'PHP' + #[ORM\Id] + #[ORM\Column(type: 'string')] + private string $id; +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function getId(): string + { + return $this->id; + } +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function setId(string $id): void + { + $this->id = $id; + } +PHP + , $person); + } + + public function testGeneratedUuid(): void + { + $outputDir = __DIR__.'/../../build/generated-uuid'; + $config = __DIR__.'/../config/generated-uuid.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + + $this->assertStringContainsString(<<<'PHP' + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'UUID')] + #[ORM\Column(type: 'guid')] + #[Assert\Uuid] + private ?string $id = null; +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function getId(): ?string + { + return $this->id; + } +PHP + , $person); + + $this->assertStringNotContainsString('setId(', $person); + } + + public function testNonGeneratedUuid(): void + { + $outputDir = __DIR__.'/../../build/non-generated-uuid'; + $config = __DIR__.'/../config/non-generated-uuid.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + + $this->assertStringContainsString(<<<'PHP' + #[ORM\Id] + #[ORM\Column(type: 'guid')] + #[Assert\Uuid] + private string $id; +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function getId(): string + { + return $this->id; + } +PHP + , $person); + + $this->assertStringContainsString(<<<'PHP' + public function setId(string $id): void + { + $this->id = $id; + } + +PHP + , $person); + } + + public function testDoNotGenerateId(): void + { + $outputDir = __DIR__.'/../../build/no-id'; + $config = __DIR__.'/../config/no-id.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/App/Entity/Person.php"); + + $this->assertStringNotContainsString('$id', $person); + $this->assertStringNotContainsString('getId', $person); + $this->assertStringNotContainsString('setId', $person); + } + + public function testNamespacesPrefix(): void + { + $outputDir = __DIR__.'/../../build/namespaces-prefix'; + $config = __DIR__.'/../config/namespaces-prefix.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $person = file_get_contents("$outputDir/Entity/Person.php"); + + $this->assertStringContainsString('namespace App\Entity;', $person); + } + + public function testNamespacesPrefixAutodetect(): void + { + $outputDir = __DIR__.'/../../build/namespaces-prefix-autodetect/'; + + $this->fs->mkdir($outputDir); + $this->fs->copy(__DIR__.'/../config/namespaces-prefix-autodetect/composer.json', "$outputDir/composer.json"); + $this->fs->copy(__DIR__.'/../config/namespaces-prefix-autodetect/schema.yaml', "$outputDir/schema.yaml"); + + $currentDir = getcwd(); + chdir($outputDir); + try { + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute([])); + + $person = file_get_contents("$outputDir/src/Entity/Person.php"); + + $this->assertStringContainsString('namespace App\Entity;', $person); + } finally { + chdir($currentDir); + } + } + + public function testGeneratedEnum(): void + { + $outputDir = __DIR__.'/../../build/enum'; + $config = __DIR__.'/../config/enum.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $gender = file_get_contents("$outputDir/App/Enum/GenderType.php"); + + $this->assertStringContainsString(<<<'PHP' + /** @var string The female gender. */ + public const FEMALE = 'https://schema.org/Female'; +PHP + , $gender); + + $this->assertStringNotContainsString('function setId(', $gender); + } + + public function testSupersededProperties(): void + { + $outputDir = __DIR__.'/../../build/superseded-properties'; + $config = __DIR__.'/../config/superseded-properties.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $creativeWork = file_get_contents("$outputDir/App/Entity/CreativeWork.php"); + + $this->assertStringContainsString(<<<'PHP' + /** + * An award won by or for this item. + * + * @see https://schema.org/award + */ + #[ORM\Column(type: 'text', nullable: true)] + #[ApiProperty(types: ['https://schema.org/award'])] + private ?string $award = null; +PHP + , $creativeWork); + + $this->assertStringNotContainsString('protected', $creativeWork); + } + + public function testActivityStreams(): void + { + $outputDir = __DIR__.'/../../build/activity-streams'; + $config = __DIR__.'/../config/activity-streams.yaml'; + + $this->fs->mkdir($outputDir); + + $commandTester = new CommandTester(new GenerateCommand()); + $this->assertEquals(0, $commandTester->execute(['output' => $outputDir, 'config' => $config])); + + $object = file_get_contents("$outputDir/App/Entity/Object_.php"); + + $this->assertStringContainsString(<<<'PHP' + /** + * The content of the object. + * + * @see http://www.w3.org/ns/activitystreams#content + */ + #[ORM\Column(type: 'text', nullable: true, name: '`content`')] + #[ApiProperty(types: ['http://www.w3.org/ns/activitystreams#content'])] + private ?string $content = null; +PHP + , $object); + + $page = file_get_contents("$outputDir/App/Entity/Page.php"); + + $this->assertStringContainsString(<<<'PHP' +/** + * A Web Page. + * + * @see http://www.w3.org/ns/activitystreams#Page + */ +#[ORM\Entity] +#[ApiResource(types: ['http://www.w3.org/ns/activitystreams#Page'], routePrefix: 'as')] +class Page extends Object_ +PHP + , $page); + + self::assertFalse($this->fs->exists("$outputDir/App/Entity/Delete.php")); + self::assertFalse($this->fs->exists("$outputDir/App/Entity/Travel.php")); + } + + public function testGenerationWithoutConfigFileQuestion(): void + { + // No config file is given. + $application = new Application(); + $application->add(new GenerateCommand()); + + $command = $application->find('generate'); + $commandTester = new CommandTester($command); + $this->assertEquals(0, $commandTester->execute(['output' => sys_get_temp_dir()])); + $this->assertMatchesRegularExpression('/The entire vocabulary will be imported/', $commandTester->getDisplay()); + } +} diff --git a/tests/Model/InterfaceTest.php b/tests/Model/InterfaceTest.php new file mode 100644 index 00000000..71dbb9a0 --- /dev/null +++ b/tests/Model/InterfaceTest.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\Model; + +use ApiPlatform\SchemaGenerator\Model\Interface_; +use PHPUnit\Framework\TestCase; + +class InterfaceTest extends TestCase +{ + public function testInterface(): void + { + $interface = new Interface_('Printable', "App\Entity"); + $interface->addAnnotation('@see description'); + + $this->assertEquals($interface->name(), 'Printable'); + $this->assertEquals($interface->namespace(), "App\Entity"); + $generated = (string) $interface->toNetteFile($fileHeader = 'Package interfaces'); + $this->assertStringContainsString('Package interfaces', $generated); + $this->assertStringContainsString('declare(strict_types=1);', $generated); + $this->assertStringContainsString("namespace App\Entity", $generated); + $this->assertStringContainsString('interface Printable', $generated); + } +} diff --git a/tests/Schema/Model/ClassTest.php b/tests/Schema/Model/ClassTest.php new file mode 100644 index 00000000..1cbcb963 --- /dev/null +++ b/tests/Schema/Model/ClassTest.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests\Schema\Model; + +use ApiPlatform\SchemaGenerator\Model\Interface_; +use ApiPlatform\SchemaGenerator\Model\Use_; +use ApiPlatform\SchemaGenerator\Schema\Model\Class_ as SchemaClass; +use ApiPlatform\SchemaGenerator\Schema\Model\Property as SchemaProperty; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\Resource as RdfResource; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\String\Inflector\EnglishInflector; + +class ClassTest extends TestCase +{ + public function testClass(): void + { + $inflector = new EnglishInflector(); + + $property = new SchemaProperty('author'); + $property->typeHint = "App\Entity\Author"; + $property->addAnnotation('@see https://schema.org/Author'); + $class = new SchemaClass('Book', new RdfResource('http//schema.org/Book', new RdfGraph())); + $class->namespace = 'App\Entity'; + $class->interface = new Interface_('Printable', 'OtherApp\Interfaces'); + $class->addUse(new Use_('OtherApp\Interfaces\Printable')); + $class->addProperty($property); + + $configuration = new SchemaGeneratorConfiguration(); + $processedConfiguration = (new Processor())->processConfiguration($configuration, [[ + 'doctrine' => ['useCollection' => false], + 'fluentMutatorMethods' => true, + ]]); + + $generated = (string) $class->toNetteFile($processedConfiguration, $inflector); + + $this->assertStringContainsString('class Book', $generated); + $this->assertStringContainsString('namespace App\Entity;', $generated); + $this->assertStringContainsString('use OtherApp\Interfaces\Printable;', $generated); + $this->assertStringContainsString('class Book implements Printable', $generated); + $this->assertStringContainsString('/** @see https://schema.org/Author */', $generated); + $this->assertStringContainsString('private ?App\Entity\Author $author = null;', $generated); + $this->assertStringContainsString('public function setAuthor(?App\Entity\Author $author): self', $generated); + $this->assertStringContainsString('public function getAuthor(): ?App\Entity\Author', $generated); + $this->assertFalse($class->isEmbeddable); + $this->assertFalse($class->hasChild); + $this->assertFalse($class->hasParent()); + $this->assertFalse($class->hasConstructor); + $this->assertFalse($class->isEnum()); + $this->assertFalse($class->isAbstract); + $this->assertTrue($class->isInNamespace('App\Entity')); + $this->assertEquals('Book', $class->shortName()); + $this->assertEquals('http//schema.org/Book', $class->rdfType()); + $this->assertEquals([], $class->constants()); + $this->assertEquals('Book', $class->name()); + $this->assertTrue($class->hasProperty('author')); + } +} diff --git a/tests/TypesGeneratorTest.php b/tests/TypesGeneratorTest.php new file mode 100644 index 00000000..beb07316 --- /dev/null +++ b/tests/TypesGeneratorTest.php @@ -0,0 +1,448 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\SchemaGenerator\Tests; + +use ApiPlatform\SchemaGenerator\CardinalitiesExtractor; +use ApiPlatform\SchemaGenerator\FilesGenerator; +use ApiPlatform\SchemaGenerator\GoodRelationsBridge; +use ApiPlatform\SchemaGenerator\PhpTypeConverter; +use ApiPlatform\SchemaGenerator\Printer; +use ApiPlatform\SchemaGenerator\SchemaGeneratorConfiguration; +use ApiPlatform\SchemaGenerator\TypesGenerator; +use EasyRdf\Graph as RdfGraph; +use EasyRdf\RdfNamespace; +use PHPUnit\Framework\TestCase; +use Prophecy\Argument; +use Prophecy\PhpUnit\ProphecyTrait; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\NullOutput; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Finder; +use Symfony\Component\String\Inflector\EnglishInflector; +use Twig\Environment; + +/** + * @author Teoh Han Hui + * + * @phpstan-type Config array{ + * vocabularies?: array{uri: string, format: ?string, allTypes?: boolean}[], + * annotationGenerators: string[], + * attributeGenerators: string[], + * types?: array, + * parent?: ?string + * }>, + * allTypes?: boolean, + * resolveTypes?: boolean + * } + */ +class TypesGeneratorTest extends TestCase +{ + use ProphecyTrait; + + private string $outputDir = 'build/type-generator-test'; + private TypesGenerator $typesGenerator; + private FilesGenerator $filesGenerator; + + protected function setUp(): void + { + RdfNamespace::set('schema', 'https://schema.org/'); + + $twigProphecy = $this->prophesize(Environment::class); + $twig = $twigProphecy->reveal(); + + $cardinalitiesExtractorProphecy = $this->prophesize(CardinalitiesExtractor::class); + $cardinalities = $this->getCardinalities(); + $cardinalitiesExtractorProphecy->extract(Argument::type('array'))->willReturn($cardinalities); + $cardinalitiesExtractor = $cardinalitiesExtractorProphecy->reveal(); + + $goodRelationsBridgeProphecy = $this->prophesize(GoodRelationsBridge::class); + $goodRelationsBridge = $goodRelationsBridgeProphecy->reveal(); + + $inflector = new EnglishInflector(); + + $this->typesGenerator = new TypesGenerator( + $inflector, + new PhpTypeConverter(), + $cardinalitiesExtractor, + $goodRelationsBridge + ); + + $this->filesGenerator = new FilesGenerator( + $inflector, + new Printer(), + $twig, + new SymfonyStyle(new ArrayInput([]), new NullOutput()) + ); + } + + public function testGenerate(): void + { + $this->generateForConfiguration($this->getConfig(), $this->getGraphs()); + + $finder = new Finder(); + self::assertSame(6, $finder->files()->in($this->outputDir)->count()); + + $article = file_get_contents("$this->outputDir/App/Entity/Article.php"); + $this->assertStringContainsString('abstract class Article extends CreativeWork', $article); + $this->assertStringContainsString('private ?string $articleBody = null;', $article); + $this->assertStringContainsString('private array $articleSection = [];', $article); + $this->assertStringContainsString('public function setArticleBody(?string $articleBody): void', $article); + $this->assertStringContainsString('public function getArticleBody(): ?string', $article); + $this->assertStringContainsString('public function addArticleSection(string $articleSection): void', $article); + $this->assertStringContainsString('public function removeArticleSection(string $articleSection): void', $article); + + $creativeWork = file_get_contents("$this->outputDir/App/Entity/CreativeWork.php"); + $this->assertStringContainsString('class CreativeWork extends Thing', $creativeWork); + $this->assertStringContainsString('private ?Person $author = null;', $creativeWork); + $this->assertStringContainsString('private ?\DateTimeInterface $datePublished = null;', $creativeWork); + $this->assertStringContainsString('private ?string $headline = null;', $creativeWork); + $this->assertStringContainsString('private ?bool $isFamilyFriendly = null;', $creativeWork); + + $blogPosting = file_get_contents("$this->outputDir/App/Entity/BlogPosting.php"); + $this->assertStringContainsString('class BlogPosting extends SocialMediaPosting', $blogPosting); + + $socialMediaPosting = file_get_contents("$this->outputDir/App/Entity/SocialMediaPosting.php"); + $this->assertStringContainsString('abstract class SocialMediaPosting extends Article', $socialMediaPosting); + $this->assertStringContainsString('private CreativeWork $sharedContent;', $socialMediaPosting); + $this->assertStringContainsString(<<<'PHP' + public function setSharedContent(CreativeWork $sharedContent): void + { + $this->sharedContent = $sharedContent; + } +PHP, $socialMediaPosting); + + $this->assertStringContainsString(<<<'PHP' + public function getSharedContent(): CreativeWork + { + return $this->sharedContent; + } +PHP, $socialMediaPosting); + + $person = file_get_contents("$this->outputDir/App/Entity/Person.php"); + $this->assertStringContainsString('class Person extends Thing', $person); + + $thing = file_get_contents("$this->outputDir/App/Entity/Thing.php"); + $this->assertStringContainsString(<<<'PHP' +abstract class Thing +{ + private ?int $id = null; + private ?string $name = null; + + public function getId(): ?int + { + return $this->id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } +} +PHP, $thing); + } + + public function testGenerateAllResolveTypes(): void + { + $this->generateForConfiguration($this->getAllResolveTypesConfig(), $this->getGraphs()); + + $finder = new Finder(); + self::assertSame(2, $finder->files()->in($this->outputDir)->count()); + + $competencyWorldEntity = file_get_contents("$this->outputDir/App/Entity/CompetencyWorldEntity.php"); + $this->assertStringContainsString('class CompetencyWorldEntity extends Thing', $competencyWorldEntity); + $this->assertStringContainsString('private ?string $hasAppellation = null;', $competencyWorldEntity); + $this->assertStringContainsString('private ?string $hasDescription = null;', $competencyWorldEntity); + $this->assertStringContainsString('private array $intendedOccupation = [];', $competencyWorldEntity); + $this->assertStringContainsString('public function setHasAppellation(?string $hasAppellation): void', $competencyWorldEntity); + $this->assertStringContainsString('public function getHasAppellation(): ?string', $competencyWorldEntity); + } + + public function testGenerateVocabAllTypes(): void + { + $this->generateForConfiguration($this->getVocabAllTypesConfig(), $this->getGraphs()); + + $finder = new Finder(); + self::assertSame(2, $finder->files()->in($this->outputDir)->count()); + } + + public function testGenerateMissingParent(): void + { + $loggerProphecy = $this->prophesize(LoggerInterface::class); + $loggerProphecy->error('The type "CreativeWork" (parent of "https://schema.org/Article") doesn\'t exist')->shouldBeCalled(); + $this->typesGenerator->setLogger($loggerProphecy->reveal()); + + $this->generateForConfiguration($this->getMissingParentConfig(), $this->getGraphs()); + + $finder = new Finder(); + self::assertSame(1, $finder->files()->in($this->outputDir)->count()); + + $this->typesGenerator->setLogger(new NullLogger()); + } + + /** + * @param Config $config + */ + private function generateForConfiguration(array $config, array $graphs): void + { + $finder = new Finder(); + + $filesystem = new Filesystem(); + if ($filesystem->exists($this->outputDir)) { + $filesystem->remove($finder->files()->in($this->outputDir)); + } + + $configuration = new SchemaGeneratorConfiguration(); + /** @var Configuration $processedConfiguration */ + $processedConfiguration = (new Processor())->processConfiguration($configuration, [$config]); + $processedConfiguration['output'] = $this->outputDir; + $classes = $this->typesGenerator->generate($graphs, $processedConfiguration); + $this->filesGenerator->generate($classes, $processedConfiguration); + } + + /** + * @return RdfGraph[] + */ + private function getGraphs(): array + { + $nodeGraph = new RdfGraph('nodefr-2.jsonld'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/CompetencyWorldEntity', 'rdf:type', 'rdfs:Class'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/CompetencyWorldEntity', 'rdfs:subClassOf', 'https://schema.org/Thing'); + + $nodeGraph->addResource('_:b0_n0', 'rdf:type', 'rdfs:Class'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasAppellation', 'rdf:type', 'rdf:Property'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasAppellation', 'schema:domainIncludes', 'https://gitlab.com/mmorg/nodefr-2/CompetencyWorldEntity'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasAppellation', 'schema:rangeIncludes', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasAppellation', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasDescription', 'rdf:type', 'rdf:Property'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasDescription', 'schema:domainIncludes', 'https://gitlab.com/mmorg/nodefr-2/CompetencyWorldEntity'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/hasDescription', 'schema:rangeIncludes', 'https://gitlab.com/mmorg/nodefr-2/n3-5'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-5', 'rdf:type', 'rdfs:Class'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-5', 'owl:unionOf', 'https://gitlab.com/mmorg/nodefr-2/n3-6'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-6', 'rdf:first', 'http://www.w3.org/2001/XMLSchema#language'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-6', 'rdf:rest', 'https://gitlab.com/mmorg/nodefr-2/n3-7'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-7', 'rdf:first', 'http://www.w3.org/2001/XMLSchema#string'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/n3-7', 'rdf:rest', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#langString'); + + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/intendedOccupation', 'rdf:type', 'rdf:Property'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/intendedOccupation', 'schema:domainIncludes', 'https://gitlab.com/mmorg/nodefr-2/CompetencyWorldEntity'); + $nodeGraph->addResource('https://gitlab.com/mmorg/nodefr-2/intendedOccupation', 'schema:rangeIncludes', 'https://gitlab.com/mmorg/nodefr-2/specialCase'); + + $graph = new RdfGraph(SchemaGeneratorConfiguration::SCHEMA_ORG_URI); + + $graph->addResource('https://schema.org/Article', 'rdf:type', 'rdfs:Class'); + $graph->addResource('https://schema.org/Article', 'rdfs:subClassOf', 'https://schema.org/CreativeWork'); + + $graph->addResource('https://schema.org/BlogPosting', 'rdf:type', 'rdfs:Class'); + $graph->addResource('https://schema.org/BlogPosting', 'rdfs:subClassOf', 'https://schema.org/SocialMediaPosting'); + + $graph->addResource('https://schema.org/CreativeWork', 'rdf:type', 'rdfs:Class'); + $graph->addResource('https://schema.org/CreativeWork', 'rdfs:subClassOf', 'https://schema.org/Thing'); + + $graph->addResource('https://schema.org/Person', 'rdf:type', 'rdfs:Class'); + $graph->addResource('https://schema.org/Person', 'rdfs:subClassOf', 'https://schema.org/Thing'); + + $graph->addResource('https://schema.org/SocialMediaPosting', 'rdf:type', 'rdfs:Class'); + $graph->addResource('https://schema.org/SocialMediaPosting', 'rdfs:subClassOf', 'https://schema.org/Article'); + + $graph->addResource('https://schema.org/Thing', 'rdf:type', 'rdfs:Class'); + + $graph->addResource('https://schema.org/articleBody', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/articleBody', 'schema:domainIncludes', 'https://schema.org/Article'); + $graph->addResource('https://schema.org/articleBody', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $graph->addResource('https://schema.org/articleSection', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/articleSection', 'schema:domainIncludes', 'https://schema.org/Article'); + $graph->addResource('https://schema.org/articleSection', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $graph->addResource('https://schema.org/author', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/author', 'schema:domainIncludes', 'https://schema.org/CreativeWork'); + $graph->addResource('https://schema.org/author', 'schema:rangeIncludes', 'https://schema.org/Person'); + + $graph->addResource('https://schema.org/datePublished', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/datePublished', 'schema:domainIncludes', 'https://schema.org/CreativeWork'); + $graph->addResource('https://schema.org/datePublished', 'schema:rangeIncludes', 'https://schema.org/Date'); + + $graph->addResource('https://schema.org/headline', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/headline', 'schema:domainIncludes', 'https://schema.org/CreativeWork'); + $graph->addResource('https://schema.org/headline', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $graph->addResource('https://schema.org/isFamilyFriendly', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/isFamilyFriendly', 'schema:domainIncludes', 'https://schema.org/CreativeWork'); + $graph->addResource('https://schema.org/isFamilyFriendly', 'schema:rangeIncludes', 'https://schema.org/Boolean'); + + $graph->addResource('https://schema.org/name', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/name', 'schema:domainIncludes', 'https://schema.org/Thing'); + $graph->addResource('https://schema.org/name', 'schema:rangeIncludes', 'https://schema.org/Text'); + + $graph->addResource('https://schema.org/sharedContent', 'rdf:type', 'rdf:Property'); + $graph->addResource('https://schema.org/sharedContent', 'schema:domainIncludes', 'https://schema.org/SocialMediaPosting'); + $graph->addResource('https://schema.org/sharedContent', 'schema:rangeIncludes', 'https://schema.org/CreativeWork'); + + return [$nodeGraph, $graph]; + } + + /** + * @return array + */ + private function getCardinalities(): array + { + return [ + 'https://schema.org/articleBody' => CardinalitiesExtractor::CARDINALITY_0_1, + 'https://schema.org/articleSection' => CardinalitiesExtractor::CARDINALITY_0_N, + 'https://schema.org/author' => CardinalitiesExtractor::CARDINALITY_0_1, + 'https://schema.org/datePublished' => CardinalitiesExtractor::CARDINALITY_UNKNOWN, + 'https://schema.org/headline' => CardinalitiesExtractor::CARDINALITY_UNKNOWN, + 'https://schema.org/isFamilyFriendly' => CardinalitiesExtractor::CARDINALITY_0_1, + 'https://schema.org/name' => CardinalitiesExtractor::CARDINALITY_0_1, + 'https://schema.org/sharedContent' => CardinalitiesExtractor::CARDINALITY_UNKNOWN, + ]; + } + + /** + * @return Config + */ + private function getConfig(): array + { + return [ + 'annotationGenerators' => [ + ], + 'attributeGenerators' => [ + ], + 'types' => [ + 'Article' => [ + 'parent' => null, + 'properties' => [ + 'articleBody' => null, + 'articleSection' => null, + ], + ], + 'CreativeWork' => [ + 'parent' => null, + 'properties' => [ + 'author' => [ + 'cardinality' => CardinalitiesExtractor::CARDINALITY_N_0, + 'range' => 'Person', + ], + 'datePublished' => null, + 'headline' => null, + 'isFamilyFriendly' => null, + ], + ], + 'BlogPosting' => [ + 'parent' => null, + 'allProperties' => true, + 'properties' => null, + ], + 'Person' => [ + 'parent' => null, + 'properties' => [], + ], + 'SocialMediaPosting' => [ + 'parent' => null, + 'allProperties' => true, + ], + 'Thing' => [ + 'parent' => null, + 'allProperties' => true, + ], + ], + ]; + } + + /** + * @return Config + */ + private function getMissingParentConfig(): array + { + return [ + 'annotationGenerators' => [ + ], + 'attributeGenerators' => [ + ], + 'types' => [ + 'Article' => [ + 'parent' => null, + 'properties' => [ + 'articleBody' => null, + 'articleSection' => null, + ], + ], + ], + ]; + } + + /** + * @return Config + */ + private function getAllResolveTypesConfig(): array + { + return [ + 'vocabularies' => [ + ['uri' => SchemaGeneratorConfiguration::SCHEMA_ORG_URI, 'format' => null, 'allTypes' => false], + ['uri' => 'nodefr-2.jsonld', 'format' => 'jsonld'], + ], + 'annotationGenerators' => [ + ], + 'attributeGenerators' => [ + ], + 'relations' => ['defaultCardinality' => '(1..*)'], + 'allTypes' => true, + 'resolveTypes' => true, + ]; + } + + /** + * @return Config + */ + private function getVocabAllTypesConfig(): array + { + return [ + 'vocabularies' => [ + ['uri' => SchemaGeneratorConfiguration::SCHEMA_ORG_URI, 'format' => null, 'allTypes' => false], + ['uri' => 'nodefr-2.jsonld', 'format' => 'jsonld', 'allTypes' => true], + ], + 'annotationGenerators' => [ + ], + 'attributeGenerators' => [ + ], + 'types' => [ + 'BlogPosting' => [ + 'parent' => null, + 'allProperties' => true, + 'properties' => null, + ], + ], + ]; + } +} diff --git a/tests/config/activity-streams.yaml b/tests/config/activity-streams.yaml new file mode 100644 index 00000000..4b0b5d1d --- /dev/null +++ b/tests/config/activity-streams.yaml @@ -0,0 +1,13 @@ +vocabularies: + - { uri: tests/data/activitystreams2.owl, attributes: { ApiResource: { routePrefix: 'as' } } } +vocabularyNamespace: http://www.w3.org/ns/activitystreams# +allTypes: true +types: + Delete: + exclude: true + Place: + allProperties: true + properties: + units: { range: 'http://www.w3.org/2001/XMLSchema#string' } + Travel: + exclude: true diff --git a/tests/config/address-book.yaml b/tests/config/address-book.yaml new file mode 100644 index 00000000..df61c20a --- /dev/null +++ b/tests/config/address-book.yaml @@ -0,0 +1,39 @@ +# The PHP namespace of generated entities +namespaces: + entity: 'AddressBook\Entity' +# The list of types and properties we want to use +types: + Person: + properties: + name: ~ + familyName: ~ + givenName: ~ + additionalName: ~ + gender: ~ + address: { range: PostalAddress } + # Custom range and custom ORM\Column content + birthDate: { range: DateTime, attributes: { ORM\Column: { type: "datetimetz", nullable: true, options: { comment: "Birthdate with timezone." } } } } + telephone: ~ + email: ~ + jobTitle: ~ + affiliation: ~ + brand: { attributes: { ORM\JoinTable: { name: "person_brand" } } } + memberOf: { range: "Organization", cardinality: (1..*), attributes: { ORM\JoinTable: { name: "person_memberof" } } } + worksFor: { range: "Organization", cardinality: (0..*), attributes: { ORM\JoinTable: { name: "person_worksfor" } } } + # url field is a custom one without definition, it should render error + url: ~ + friends: { range: "Person", cardinality: (0..*) } + PostalAddress: + properties: + # Force the type of the addressCountry property to text + addressCountry: { range: "https://schema.org/Text" } + addressLocality: ~ + addressRegion: ~ + postOfficeBoxNumber: ~ + postalCode: ~ + streetAddress: ~ + Organization: + properties: + name: ~ + # Custom property with custom ORM\Column content + adminCode: { range: https://schema.org/Text, attributes: { ORM\Column: { type: "string", length: 3, unique: true, nullable: false, options: { comment: "A code for central administration." } } } } diff --git a/tests/config/address-book.yml b/tests/config/address-book.yml deleted file mode 100644 index 327b327d..00000000 --- a/tests/config/address-book.yml +++ /dev/null @@ -1,38 +0,0 @@ -# The PHP namespace of generated entities -namespaces: - entity: "AddressBook\Entity" -# Enable DunglasJsonLdApiAnnotationGenerator -annotationGenerators: - - SchemaOrgModel\AnnotationGenerator\PhpDocAnnotationGenerator - - SchemaOrgModel\AnnotationGenerator\DoctrineOrmAnnotationGenerator - - SchemaOrgModel\AnnotationGenerator\ConstraintAnnotationGenerator - - SchemaOrgModel\AnnotationGenerator\DunglasJsonLdApiAnnotationGenerator -# The list of types and properties we want to use -types: - # Parent class of Person - Thing: - properties: - name: ~ - Person: - properties: - familyName: ~ - givenName: ~ - additionalName: ~ - gender: ~ - address: ~ - birthDate: ~ - telephone: ~ - email: ~ - url: ~ - jobTitle: ~ - PostalAddress: - # Disable the generation of the class hierarchy for this type - parent: false - properties: - # Force the type of the addressCountry property to text - addressCountry: { range: "Text" } - addressLocality: ~ - addressRegion: ~ - postOfficeBoxNumber: ~ - postalCode: ~ - streetAddress: ~ diff --git a/tests/config/blog.yaml b/tests/config/blog.yaml new file mode 100644 index 00000000..5ddcdbbb --- /dev/null +++ b/tests/config/blog.yaml @@ -0,0 +1,27 @@ +annotationGenerators: # Generators we want to use + - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator +attributeGenerators: # Generators we want to use + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator +namespaces: + entity: App\Entity # The default namespace for entities, following API Platform and Symfony best practices +types: # The list of type to generated (a PHP entity class by type will be generated) + SocialMediaPosting: ~ + BlogPosting: ~ # A type to generate a PHP entity class from, including all its properties (here this type has no specific property, they are all inherited) + Article: # Schema.org has an inheritance system, we will configure all types of the hierarchy + properties: # The list of properties we want to use + articleBody: ~ + articleSection: ~ + CreativeWork: + properties: + author: + range: Person # PHP Schema handle relations. Here we force the type of the property to Person + cardinality: (*..0) # Force the cardinality of the relation + headline: ~ + isFamilyFriendly: ~ + datePublished: ~ + Thing: + properties: + name: ~ + Person: # Person is a relation of the "CreativeWork" type (property "author"), PHP Schema will generate relations for us + properties: {} # We don't want any specific property for a person except "name" inherited from Thing diff --git a/tests/config/custom-attributes.yaml b/tests/config/custom-attributes.yaml new file mode 100644 index 00000000..e75c319e --- /dev/null +++ b/tests/config/custom-attributes.yaml @@ -0,0 +1,35 @@ +uses: + App\Attributes\MyAttribute: ~ +types: + Book: + attributes: + - ORM\Entity: ~ + - ApiResource: { routePrefix: '/library' } + - ORM\UniqueConstraint: { name: "isbn", columns: ["isbn"] } + - ORM\UniqueConstraint: { name: "title", columns: ["title"] } + - MyAttribute: ~ + properties: + isbn: ~ + title: { range: "https://schema.org/Text" } + author: { range: "https://schema.org/Text" } + description: ~ + reviews: + mappedBy: book + cardinality: (1..*) + attributes: + ORM\OneToMany: { cascade: [persist, remove] } + ORM\OrderBy: { name: ASC } + 0: + ORM\InverseJoinColumn: { name: "first_join_column" } + 1: + ORM\InverseJoinColumn: { name: "second_join_column" } + + Review: + properties: + book: + range: Book + inversedBy: reviews + cardinality: (*..1) + author: { range: "https://schema.org/Text" } + reviewBody: ~ + rating: { range: "https://schema.org/Integer" } diff --git a/tests/config/ecommerce.yml b/tests/config/ecommerce.yaml similarity index 65% rename from tests/config/ecommerce.yml rename to tests/config/ecommerce.yaml index c5757f19..a548ede6 100644 --- a/tests/config/ecommerce.yml +++ b/tests/config/ecommerce.yaml @@ -7,15 +7,11 @@ header: | * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -rdfa: - - tests/data/schema.rdfa -relations: - - tests/data/v1.owl namespaces: - entity: "Dunglas\EcommerceBundle\Entity" - enum: "Dunglas\EcommerceBundle\Enum" - interface: "Dunglas\EcommerceBundle\Model" -author: "Kévin Dunglas " + entity: 'Dunglas\EcommerceBundle\Entity' + enum: 'Dunglas\EcommerceBundle\Enum' + interface: 'Dunglas\EcommerceBundle\Model' +author: 'Kévin Dunglas ' debug: true useInterface: true checkIsGoodRelations: true @@ -24,15 +20,15 @@ types: properties: name: ~ description: ~ - image: ~ + image: { range: ImageObject } additionalType: ~ Product: properties: sku: - cardinality: "(0..1)" + cardinality: '(0..1)' url: ~ brand: ~ - productId: ~ + productID: ~ releaseDate: ~ offers: ~ itemCondition: ~ @@ -41,14 +37,20 @@ types: gtin8: ~ mpn: ~ color: ~ - depth: { range: "Text" } - height: { range: "Text" } - weight: { range: "Text" } - width: { range: "Text" } + depth: { range: 'Text' } + height: { range: 'Text' } + weight: { range: 'Text' } + width: { range: 'Text' } + seller: { range: 'Seller' } Brand: - parent: "Thing" + parent: 'Thing' properties: - logo: { range: "ImageObject" } + logo: { range: 'ImageObject' } + Seller: + guessFrom: Person + properties: + name: ~ + birthDate: ~ ImageObject: parent: Thing properties: @@ -64,11 +66,11 @@ types: availabilityStarts: ~ availabilityEnds: ~ availableDeliveryMethod: ~ - category: { range: "Text" } + category: { range: 'Text' } deliveryLeadTime: ~ inventoryLevel: ~ itemCondition: ~ - price: ~ + price: { range: Number } priceCurrency: ~ validFrom: ~ validThrough: ~ @@ -78,3 +80,4 @@ types: PaymentMethod: ~ ItemAvailability: ~ DeliveryMethod: ~ + QuantitativeValue: ~ diff --git a/tests/config/enum.yaml b/tests/config/enum.yaml new file mode 100644 index 00000000..c29247bb --- /dev/null +++ b/tests/config/enum.yaml @@ -0,0 +1,8 @@ +fieldVisibility: public +accessorMethods: false +types: + Person: + properties: + gender: { range: GenderType } + GenderType: + guessFrom: GenderType diff --git a/tests/config/fluent-mutators.yaml b/tests/config/fluent-mutators.yaml new file mode 100644 index 00000000..36b435f7 --- /dev/null +++ b/tests/config/fluent-mutators.yaml @@ -0,0 +1,36 @@ +fluentMutatorMethods: true +types: + Person: + properties: + name: ~ + familyName: ~ + givenName: ~ + additionalName: ~ + gender: ~ + address: { range: PostalAddress } + # Custom range and custom ORM\Column content + birthDate: { range: DateTime, attributes: { ORM\Column: { type: "datetimetz", nullable: true, options: { comment: "Birthdate with timezone." } } } } + telephone: ~ + email: ~ + jobTitle: ~ + affiliation: ~ + brand: { attributes: { ORM\JoinTable: { name: "person_brand" } } } + memberOf: { range: "Organization", cardinality: (1..*), attributes: { ORM\JoinTable: { name: "person_memberof" } } } + worksFor: { range: "Organization", cardinality: (0..*), attributes: { ORM\JoinTable: { name: "person_worksfor" } } } + # url field is a custom one without definition, it should render error + url: ~ + friends: { range: "Person", cardinality: (0..*) } + PostalAddress: + properties: + # Force the type of the addressCountry property to text + addressCountry: { range: "Text" } + addressLocality: ~ + addressRegion: ~ + postOfficeBoxNumber: ~ + postalCode: ~ + streetAddress: ~ + Organization: + properties: + name: ~ + # Custom property with custom ORM\Column content + adminCode: { range: https://schema.org/Text, attributes: { ORM\Column: { type: "string", length: 3, unique: true, nullable: false, options: { comment: "A code for central administration." } } } } diff --git a/tests/config/generated-id.yaml b/tests/config/generated-id.yaml new file mode 100644 index 00000000..d048c56e --- /dev/null +++ b/tests/config/generated-id.yaml @@ -0,0 +1,6 @@ +id: + generationStrategy: auto +types: + Person: + properties: + name: ~ diff --git a/tests/config/generated-uuid.yaml b/tests/config/generated-uuid.yaml new file mode 100644 index 00000000..bf215b7d --- /dev/null +++ b/tests/config/generated-uuid.yaml @@ -0,0 +1,6 @@ +id: + generationStrategy: uuid +types: + Person: + properties: + name: ~ diff --git a/tests/config/inherited-properties.yaml b/tests/config/inherited-properties.yaml new file mode 100644 index 00000000..c696ae0e --- /dev/null +++ b/tests/config/inherited-properties.yaml @@ -0,0 +1,10 @@ +types: + CreativeWork: + allProperties: true + parent: Thing + properties: + copyrightYear: + Thing: + WebPage: + allProperties: true + parent: CreativeWork diff --git a/tests/config/mongodb/address-book.yaml b/tests/config/mongodb/address-book.yaml new file mode 100644 index 00000000..89c3a46a --- /dev/null +++ b/tests/config/mongodb/address-book.yaml @@ -0,0 +1,43 @@ +# The PHP namespace of generated entities +namespaces: + entity: 'AddressBook\Document' +annotationGenerators: + - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator +attributeGenerators: + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineMongoDBAttributeGenerator +id: + generationStrategy: uuid +# The list of types and properties we want to use +types: + Person: + properties: + name: ~ + familyName: ~ + givenName: ~ + additionalName: ~ + gender: ~ + address: { range: https://schema.org/PostalAddress } + birthDate: ~ + telephone: ~ + email: ~ + jobTitle: ~ + affiliation: ~ + brand: ~ + memberOf: { range: "https://schema.org/Organization", cardinality: (1..*) } + worksFor: { range: "https://schema.org/Organization", cardinality: (0..*) } + # url field is a custom one without definition, it should render error + url: ~ + friends: { range: "https://schema.org/Person", cardinality: (0..*) } + PostalAddress: + properties: + # Force the type of the addressCountry property to text + addressCountry: { range: "https://schema.org/Text" } + addressLocality: ~ + addressRegion: ~ + postOfficeBoxNumber: ~ + postalCode: ~ + streetAddress: ~ + Organization: + properties: + name: ~ diff --git a/tests/config/mongodb/ecommerce.yaml b/tests/config/mongodb/ecommerce.yaml new file mode 100644 index 00000000..6204dec9 --- /dev/null +++ b/tests/config/mongodb/ecommerce.yaml @@ -0,0 +1,90 @@ +header: | + /* + * This file is part of the Ecommerce package. + * + * (c) Kévin Dunglas + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespaces: + entity: 'Dunglas\EcommerceBundle\Document' + enum: 'Dunglas\EcommerceBundle\Enum' + interface: 'Dunglas\EcommerceBundle\Model' +annotationGenerators: + - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator +attributeGenerators: + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineMongoDBAttributeGenerator +author: 'Kévin Dunglas ' +debug: true +useInterface: true +checkIsGoodRelations: true +id: + generationStrategy: mongoid +types: + Thing: + properties: + name: ~ + description: ~ + image: { range: https://schema.org/ImageObject } + additionalType: ~ + Product: + properties: + sku: + cardinality: '(0..1)' + url: ~ + brand: ~ + productID: ~ + releaseDate: ~ + offers: ~ + itemCondition: ~ + gtin13: ~ + gtin14: ~ + gtin8: ~ + mpn: ~ + color: ~ + depth: { range: 'https://schema.org/Text' } + height: { range: 'https://schema.org/Text' } + weight: { range: 'https://schema.org/Text' } + width: { range: 'https://schema.org/Text' } + seller: { range: 'https://schema.org/Seller' } + Brand: + parent: Thing + properties: + logo: { range: 'https://schema.org/ImageObject' } + Seller: + guessFrom: Person + properties: + name: ~ + birthDate: ~ + ImageObject: + parent: Thing + properties: + caption: ~ + ProductModel: + properties: + isVariantOf: ~ + Offer: + parent: Thing + properties: + acceptedPaymentMethod: ~ + availability: ~ + availabilityStarts: ~ + availabilityEnds: ~ + availableDeliveryMethod: ~ + category: { range: 'https://schema.org/Text' } + deliveryLeadTime: ~ + inventoryLevel: ~ + itemCondition: ~ + price: { range: https://schema.org/Number } + priceCurrency: ~ + validFrom: ~ + validThrough: ~ + DeliveryChargeSpecification: ~ + PaymentChargeSpecification: ~ + OfferItemCondition: ~ + PaymentMethod: ~ + ItemAvailability: ~ + DeliveryMethod: ~ + QuantitativeValue: ~ diff --git a/tests/config/namespaces-prefix-autodetect/composer.json b/tests/config/namespaces-prefix-autodetect/composer.json new file mode 100644 index 00000000..19013756 --- /dev/null +++ b/tests/config/namespaces-prefix-autodetect/composer.json @@ -0,0 +1,5 @@ +{ + "autoload": { + "psr-4": { "App\\": "src/" } + } +} diff --git a/tests/config/namespaces-prefix-autodetect/schema.yaml b/tests/config/namespaces-prefix-autodetect/schema.yaml new file mode 100644 index 00000000..15ac1db5 --- /dev/null +++ b/tests/config/namespaces-prefix-autodetect/schema.yaml @@ -0,0 +1,4 @@ +types: + Person: + properties: + name: ~ diff --git a/tests/config/namespaces-prefix.yaml b/tests/config/namespaces-prefix.yaml new file mode 100644 index 00000000..ebbe5add --- /dev/null +++ b/tests/config/namespaces-prefix.yaml @@ -0,0 +1,7 @@ +namespaces: + prefix: App\ + entity: App\Entity +types: + Person: + properties: + name: ~ diff --git a/tests/config/no-id.yaml b/tests/config/no-id.yaml new file mode 100644 index 00000000..9af07a2f --- /dev/null +++ b/tests/config/no-id.yaml @@ -0,0 +1,6 @@ +id: + generate: false +types: + Person: + properties: + name: ~ diff --git a/tests/config/non-generated-id.yaml b/tests/config/non-generated-id.yaml new file mode 100644 index 00000000..846e47fe --- /dev/null +++ b/tests/config/non-generated-id.yaml @@ -0,0 +1,6 @@ +id: + generationStrategy: none +types: + Person: + properties: + name: ~ diff --git a/tests/config/non-generated-uuid.yaml b/tests/config/non-generated-uuid.yaml new file mode 100644 index 00000000..a20e4025 --- /dev/null +++ b/tests/config/non-generated-uuid.yaml @@ -0,0 +1,7 @@ +id: + generationStrategy: uuid + writable: true +types: + Person: + properties: + name: ~ diff --git a/tests/config/property-default.yaml b/tests/config/property-default.yaml new file mode 100644 index 00000000..d8f13345 --- /dev/null +++ b/tests/config/property-default.yaml @@ -0,0 +1,7 @@ +types: + ItemAvailability: ~ + Book: + properties: + availability: + range: ItemAvailability + defaultValue: "https://schema.org/InStock" diff --git a/tests/config/public-properties.yaml b/tests/config/public-properties.yaml new file mode 100644 index 00000000..fb5cfd40 --- /dev/null +++ b/tests/config/public-properties.yaml @@ -0,0 +1,37 @@ +fieldVisibility: public +accessorMethods: false +types: + Person: + properties: + name: ~ + familyName: ~ + givenName: ~ + additionalName: ~ + gender: ~ + address: { range: PostalAddress } + # Custom range and custom ORM\Column content + birthDate: { range: DateTime, attributes: { ORM\Column: { type: "datetimetz", nullable: true, options: { comment: "Birthdate with timezone." } } } } + telephone: ~ + email: ~ + jobTitle: ~ + affiliation: ~ + brand: { attributes: { ORM\JoinTable: { name: "person_brand" } } } + memberOf: { range: "Organization", cardinality: (1..*), attributes: { ORM\JoinTable: { name: "person_memberof" } } } + worksFor: { range: "Organization", cardinality: (0..*), attributes: { ORM\JoinTable: { name: "person_worksfor" } } } + # url field is a custom one without definition, it should render error + url: ~ + friends: { range: "Person", cardinality: (0..*) } + PostalAddress: + properties: + # Force the type of the addressCountry property to text + addressCountry: { range: "Text" } + addressLocality: ~ + addressRegion: ~ + postOfficeBoxNumber: ~ + postalCode: ~ + streetAddress: ~ + Organization: + properties: + name: ~ + # Custom property with custom ORM\Column content + adminCode: { range: https://schema.org/Text, attributes: { ORM\Column: { type: "string", length: 3, unique: true, nullable: false, options: { comment: "A code for central administration." } } } } diff --git a/tests/config/readable-writable.yaml b/tests/config/readable-writable.yaml new file mode 100644 index 00000000..541d8864 --- /dev/null +++ b/tests/config/readable-writable.yaml @@ -0,0 +1,7 @@ +types: + Person: + properties: + name: { writable: false } + familyName: { readable: false } + friends: { range: "Person", cardinality: (0..*), writable: false } + sameAs: { writable: false } diff --git a/tests/config/superseded-properties.yaml b/tests/config/superseded-properties.yaml new file mode 100644 index 00000000..66a48f0e --- /dev/null +++ b/tests/config/superseded-properties.yaml @@ -0,0 +1,3 @@ +types: + CreativeWork: + allProperties: true diff --git a/tests/config/vgo.yaml b/tests/config/vgo.yaml new file mode 100644 index 00000000..ed1d3922 --- /dev/null +++ b/tests/config/vgo.yaml @@ -0,0 +1,20 @@ +vocabularies: + - tests/data/vgo.rdf + - uri: tests/data/schema.rdf + format: rdf + +annotationGenerators: + - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator +attributeGenerators: + - ApiPlatform\SchemaGenerator\AttributeGenerator\DoctrineOrmAttributeGenerator + - ApiPlatform\SchemaGenerator\AttributeGenerator\ConstraintAttributeGenerator + +namespaces: + entity: 'App\Entity' + +types: + Session: + vocabularyNamespace: http://purl.org/net/VideoGameOntology# + Thing: ~ + +debug: true diff --git a/tests/data/activitystreams2.owl b/tests/data/activitystreams2.owl new file mode 100644 index 00000000..28354c5a --- /dev/null +++ b/tests/data/activitystreams2.owl @@ -0,0 +1,962 @@ +@prefix : . +@prefix as: . +@prefix owl: . +@prefix rdf: . +@prefix xml: . +@prefix xsd: . +@prefix rdfs: . +@base . + + a owl:Ontology ; + rdfs:comment "Extended Activity Streams 2.0 Vocabulary"@en ; + rdfs:label "Activity Streams 2.0"@en ; + owl:imports . + +################################################################# +# +# Datatypes +# +################################################################# + +rdf:langString a rdfs:Datatype . +xsd:duration a rdfs:Datatype . + +################################################################# +# +# Object Properties +# +################################################################# + +as:actor a owl:ObjectProperty ; + rdfs:label "actor"@en ; + rdfs:domain as:Activity ; + rdfs:comment "Subproperty of as:attributedTo that identifies the primary actor"@en ; + rdfs:subPropertyOf as:attributedTo ; + rdfs:range [ + a owl:Class ; + owl:unionOf (as:Object as:Link) + ] . + +as:attributedTo a owl:ObjectProperty ; + rdfs:label "attributedTo"@en; + rdfs:comment "Identifies an entity to which an object is attributed"@en; + rdfs:range [ + a owl:Class ; + owl:unionOf (as:Object as:Link) + ] ; + rdfs:domain [ + a owl:Class ; + owl:unionOf (as:Object as:Link) + ] ; . + +as:attachment a owl:ObjectProperty ; + rdfs:label "attachment"@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Link as:Object ) + ] ; + rdfs:domain as:Object ; + owl:equivalentProperty as:attachments . + +as:attachments a owl:ObjectProperty, + owl:DeprecatedProperty ; + rdfs:label "attachments"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:author a owl:ObjectProperty, + owl:DeprecatedProperty ; + rdfs:label "author"@en ; + rdfs:comment "Identifies the author of an object. Deprecated. Use as:attributedTo instead"@en; + rdfs:domain as:Object ; + rdfs:subPropertyOf as:attributedTo ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:bcc a owl:ObjectProperty ; + rdfs:label "bcc"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:bto a owl:ObjectProperty ; + rdfs:label "bto"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:cc a owl:ObjectProperty ; + rdfs:label "cc"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:context a owl:ObjectProperty ; + rdfs:label "context"@en ; + rdfs:comment "Specifies the context within which an object exists or an activity was performed"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:current a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "current"@en ; + rdfs:domain as:Collection ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:CollectionPage as:Link ) + ] . + +as:first a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "first"@en ; + rdfs:domain as:Collection ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:CollectionPage as:Link ) + ] . + +as:generator a owl:ObjectProperty ; + rdfs:label "generator"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:icon a owl:ObjectProperty ; + rdfs:label "icon"@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Image as:Link ) + ] ; + rdfs:domain as:Object . + +as:image a owl:ObjectProperty ; + rdfs:label "image"@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Image as:Link ) + ] ; + rdfs:domain as:Object . + +as:inReplyTo a owl:ObjectProperty ; + rdfs:label "inReplyTo"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:items a owl:ObjectProperty ; + rdfs:label "items"@en ; + rdfs:domain as:Collection ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( + [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] + as:OrderedItems + ) + ] . + +as:last a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "last"@en ; + rdfs:domain as:Collection ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:CollectionPage as:Link ) + ] . + +as:location a owl:ObjectProperty ; + rdfs:label "location"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:next a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "next"@en ; + rdfs:domain as:CollectionPage ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:CollectionPage as:Link ) + ] . + +as:object a owl:ObjectProperty ; + rdfs:label "object"@en ; + rdfs:domain [ + a owl:Class ; + owl:unionOf ( as:Activity as:Relationship ) + ]; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:oneOf a owl:ObjectProperty ; + rdfs:label "oneOf"@en ; + rdfs:comment "Describes a possible exclusive answer or option for a question."@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] ; + rdfs:domain as:Question . + +as:anyOf a owl:ObjectProperty ; + rdfs:label "oneOf"@en ; + rdfs:comment "Describes a possible inclusive answer or option for a question."@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] ; + rdfs:domain as:Question . + +as:prev a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "prev"@en ; + rdfs:domain as:CollectionPage ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:CollectionPage as:Link ) + ] . + +as:preview a owl:ObjectProperty ; + rdfs:label "preview"@en ; + rdfs:domain [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:provider a owl:ObjectProperty, + owl:DeprecatedProperty ; + rdfs:label "provider"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:replies a owl:ObjectProperty ; + rdfs:label "replies"@en ; + rdfs:range as:Collection ; + rdfs:domain as:Object . + +as:result a owl:ObjectProperty ; + rdfs:label "result"@en ; + rdfs:domain as:Activity ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:audience a owl:ObjectProperty ; + rdfs:label "audience"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:partOf a owl:FunctionalProperty , + owl:ObjectProperty ; + rdfs:label "partOf"@en ; + rdfs:domain as:CollectionPage ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Collection as:Link ) + ] . + +as:tag a owl:ObjectProperty ; + rdfs:label "tag"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:tags a owl:ObjectProperty, + owl:DeprecatedProperty ; + rdfs:label "tags"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] ; + owl:equivalentProperty as:tag ;. + +as:target a owl:ObjectProperty ; + rdfs:label "target"@en ; + rdfs:domain as:Activity ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:origin a owl:ObjectProperty ; + rdfs:label "origin"@en ; + rdfs:comment "For certain activities, specifies the entity from which the action is directed."@en ; + rdfs:domain as:Activity ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:instrument a owl:ObjectProperty ; + rdfs:label "instrument"@en ; + rdfs:comment "Indentifies an object used (or to be used) to complete an activity"@en ; + rdfs:domain as:Activity ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:to a owl:ObjectProperty ; + rdfs:label "to"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] . + +as:url a owl:ObjectProperty ; + rdfs:label "url"@en ; + rdfs:comment "Specifies a link to a specific representation of the Object"@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Link owl:Thing ) + ] ; + rdfs:domain as:Object . + +as:subject a owl:FunctionalProperty, + owl:ObjectProperty; + rdfs:label "a"@en; + rdfs:comment "On a Relationship object, identifies the subject. e.g. when saying \"John is connected to Sally\", 'subject' refers to 'John'"@en ; + rdfs:domain as:Relationship ; + rdfs:subPropertyOf rdf:subject ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( as:Link as:Object ) + ]. + +as:relationship a owl:ObjectProperty; + rdfs:label "relationship"@en; + rdfs:comment "On a Relationship object, describes the type of relationship"@en; + rdfs:subPropertyOf rdf:predicate ; + rdfs:domain as:Relationship ; + rdfs:range rdf:Property . + +as:describes a owl:ObjectProperty, + owl:FunctionalProperty; + rdfs:label "describes"@en; + rdfs:comment "On a Profile object, describes the object described by the profile"@en ; + rdfs:domain as:Profile ; + rdfs:range as:Object . + +as:formerType a owl:ObjectProperty, + owl:FunctionalProperty; + rdfs:label "formerType"@en; + rdfs:comment "On a Tombstone object, describes the former type of the deleted object"@en ; + rdfs:domain as:Tombstone ; + rdfs:range as:Object . + +################################################################# +# +# Data properties +# +################################################################# + +as:accuracy a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "accuracy"@en ; + rdfs:comment "Specifies the accuracy around the point established by the longitude and latitude"@en ; + rdfs:domain as:Place ; + rdfs:range [ + a rdfs:Datatype ; + owl:onDatatype xsd:float ; + owl:withRestrictions ( + [ xsd:minInclusive "0.0"^^xsd:float ] + ) + ] . + +as:altitude a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "altitude"@en ; + rdfs:comment "The altitude of a place"@en; + rdfs:domain as:Place ; + rdfs:range xsd:float . + +as:content a owl:DatatypeProperty ; + rdfs:label "content"@en ; + rdfs:comment "The content of the object."@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( rdf:langString xsd:string ) + ] ; + rdfs:domain as:Object . + +as:name a owl:DatatypeProperty ; + rdfs:label "name"@en ; + rdfs:name "The default, plain-text display name of the object or link."@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( rdf:langString xsd:string ) + ] ; + rdfs:domain [ + a owl:Class ; + owl:unionOf ( as:Object as:Link) + ]. + +as:downstreamDuplicates a owl:DatatypeProperty, + owl:DeprecatedProperty ; + rdfs:label "downstreamDuplicates"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain as:Object . + +as:duration a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "duration"@en ; + rdfs:comment "The duration of the object"@en ; + rdfs:range xsd:duration ; + rdfs:domain as:Object . + +as:endTime a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "endTime"@en ; + rdfs:comment "The ending time of the object"@en ; + rdfs:range xsd:dateTime ; + rdfs:domain as:Object . + +as:height a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "height"@en ; + rdfs:comment "The display height expressed as device independent pixels"@en ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:domain as:Link . + +as:href a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "href"@en ; + rdfs:comment "The target URI of the Link"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain as:Link . + +as:hreflang a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "hreflang"@en ; + rdfs:comment "A hint about the language of the referenced resource"@en ; + rdfs:range xsd:language ; + rdfs:domain as:Link . + +as:id a owl:DatatypeProperty , + owl:FunctionalProperty, + owl:DeprecatedProperty ; + rdfs:label "id"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain [ + a owl:Class ; + owl:unionOf (as:Link as:Object) + ] . + +as:latitude a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "latitude"@en ; + rdfs:comment "The latitude"@en ; + rdfs:range xsd:float ; + rdfs:domain as:Place . + +as:longitude a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "longitude"@en ; + rdfs:comment "The longitude"@en ; + rdfs:range xsd:float ; + rdfs:domain as:Place . + +as:mediaType a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "mediaType"@en ; + rdfs:comment "The MIME Media Type"@en ; + rdfs:range xsd:string ; + rdfs:domain [ + a owl:Class ; + owl:unionOf (as:Link as:Object) + ] . + +as:objectType a owl:DatatypeProperty , + owl:FunctionalProperty, + owl:DeprecatedProperty ; + rdfs:label "objectType"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain as:Object . + +as:published a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "published"@en ; + rdfs:comment "Specifies the date and time the object was published"@en ; + rdfs:range xsd:dateTime ; + rdfs:domain as:Object . + +as:radius a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "radius"@en ; + rdfs:comment "Specifies a radius around the point established by the longitude and latitude"@en ; + rdfs:domain as:Place ; + rdfs:range [ + a rdfs:Datatype ; + owl:onDatatype xsd:float ; + owl:withRestrictions ( + [ xsd:minInclusive "0.0"^^xsd:float ] + ) + ] . + +as:rating a owl:DatatypeProperty , + owl:FunctionalProperty, + owl:DeprecatedProperty ; + rdfs:label "rating"@en ; + rdfs:comment "A numeric rating (>= 0.0, <= 5.0) for the object"@en ; + rdfs:domain as:Object ; + rdfs:range [ + a rdfs:Datatype ; + owl:onDatatype xsd:float ; + owl:withRestrictions ( + [ xsd:minInclusive "0.0"^^xsd:float ] + [ xsd:maxInclusive "5.0"^^xsd:float ] + )] . + +as:rel a owl:DatatypeProperty ; + rdfs:label "rel"@en ; + rdfs:comment "The RFC 5988 or HTML5 Link Relation associated with the Link"@en ; + rdfs:range xsd:string ; + rdfs:domain as:Link . + +as:startIndex a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "startIndex"@en ; + rdfs:comment "In a strictly ordered logical collection, specifies the index position of the first item in the items list"@en ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:domain as:OrderedCollectionPage . + +as:startTime a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "startTime"@en ; + rdfs:comment "The starting time of the object"@en ; + rdfs:range xsd:dateTime ; + rdfs:domain as:Object . + +as:summary a owl:DatatypeProperty ; + rdfs:label "summary"@en ; + rdfs:comment "A short summary of the object"@en ; + rdfs:range [ + a owl:Class ; + owl:unionOf ( rdf:langString xsd:string ) + ] ; + rdfs:domain as:Object . + +as:totalItems a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "totalItems"@en ; + rdfs:comment "The total number of items in a logical collection"@en ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:domain as:Collection . + +as:units a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "units"@en ; + rdfs:comment "Identifies the unit of measurement used by the radius, altitude and accuracy properties. The value can be expressed either as one of a set of predefined units or as a well-known common URI that identifies units."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + [ a rdfs:Datatype ; + owl:oneOf ( + "inches" + "feet" + "miles" + "cm" + "m" + "km" + ) + ] + xsd:anyURI ) + ] ; + rdfs:domain as:Place . + +as:updated a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "updated"@en ; + rdfs:comment "Specifies when the object was last updated"@en ; + rdfs:range xsd:dateTime ; + rdfs:domain as:Object . + +as:upstreamDuplicates a owl:DatatypeProperty, + owl:DeprecatedProperty ; + rdfs:label "upstreamDuplicates"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain as:Object . + +as:verb a owl:DatatypeProperty , + owl:FunctionalProperty, + owl:DeprecatedProperty ; + rdfs:label "verb"@en ; + rdfs:range xsd:anyURI ; + rdfs:domain as:Activity . + +as:width a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "width"@en ; + rdfs:comment "Specifies the preferred display width of the content, expressed in terms of device independent pixels."@en ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:domain as:Link . + +as:deleted a owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "deleted"@en ; + rdfs:comment "Specifies the date and time the object was deleted"@en ; + rdfs:range xsd:dateTime ; + rdfs:domain as:Tombstone . + +################################################################# +# +# Classes +# +################################################################# + +as:Accept a owl:Class ; + rdfs:label "Accept"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "Actor accepts the Object"@en . + +as:Activity a owl:Class ; + rdfs:label "Activity"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "An Object representing some form of Action that has been taken"@en . + +as:Block a owl:Class ; + rdfs:label "Block"@en ; + rdfs:subClassOf as:Ignore . + +as:IntransitiveActivity a owl:Class ; + rdfs:label "IntransitiveActivity"@en ; + rdfs:subClassOf as:Activity ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty as:object ; + owl:maxCardinality "0"^^xsd:nonNegativeInteger + ] ; + rdfs:comment "An Activity that has no direct object"@en . + +as:Add a owl:Class ; + rdfs:label "Add"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Add an Object or Link to Something"@en . + +as:Announce a owl:Class ; + rdfs:label "Announce"@en; + rdfs:subClassOf as:Activity ; + rdfs:comment "Actor announces the object to the target"@en . + +as:Application a owl:Class ; + rdfs:label "Application"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "Represents a software application of any sort"@en . + +as:Arrive a owl:Class ; + rdfs:label "Arrive"@en ; + rdfs:subClassOf as:IntransitiveActivity ; + rdfs:comment "To Arrive Somewhere (can be used, for instance, to indicate that a particular entity is currently located somewhere, e.g. a \"check-in\")"@en . + +as:Article a owl:Class ; + rdfs:label "Article"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A written work. Typically several paragraphs long. For example, a blog post or a news article."@en . + +as:Audio a owl:Class ; + rdfs:label "Audio"@en ; + rdfs:subClassOf as:Document ; + rdfs:comment "An audio file"@en . + +as:Collection a owl:Class ; + rdfs:label "Collection"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "An ordered or unordered collection of Objects or Links"@en . + +as:CollectionPage a owl:Class ; + rdfs:label "CollectionPage"@en ; + rdfs:subClassOf as:Collection ; + rdfs:comment "A subset of items from a Collection"@en . + +as:OrderedCollectionPage a owl:Class ; + rdfs:label "OrderedCollectionPage"@en; + rdfs:subClassOf as:OrderedCollection, as:CollectionPage ; + rdfs:comment "An ordered subset of items from an OrderedCollection"@en . + +as:Relationship a owl:Class, rdf:Statement ; + rdfs:label "Relationship"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "Represents a Social Graph relationship between two Individuals (indicated by the 'a' and 'b' properties)"@en . + +as:Create a owl:Class ; + rdfs:label "Create"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Create Something"@en . + +as:Delete a owl:Class ; + rdfs:label "Delete"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Delete Something"@en . + +as:Dislike a owl:Class ; + rdfs:label "Dislike"@en; + rdfs:subClassOf as:Activity ; + rdfs:comment "The actor dislikes the object"@en . + +as:Document a owl:Class ; + rdfs:label "Document"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "Represents a digital document/file of any sort"@en . + +as:Event a owl:Class ; + rdfs:label "Event"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "An Event of any kind"@en . + +as:Flag a owl:Class ; + rdfs:label "Flag"@en; + rdfs:subClassOf as:Activity ; + rdfs:comment "To flag something (e.g. flag as inappropriate, flag as spam, etc)"@en . + +as:Follow a owl:Class ; + rdfs:label "Follow"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Express Interest in Something"@en . + +as:Group a owl:Class ; + rdfs:label "Group"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A Group of any kind."@en . + +as:Ignore a owl:Class ; + rdfs:label "Ignore"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "Actor is ignoring the Object"@en . + +as:Image a owl:Class ; + rdfs:label "Image"@en ; + rdfs:subClassOf as:Document ; + rdfs:comment "An Image file"@en . + +as:Invite a owl:Class ; + rdfs:label "Invite"@en ; + rdfs:subClassOf as:Offer ; + rdfs:comment "To invite someone or something to something"@en . + +as:Join a owl:Class ; + rdfs:label "Join"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Join Something"@en . + +as:Leave a owl:Class ; + rdfs:label "Leave"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Leave Something"@en . + +as:Like a owl:Class ; + rdfs:label "Like"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Like Something"@en . + +as:View a owl:Class ; + rdfs:label "View"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "The actor viewed the object"@en . + +as:Listen a owl:Class ; + rdfs:label "Listen"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "The actor listened to the object"@en . + +as:Read a owl:Class ; + rdfs:label "Read"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "The actor read the object"@en . + +as:Move a owl:Class ; + rdfs:label "Move"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "The actor is moving the object. The target specifies where the object is moving to. The origin specifies where the object is moving from." . + +as:Travel a owl:Class ; + rdfs:label "Travel"@en ; + rdfs:subClassOf as:IntransitiveActivity ; + rdfs:comment "The actor is traveling to the target. The origin specifies where the actor is traveling from." . + +as:Link a owl:Class ; + rdfs:label "Link"@en ; + owl:disjointWith as:Object ; + rdfs:comment "Represents a qualified reference to another resource. Patterned after the RFC5988 Web Linking Model"@en . + +as:Mention a owl:Class ; + rdfs:label "Mention"@en ; + rdfs:subClassOf as:Link ; + rdfs:comment "A specialized Link that represents an @mention"@en . + +as:Note a owl:Class ; + rdfs:label "Note"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A Short note, typically less than a single paragraph. A \"tweet\" is an example, or a \"status update\""@en . + +as:Object a owl:Class ; + rdfs:label "Object"@en . + +as:Offer a owl:Class ; + rdfs:label "Offer"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Offer something to someone or something"@en . + +as:OrderedCollection a owl:Class ; + rdfs:label "OrderedCollection"@en ; + rdfs:comment "A variation of Collection in which items are strictly ordered"@en; + rdfs:subClassOf [ + a owl:Class; + owl:intersectionOf ( + as:Collection + [ + a owl:Restriction; + owl:onProperty as:items ; + owl:allValuesFrom [ + a owl:Class ; + owl:intersectionOf ( + as:OrderedItems + [ + a owl:Class ; + owl:complementOf [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] + ] + ) + ] + ] + ) + ] . + +as:OrderedItems a owl:Class ; + rdfs:label "OrderedItems"@en ; + rdfs:comment "A rdf:List variant for Objects and Links"@en ; + rdfs:subClassOf [ + a owl:Class; + owl:intersectionOf ( + rdf:List + [ + a owl:Restriction; + owl:onProperty rdf:first ; + owl:allValuesFrom [ + a owl:Class ; + owl:unionOf ( as:Object as:Link ) + ] + ] + [ + a owl:Restriction; + owl:allValuesFrom as:OrderedItems ; + owl:onProperty rdf:rest + ] + ) + ] . + +as:Page a owl:Class ; + rdfs:label "Page"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A Web Page"@en . + +as:Person a owl:Class ; + rdfs:label "Person"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A Person"@en . + +as:Organization a owl:Class ; + rdfs:label "Organization"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "An Organization"@en . + +as:Profile a owl:Class ; + rdfs:label "Profile"@en; + rdfs:subClassOf as:Object ; + rdfs:comment "A Profile Document"@en . + +as:Place a owl:Class ; + rdfs:label "Place"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A physical or logical location"@en . + +as:Question a owl:Class ; + rdfs:label "Question"@en; + rdfs:subClassOf as:IntransitiveActivity ; + rdfs:comment "A question of any sort."@en . + +as:Reject a owl:Class ; + rdfs:label "Reject"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "Actor rejects the Object"@en . + +as:Remove a owl:Class ; + rdfs:label "Remove"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Remove Something"@en . + +as:Service a owl:Class ; + rdfs:label "Service"@en ; + rdfs:subClassOf as:Object ; + rdfs:comment "A service provided by some entity"@en . + +as:TentativeAccept a owl:Class ; + rdfs:label "TentativeAccept"@en ; + rdfs:subClassOf as:Accept ; + rdfs:comment "Actor tentatively accepts the Object"@en . + +as:TentativeReject a owl:Class ; + rdfs:label "TentativeReject"@en ; + rdfs:subClassOf as:Reject ; + rdfs:comment "Actor tentatively rejects the object"@en . + +as:Tombstone a owl:Class ; + rdfs:label "Tombstone"@en; + rdfs:subClassOf as:Object ; + rdfs:comment "A placeholder for a deleted object"@en . + +as:Undo a owl:Class ; + rdfs:label "Undo"@en ; + rdfs:subClassOf as:Activity ; + rdfs:comment "To Undo Something. This would typically be used to indicate that a previous Activity has been undone."@en . + +as:Update a owl:Class ; + rdfs:label "Update"@en ; + rdfs:comment "To Update/Modify Something"@en ; + rdfs:subClassOf as:Activity . + +as:Video a owl:Class ; + rdfs:label "Video"@en ; + rdfs:comment "A Video document of any kind."@en ; + rdfs:subClassOf as:Document . + +rdf:nil a as:OrderedItems . diff --git a/tests/data/v1.owl b/tests/data/goodrelations.owl similarity index 95% rename from tests/data/v1.owl rename to tests/data/goodrelations.owl index c733c482..00e29d71 100644 --- a/tests/data/v1.owl +++ b/tests/data/goodrelations.owl @@ -15,27 +15,27 @@ - + - This property specifies the beginning of the availability of the gr:ProductOrService included in the gr:Offering. -The difference to the properties gr:validFrom and gr:validThrough is that those specify the period of time during which the offer is valid and can be accepted. - -Example: I offer to lease my boat for the period of August 1 - August 31, 2010, but you must accept by offer no later than July 15. - -A time-zone should be specified. For a time in GMT/UTC, simply add a "Z" following the time: - -2008-05-30T09:30:10Z. - -Alternatively, you can specify an offset from the UTC time by adding a positive or negative time following the time: - -2008-05-30T09:30:10-09:00 - -or - -2008-05-30T09:30:10+09:00. - + This property specifies the beginning of the availability of the gr:ProductOrService included in the gr:Offering. +The difference to the properties gr:validFrom and gr:validThrough is that those specify the period of time during which the offer is valid and can be accepted. + +Example: I offer to lease my boat for the period of August 1 - August 31, 2010, but you must accept by offer no later than July 15. + +A time-zone should be specified. For a time in GMT/UTC, simply add a "Z" following the time: + +2008-05-30T09:30:10Z. + +Alternatively, you can specify an offset from the UTC time by adding a positive or negative time following the time: + +2008-05-30T09:30:10-09:00 + +or + +2008-05-30T09:30:10+09:00. + Note: There is another property gr:availableAtOrFrom, which is used to indicate the gr:Location (e.g. store or shop) from which the goods would be available. @@ -46,18 +46,18 @@ Note: There is another property gr:availableAtOrFrom, which is used to indicate V 1.0, Release 2011-10-01 The GoodRelations ontology is available under the Creative Commons Attribution 3.0 Unported license; see http://creativecommons.org/licenses/by/3.0/. In a nutshell, you are free to copy, distribute and transmit the work; to remix/adapt the work (e.g. to import the ontology and create specializations of its elements), as long as you attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). Proper Attribution: Simply include the statement "This work is based on the GoodRelations ontology, developed by Martin Hepp" and link back to http://purl.org/goodrelations/ - The GoodRelations ontology provides the vocabulary for annotating e-commerce offerings (1) to sell, lease, repair, dispose, or maintain commodity products and (2) to provide commodity services. - -GoodRelations allows describing the relationship between (1) Web resources, (2) offerings made by those Web resources, (3) legal entities, (4) prices, (5) terms and conditions, and the aforementioned ontologies for products and services (6). - -For more information, see http://purl.org/goodrelations/ - -Note: The base URI of GoodRelations is http://purl.org/goodrelations/v1. Please make sure you are only using element identifiers in this namespace, e.g. http://purl.org/goodrelations/v1#BusinessEntity. There may be copies of the ontology file on the Web which can be retrieved from other locations, BUT THOSE LOCATIONS MUST NOT BE USED AS THE BASIS OF IDENTIFIERS. - -If you use GoodRelations for scientific purposes, please cite our paper: - -Hepp, Martin: GoodRelations: An Ontology for Describing Products and Services Offers on the Web, Proceedings of the 16th International Conference on Knowledge Engineering and Knowledge Management (EKAW2008), September 29 - October 3, 2008, Acitrezza, Italy, Springer LNCS, Vol. 5268, pp. 332-347. - + The GoodRelations ontology provides the vocabulary for annotating e-commerce offerings (1) to sell, lease, repair, dispose, or maintain commodity products and (2) to provide commodity services. + +GoodRelations allows describing the relationship between (1) Web resources, (2) offerings made by those Web resources, (3) legal entities, (4) prices, (5) terms and conditions, and the aforementioned ontologies for products and services (6). + +For more information, see http://purl.org/goodrelations/ + +Note: The base URI of GoodRelations is http://purl.org/goodrelations/v1. Please make sure you are only using element identifiers in this namespace, e.g. http://purl.org/goodrelations/v1#BusinessEntity. There may be copies of the ontology file on the Web which can be retrieved from other locations, BUT THOSE LOCATIONS MUST NOT BE USED AS THE BASIS OF IDENTIFIERS. + +If you use GoodRelations for scientific purposes, please cite our paper: + +Hepp, Martin: GoodRelations: An Ontology for Describing Products and Services Offers on the Web, Proceedings of the 16th International Conference on Knowledge Engineering and Knowledge Management (EKAW2008), September 29 - October 3, 2008, Acitrezza, Italy, Springer LNCS, Vol. 5268, pp. 332-347. + PDF at http://www.heppnetz.de/publications/ Work on the GoodRelations ontology and related research and development has been partly supported by the Austrian BMVIT/FFG under the FIT-IT Semantic Systems project myOntology (grant no. 812515/9284), by a Young Researcher's Grant (Nachwuchsfoerderung 2005-2006) from the Leopold-Franzens-Universitaet Innsbruck, by the European Commission under the project SUPER (FP6-026850), and by the German Federal Ministry of Research (BMBF) by a grant under the KMU Innovativ program as part of the Intelligent Match project (FKZ 01IS10022B). The @@ -71,7 +71,7 @@ PDF at http://www.heppnetz.de/publications/ - + @@ -85,8 +85,8 @@ PDF at http://www.heppnetz.de/publications/ - - + + @@ -100,8 +100,8 @@ PDF at http://www.heppnetz.de/publications/ - - + + @@ -128,12 +128,12 @@ PDF at http://www.heppnetz.de/publications/ - + - The serial number or any alphanumeric identifier of a particular product. Note that serial number are unique only for the same brand or the same model, so you cannot infer from two occurrences of the same serial number that the objects to which they are attached are identical. - + The serial number or any alphanumeric identifier of a particular product. Note that serial number are unique only for the same brand or the same model, so you cannot infer from two occurrences of the same serial number that the objects to which they are attached are identical. + This property can also be attached to a gr:Offering in cases where the included products are not modeled in more detail. @@ -145,13 +145,13 @@ This property can also be attached to a gr:Offering in cases where the included - - + + - The International Standard of Industrial Classification of All Economic Activities (ISIC), Revision 4 code for a particular gr:BusinessEntity or gr:Location. See http://unstats.un.org/unsd/cr/registry/isic-4.asp for more information. - + The International Standard of Industrial Classification of All Economic Activities (ISIC), Revision 4 code for a particular gr:BusinessEntity or gr:Location. See http://unstats.un.org/unsd/cr/registry/isic-4.asp for more information. + Note: While ISIC codes are sometimes misused for classifying products or services, they are designed and suited only for classifying business establishments. @@ -186,13 +186,13 @@ Note 3: If the shop re-opens on the same day of the week or set of days of the w - + - The North American Industry Classification System (NAICS) code for a particular gr:BusinessEntity. -See http://www.census.gov/eos/www/naics/ for more details. - + The North American Industry Classification System (NAICS) code for a particular gr:BusinessEntity. +See http://www.census.gov/eos/www/naics/ for more details. + Note: While NAICS codes are sometimes misused for classifying products or services, they are designed and suited only for classifying business establishments. @@ -203,7 +203,7 @@ Note: While NAICS codes are sometimes misused for classifying products or servic - + @@ -217,7 +217,7 @@ Note: While NAICS codes are sometimes misused for classifying products or servic - + has MPN (0..*) @@ -225,16 +225,16 @@ Note: While NAICS codes are sometimes misused for classifying products or servic - + - The Manufacturer Part Number or MPN is a unique identifier for a product, service, or bundle from the perspective of a particular manufacturer. MPNs can be assigned to products or product datasheets, or bundles. Accordingly, the domain of this property is the union of gr:ProductOrService (the common superclass of goods and datasheets), and gr:Offering. - -Important: Be careful when assuming two products or services instances or offering instances to be identical based on the MPN. Since MPNs are unique only for the same gr:BusinessEntity, this holds only when the two MPN values refer to the same gr:BusinessEntity. Such can be done by taking into account the provenance of the data. - -Usually, the properties gr:hasEAN_UCC-13 and gr:hasGTIN-14 are much more reliable identifiers, because they are globally unique. - + The Manufacturer Part Number or MPN is a unique identifier for a product, service, or bundle from the perspective of a particular manufacturer. MPNs can be assigned to products or product datasheets, or bundles. Accordingly, the domain of this property is the union of gr:ProductOrService (the common superclass of goods and datasheets), and gr:Offering. + +Important: Be careful when assuming two products or services instances or offering instances to be identical based on the MPN. Since MPNs are unique only for the same gr:BusinessEntity, this holds only when the two MPN values refer to the same gr:BusinessEntity. Such can be done by taking into account the provenance of the data. + +Usually, the properties gr:hasEAN_UCC-13 and gr:hasGTIN-14 are much more reliable identifiers, because they are globally unique. + See also http://en.wikipedia.org/wiki/Part_number @@ -246,8 +246,8 @@ See also http://en.wikipedia.org/wiki/Part_number - - + + @@ -274,15 +274,15 @@ See also http://en.wikipedia.org/wiki/Part_number - - - - + + + + The name of a category to which this gr:ProductOrService, gr:Offering, gr:BusinessEntity, or gr:Location belongs. - + Note 1: For products, it is better to add an rdf:type statement referring to a GoodRelations-compliant ontology for vertical industries instead, but if you just have a short text label, gr:category is simpler. Note 2: You can use greater signs or slashes to informally indicate a category hierarchy, e.g. "restaurants/asian_restaurants" or "cables > usb_cables" @@ -295,7 +295,7 @@ Note 2: You can use greater signs or slashes to informally indicate a category h - + @@ -309,27 +309,27 @@ Note 2: You can use greater signs or slashes to informally indicate a category h - + - This property specifies the end of the availability of the gr:ProductOrService included in the gr:Offering. -The difference to the properties gr:validFrom and gr:validThrough is that those specify the period of time during which the offer is valid and can be accepted. - -Example: I offer to lease my boat for the period of August 1 - August 31, 2010, but you must accept by offer no later than July 15. - -A time-zone should be specified. For a time in GMT/UTC, simply add a "Z" following the time: - -2008-05-30T09:30:10Z. - -Alternatively, you can specify an offset from the UTC time by adding a positive or negative time following the time: - -2008-05-30T09:30:10-09:00 - -or - -2008-05-30T09:30:10+09:00. - + This property specifies the end of the availability of the gr:ProductOrService included in the gr:Offering. +The difference to the properties gr:validFrom and gr:validThrough is that those specify the period of time during which the offer is valid and can be accepted. + +Example: I offer to lease my boat for the period of August 1 - August 31, 2010, but you must accept by offer no later than July 15. + +A time-zone should be specified. For a time in GMT/UTC, simply add a "Z" following the time: + +2008-05-30T09:30:10Z. + +Alternatively, you can specify an offset from the UTC time by adding a positive or negative time following the time: + +2008-05-30T09:30:10-09:00 + +or + +2008-05-30T09:30:10+09:00. + Note: There is another property gr:availableAtOrFrom, which is used to indicate the gr:Location (e.g. store or shop) from which the goods would be available. @@ -340,7 +340,7 @@ Note: There is another property gr:availableAtOrFrom, which is used to indicate - + @@ -360,12 +360,12 @@ Note: There is another property gr:availableAtOrFrom, which is used to indicate - + - This property specifies the current approximate inventory level for gr:SomeItems. The unit of measurement and the point value or interval are indicated using the attached gr:QuantitativeValueFloat instance. - + This property specifies the current approximate inventory level for gr:SomeItems. The unit of measurement and the point value or interval are indicated using the attached gr:QuantitativeValueFloat instance. + This property can also be attached to a gr:Offering in cases where the included products are not modeled in more detail. @@ -376,7 +376,7 @@ This property can also be attached to a gr:Offering in cases where the included - + @@ -395,7 +395,7 @@ This property can also be attached to a gr:Offering in cases where the included - + @@ -412,7 +412,7 @@ This property can also be attached to a gr:Offering in cases where the included - + @@ -431,7 +431,7 @@ or Note 1: If multiple contradicting instances of a gr:Offering, gr:PriceSpecification, or gr:OpeningHoursSpecification exist, it is a good heuristics to assume that 1. Information with validity information for the respective period of time ranks higher than information without validity information. 2. Among conflicting nodes both having validity information, the one with the shorter validity span ranks higher. -Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpecification is mandatory. +Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpecification is mandatory. @@ -454,7 +454,7 @@ Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpeci - + @@ -522,13 +522,13 @@ Note 3: If the shop re-opens on the same day of the week or set of days of the w - + - The minimal and maximal amount of time that is required between accepting the gr:Offering and the actual usage of the resource or service. This is mostly relevant for offers regarding hotel rooms, the rental of objects, or the provisioning of services. The duration is specified relatively to the beginning of the usage of the contracted object. It is represented by attaching an instance of the class gr:QuantitativeValueInteger. The lower and upper boundaries are specified using the properties gr:hasMinValueInteger and gr:hasMaxValueInteger to that instance. The unit of measurement is specified using the property gr:hasUnitOfMeasurement with a string holding a UN/CEFACT code suitable for durations, e.g. MON (months), DAY (days), HUR (hours), or MIN (minutes). - -The difference to the gr:validFrom and gr:validThrough properties is that those specify the interval during which the gr:Offering is valid, while gr:advanceBookingRequirement specifies the acceptable relative amount of time between accepting the offer and the fulfilment or usage. + The minimal and maximal amount of time that is required between accepting the gr:Offering and the actual usage of the resource or service. This is mostly relevant for offers regarding hotel rooms, the rental of objects, or the provisioning of services. The duration is specified relatively to the beginning of the usage of the contracted object. It is represented by attaching an instance of the class gr:QuantitativeValueInteger. The lower and upper boundaries are specified using the properties gr:hasMinValueInteger and gr:hasMaxValueInteger to that instance. The unit of measurement is specified using the property gr:hasUnitOfMeasurement with a string holding a UN/CEFACT code suitable for durations, e.g. MON (months), DAY (days), HUR (hours), or MIN (minutes). + +The difference to the gr:validFrom and gr:validThrough properties is that those specify the interval during which the gr:Offering is valid, while gr:advanceBookingRequirement specifies the acceptable relative amount of time between accepting the offer and the fulfillment or usage. @@ -539,12 +539,12 @@ The difference to the gr:validFrom and gr:validThrough properties is that those - + - This property can be used to indicate the transaction volume, in a monetary unit, for which the gr:Offering or gr:PriceSpecification is valid. This is mostly used to specify a minimal purchasing volume, to express free shipping above a certain order volume, or to limit the acceptance of credit cards to purchases above a certain amount. - + This property can be used to indicate the transaction volume, in a monetary unit, for which the gr:Offering or gr:PriceSpecification is valid. This is mostly used to specify a minimal purchasing volume, to express free shipping above a certain order volume, or to limit the acceptance of credit cards to purchases above a certain amount. + The object is a gr:PriceSpecification that uses the properties gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue to indicate the lower and upper boundaries and gr:hasCurrency to indicate the currency using the ISO 4217 standard (3 characters). @@ -563,12 +563,12 @@ The object is a gr:PriceSpecification that uses the properties gr:hasMaxCurrency - - + + - The Global Location Number (GLN, sometimes also referred to as International Location Number or ILN) of the respective gr:BusinessEntity or gr:Location. + The Global Location Number (GLN, sometimes also referred to as International Location Number or ILN) of the respective gr:BusinessEntity or gr:Location. The Global Location Number is a thirteen-digit number used to identify parties and physical locations. @@ -576,21 +576,21 @@ The Global Location Number is a thirteen-digit number used to identify parties a is variant of (0..1) - This states that a particular gr:ProductOrServiceModel is a variant of another product or service model. It is pretty safe to infer that the variant inherits all gr:quantitativeProductOrServiceProperty, gr:qualitativeProductOrServiceProperty, and gr:datatypeProductOrServiceProperty values that are defined for the first gr:ProductOrServiceModel. - -Example: + This states that a particular gr:ProductOrServiceModel is a variant of another product or service model. It is pretty safe to infer that the variant inherits all gr:quantitativeProductOrServiceProperty, gr:qualitativeProductOrServiceProperty, and gr:datatypeProductOrServiceProperty values that are defined for the first gr:ProductOrServiceModel. + +Example: foo:Red_Ford_T_Model gr:isVariantOf foo:Ford_T_Model - + has GTIN-8 (0..*) - + @@ -599,8 +599,8 @@ foo:Red_Ford_T_Model gr:isVariantOf foo:Ford_T_Model - In case of a defect or malfunction, the buying party has the right to request from the selling gr:Business Entity to pick-up the good from its current location to a suitable service location, where the functionality of the good will be restored. All transportation, labor, parts, and materials needed to fix the problem will be covered by the selling business entity or one of its partnering business entities. - + In case of a defect or malfunction, the buying party has the right to request from the selling gr:Business Entity to pick-up the good from its current location to a suitable service location, where the functionality of the good will be restored. All transportation, labor, parts, and materials needed to fix the problem will be covered by the selling business entity or one of its partnering business entities. + Note: This is just a rough classification for filtering offers. It is up to the buying party to check the exact scope and terms and conditions of the gr:WarrantyPromise. Parts and labor / pick up (warranty scope) @@ -612,12 +612,12 @@ Note: This is just a rough classification for filtering offers. It is up to the - + - This links a gr:Offering to a gr:PriceSpecification or specifications. There can be unit price specifications, payment charge specifications, and delivery charge specifications. For each type, multiple specifications for the same gr:Offering are possible, e.g. for different quantity ranges or for different currencies, or for different combinations of gr:DeliveryMethod and target destinations. - + This links a gr:Offering to a gr:PriceSpecification or specifications. There can be unit price specifications, payment charge specifications, and delivery charge specifications. For each type, multiple specifications for the same gr:Offering are possible, e.g. for different quantity ranges or for different currencies, or for different combinations of gr:DeliveryMethod and target destinations. + Recommended retail prices etc. can be marked by the gr:priceType property of the gr:UnitPriceSpecification. @@ -633,11 +633,11 @@ Recommended retail prices etc. can be marked by the gr:priceType property of the - + - The depth of the product. + The depth of the product. Typical unit code(s): CMT for centimeters, INH for inches @@ -648,7 +648,7 @@ Typical unit code(s): CMT for centimeters, INH for inches - + @@ -684,7 +684,7 @@ Typical unit code(s): CMT for centimeters, INH for inches - + @@ -693,7 +693,7 @@ Typical unit code(s): CMT for centimeters, INH for inches - + @@ -704,7 +704,7 @@ Typical unit code(s): CMT for centimeters, INH for inches - + @@ -743,8 +743,8 @@ Typical unit code(s): CMT for centimeters, INH for inches - A short textual description of the resource. - + A short textual description of the resource. + This property is semantically equivalent to rdfs:comment and just meant as a handy shortcut for marking up data. @@ -769,13 +769,13 @@ This property is semantically equivalent to rdfs:comment and just meant as a han billing increment (0..1) - This property specifies the minimal quantity and rounding increment that will be the basis for the billing. -The unit of measurement is specified by the UN/CEFACT code attached to the gr:UnitPriceSpecification via the gr:hasUnitOfMeasurement property. - -Examples: -- The price for gasoline is 4 USD per gallon at the pump, but you will be charged in units of 0.1 gallons. -- The price for legal consulting is 100 USD per hour, but you will be charged in units of 15 minutes. - + This property specifies the minimal quantity and rounding increment that will be the basis for the billing. +The unit of measurement is specified by the UN/CEFACT code attached to the gr:UnitPriceSpecification via the gr:hasUnitOfMeasurement property. + +Examples: +- The price for gasoline is 4 USD per gallon at the pump, but you will be charged in units of 0.1 gallons. +- The price for legal consulting is 100 USD per hour, but you will be charged in units of 15 minutes. + This property makes sense only for instances of gr:Offering that include not more than one type of good or service. @@ -783,7 +783,7 @@ This property makes sense only for instances of gr:Offering that include not mor is list price (DEPRECATED) - This boolean attribute indicates whether a gr:UnitPriceSpecification is a list price (usually a vendor recommendation) or not. "true" indicates it is a list price, "false" indicates it is not. + This boolean attribute indicates whether a gr:UnitPriceSpecification is a list price (usually a vendor recommendation) or not. "true" indicates it is a list price, "false" indicates it is not. DEPRECATED. Use the gr:priceType property instead. true @@ -795,7 +795,7 @@ DEPRECATED. Use the gr:priceType property instead. - + @@ -809,12 +809,12 @@ DEPRECATED. Use the gr:priceType property instead. - + - This property is the super property for all pure datatype properties that can be used to describe a gr:ProductOrService. - + This property is the super property for all pure datatype properties that can be used to describe a gr:ProductOrService. + In products and services ontologies, only such properties that are no quantitative properties and that have no predefined gr:QualitativeValue instances are subproperties of this property. In practice, this refers to a few integer properties for which the integer value represents qualitative aspects, for string datatypes (as long as no predefined values exist), for boolean datatype properties, and for dates and times. @@ -827,7 +827,7 @@ In products and services ontologies, only such properties that are no quantitati - + @@ -841,7 +841,7 @@ In products and services ontologies, only such properties that are no quantitati - + @@ -869,39 +869,39 @@ In products and services ontologies, only such properties that are no quantitati - + - This property can be used to indicate the promised delay between the receipt of the order and the goods leaving the warehouse. - + This property can be used to indicate the promised delay between the receipt of the order and the goods leaving the warehouse. + The duration is specified by attaching an instance of gr:QuantitativeValueInteger. The lower and upper boundaries are specified using the properties gr:hasMinValueInteger and gr:hasMaxValueInteger to that instance. A point value can be modeled with the gr:hasValueInteger property. The unit of measurement is specified using the property gr:hasUnitOfMeasurement with a string holding a UN/CEFACT code suitable for durations, e.g. MON (months), DAY (days), HUR (hours), or MIN (minutes). - + has Stock Keeping Unit (0..*) - - + + - The Stock Keeping Unit, or SKU is a unique identifier for a product, service, or bundle from the perspective of a particular supplier, i.e. SKUs are mostly assigned and serialized at the merchant level. -Examples of SKUs are the ordering or parts numbers used by a particular Web shop or catalog. - -Consequently, the domain of gr:hasStockKeepingUnit is the union of the classes gr:Offering and gr:ProductOrService. -If attached to a gr:Offering, the SKU will usually reflect a merchant-specific identifier, i.e. one valid only for that particular retailer or shop. -If attached to a gr:ProductOrServiceModel, the SKU can reflect either the identifier used by the merchant or the part number used by the official manufacturer of that part. For the latter, gr:hasMPN is a better choice. - -Important: Be careful when assuming two products or services instances or offering instances to be identical based on the SKU. Since SKUs are unique only for the same gr:BusinessEntity, this can be assumed only when you are sure that the two SKU values refer to the same business entity. Such can be done by taking into account the provenance of the data. As long as instances of gr:Offering are concerned, you can also check that the offerings are being offered by the same gr:Business Entity. - -Usually, the properties gr:hasEAN_UCC-13 and gr:hasGTIN-14 are much more reliable identifiers, because they are globally unique. - + The Stock Keeping Unit, or SKU is a unique identifier for a product, service, or bundle from the perspective of a particular supplier, i.e. SKUs are mostly assigned and serialized at the merchant level. +Examples of SKUs are the ordering or parts numbers used by a particular Web shop or catalog. + +Consequently, the domain of gr:hasStockKeepingUnit is the union of the classes gr:Offering and gr:ProductOrService. +If attached to a gr:Offering, the SKU will usually reflect a merchant-specific identifier, i.e. one valid only for that particular retailer or shop. +If attached to a gr:ProductOrServiceModel, the SKU can reflect either the identifier used by the merchant or the part number used by the official manufacturer of that part. For the latter, gr:hasMPN is a better choice. + +Important: Be careful when assuming two products or services instances or offering instances to be identical based on the SKU. Since SKUs are unique only for the same gr:BusinessEntity, this can be assumed only when you are sure that the two SKU values refer to the same business entity. Such can be done by taking into account the provenance of the data. As long as instances of gr:Offering are concerned, you can also check that the offerings are being offered by the same gr:Business Entity. + +Usually, the properties gr:hasEAN_UCC-13 and gr:hasGTIN-14 are much more reliable identifiers, because they are globally unique. + See also http://en.wikipedia.org/wiki/Stock_Keeping_Unit. @@ -913,7 +913,7 @@ See also http://en.wikipedia.org/wiki/Stock_Keeping_Unit. - + @@ -931,7 +931,7 @@ See also http://en.wikipedia.org/wiki/Stock_Keeping_Unit. - + @@ -952,13 +952,13 @@ See also http://en.wikipedia.org/wiki/Stock_Keeping_Unit. includes (0..1) - This object property is a shortcut for the original gr:includesObject property for the common case of having exactly one single gr:ProductOrService instance included in an Offering. - -When linking to an instance of gr:SomeItems or gr:Individual, it is equivalent to using a gr:TypeAndQuantityNode with gr:hasUnitOfMeasurement="C62"^^xsd:string and gr:amountOfThisGood="1.0"^^xsd:float for that good. - -When linking to a gr:ProductOrServiceModel, it is equivalent to -1. defining an blank node for a gr:SomeItems -2. linking that blank node via gr:hasMakeAndModel to the gr:ProductOrServiceModel, and + This object property is a shortcut for the original gr:includesObject property for the common case of having exactly one single gr:ProductOrService instance included in an Offering. + +When linking to an instance of gr:SomeItems or gr:Individual, it is equivalent to using a gr:TypeAndQuantityNode with gr:hasUnitOfMeasurement="C62"^^xsd:string and gr:amountOfThisGood="1.0"^^xsd:float for that good. + +When linking to a gr:ProductOrServiceModel, it is equivalent to +1. defining an blank node for a gr:SomeItems +2. linking that blank node via gr:hasMakeAndModel to the gr:ProductOrServiceModel, and 3. linking from the gr:Offering to that blank node using another blank node of type gr:TypeAndQuantityNode with gr:hasUnitOfMeasurement="C62"^^xsd:string and gr:amountOfThisGood="1.0"^^xsd:float for that good. @@ -1006,8 +1006,8 @@ When linking to a gr:ProductOrServiceModel, it is equivalent to - - + + @@ -1015,7 +1015,7 @@ When linking to a gr:ProductOrServiceModel, it is equivalent to - Payment by bank transfer in advance, i.e., the offering gr:BusinessEntity will inform the buying party about their bank account details and will deliver the goods upon receipt of the due amount. + Payment by bank transfer in advance, i.e., the offering gr:BusinessEntity will inform the buying party about their bank account details and will deliver the goods upon receipt of the due amount. This is equivalent to payment by wire transfer. By bank transfer in advance (payment method) @@ -1024,8 +1024,8 @@ This is equivalent to payment by wire transfer. has opening hours day of week (1..*) - This specifies the gr:DayOfWeek to which the gr:OpeningHoursSpecification is related. - + This specifies the gr:DayOfWeek to which the gr:OpeningHoursSpecification is related. + Note: Use multiple instances of gr:OpeningHoursSpecification for specifying the opening hours for multiple days if the opening hours differ. @@ -1033,12 +1033,12 @@ Note: Use multiple instances of gr:OpeningHoursSpecification for specifying the price type (0..1) - This attribute can be used to distinguish multiple different price specifications for the same gr:Offering. It supersedes the former gr:isListPrice property. The following values are recommended: - -The absence of this property marks the actual sales price. - -SRP: "suggested retail price" - applicable for all sorts of a non-binding retail price recommendations, e.g. such published by the manufacturer or the distributor. This value replaces the former gr:isListPrice property. - + This attribute can be used to distinguish multiple different price specifications for the same gr:Offering. It supersedes the former gr:isListPrice property. The following values are recommended: + +The absence of this property marks the actual sales price. + +SRP: "suggested retail price" - applicable for all sorts of a non-binding retail price recommendations, e.g. such published by the manufacturer or the distributor. This value replaces the former gr:isListPrice property. + INVOICE: The invoice price, mostly used in the car industry - this is the price a dealer pays to the manufacturer, excluding rebates and charges. @@ -1057,12 +1057,12 @@ INVOICE: The invoice price, mostly used in the car industry - this is the price - + - This property specifies the geo-political region or regions for which the gr:Offering, gr:License, or gr:DeliveryChargeSpecification is valid using the two-character version of ISO 3166-1 (ISO 3166-1 alpha-2) for regions or ISO 3166-2 , which breaks down the countries from ISO 3166-1 into administrative subdivisions. - + This property specifies the geo-political region or regions for which the gr:Offering, gr:License, or gr:DeliveryChargeSpecification is valid using the two-character version of ISO 3166-1 (ISO 3166-1 alpha-2) for regions or ISO 3166-2 , which breaks down the countries from ISO 3166-1 into administrative subdivisions. + Important: Do NOT use 3-letter ISO 3166-1 codes! @@ -1102,7 +1102,7 @@ Important: Do NOT use 3-letter ISO 3166-1 codes! - + @@ -1144,7 +1144,7 @@ Note: If multiple contradicting instances of a gr:Offering, gr:PriceSpecificatio Check in advance (payment method) - + @@ -1183,8 +1183,8 @@ Note: If multiple contradicting instances of a gr:Offering, gr:PriceSpecificatio - A short text describing the respective resource. - + A short text describing the respective resource. + This property is semantically equivalent to dcterms:title and rdfs:label and just meant as a handy shortcut for marking up data. @@ -1197,7 +1197,7 @@ This property is semantically equivalent to dcterms:title and rdfs:label and jus - + @@ -1205,14 +1205,14 @@ This property is semantically equivalent to dcterms:title and rdfs:label and jus - + has GTIN-14 (0..*) - + @@ -1229,12 +1229,12 @@ This property is semantically equivalent to dcterms:title and rdfs:label and jus has currency value (0..1) - This property specifies the amount of money for a price per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. - -For a gr:UnitPriceSpecification, this is the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the price per delivery or payment. - -GoodRelations also supports giving price information as intervals only. If this is needed, use gr:hasMaxCurrencyValue for the upper bound and gr:hasMinCurrencyValue for the lower bound. - + This property specifies the amount of money for a price per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. + +For a gr:UnitPriceSpecification, this is the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the price per delivery or payment. + +GoodRelations also supports giving price information as intervals only. If this is needed, use gr:hasMaxCurrencyValue for the upper bound and gr:hasMinCurrencyValue for the lower bound. + Using gr:hasCurrencyValue sets the upper and lower bounds to the same given value, i.e., x gr:hasCurrencyValue y implies x gr:hasMinCurrencyValue y, x gr:hasMaxCurrencyValue y. @@ -1242,9 +1242,9 @@ Using gr:hasCurrencyValue sets the upper and lower bounds to the same given valu has min currency value (1..1) - This property specifies the LOWER BOUND of the amount of money for a price RANGE per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. -For a gr:UnitPriceSpecification, this is the LOWER BOUND for the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the LOWER BOUND of the price per delivery or payment. - + This property specifies the LOWER BOUND of the amount of money for a price RANGE per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. +For a gr:UnitPriceSpecification, this is the LOWER BOUND for the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the LOWER BOUND of the price per delivery or payment. + Using gr:hasCurrencyValue sets the upper and lower bounds to the same given value, i.e., x gr:hasCurrencyValue y implies x gr:hasMinCurrencyValue y, x gr:hasMaxCurrencyValue y. @@ -1254,9 +1254,9 @@ Using gr:hasCurrencyValue sets the upper and lower bounds to the same given valu has max currency value (1..1) - This property specifies the UPPER BOUND of the amount of money for a price RANGE per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. -For a gr:UnitPriceSpecification, this is the UPPER BOUND for the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the UPPER BOUND of the price per delivery or payment. - + This property specifies the UPPER BOUND of the amount of money for a price RANGE per unit, shipping charges, or payment charges. The currency and other relevant details are attached to the respective gr:PriceSpecification etc. +For a gr:UnitPriceSpecification, this is the UPPER BOUND for the price for one unit or bundle (as specified in the unit of measurement of the unit price specification) of the respective gr:ProductOrService. For a gr:DeliveryChargeSpecification or a gr:PaymentChargeSpecification, it is the UPPER BOUND of the price per delivery or payment. + Using gr:hasCurrencyValue sets the upper and lower bounds to the same given value, i.e., x gr:hasCurrencyValue y implies x gr:hasMinCurrencyValue y, x gr:hasMaxCurrencyValue y. @@ -1270,7 +1270,7 @@ Using gr:hasCurrencyValue sets the upper and lower bounds to the same given valu - This gr:BusinessFunction indicates that the gr:BusinessEntity is in general interested in purchasing the specified gr:ProductOrService. + This gr:BusinessFunction indicates that the gr:BusinessEntity is in general interested in purchasing the specified gr:ProductOrService. DEPRECATED. Use gr:seeks instead. true @@ -1284,18 +1284,18 @@ DEPRECATED. Use gr:seeks instead. - + - This states that an actual product instance (gr:Individual) or a placeholder instance for multiple, unidentified such instances (gr:SomeItems) is one occurence of a particular gr:ProductOrServiceModel. - + This states that an actual product instance (gr:Individual) or a placeholder instance for multiple, unidentified such instances (gr:SomeItems) is one occurrence of a particular gr:ProductOrServiceModel. + Example: myFordT hasMakeAndModel FordT. - In case of a defect or malfunction, the buying party has the right to transport the good to a service location determined by the the selling gr:BusinessEntity and will not be be charged for labor, parts, and materials needed to fix the problem. All those costs will be covered by the selling business entity or one of its partnering business entities. - + In case of a defect or malfunction, the buying party has the right to transport the good to a service location determined by the the selling gr:BusinessEntity and will not be be charged for labor, parts, and materials needed to fix the problem. All those costs will be covered by the selling business entity or one of its partnering business entities. + Note: This is just a rough classification for filtering offers. It is up to the buying party to check the exact scope and terms and conditions of the gr:WarrantyPromise. Parts and labor / bring-in (warranty scope) @@ -1306,8 +1306,8 @@ Note: This is just a rough classification for filtering offers. It is up to the Enduser (business entity type) - The URI of a SOAP or REST Web Service from which additional information about the gr:BusinessEntity, gr:Offering, gr:PriceSpecification, or gr:ProductOrService, or any other element, can be obtained. The recommended range is xsd:anyURI i.e., the URI of a SOAP or REST Web Service. - + The URI of a SOAP or REST Web Service from which additional information about the gr:BusinessEntity, gr:Offering, gr:PriceSpecification, or gr:ProductOrService, or any other element, can be obtained. The recommended range is xsd:anyURI i.e., the URI of a SOAP or REST Web Service. + In principle, any existing or upcoming vocabulary for Web Services can be used in combination with GoodRelations, because the association between (a) the service description and (b) the GoodRelations description can be found via the Web Service URI value used with this gr:relatedWebService property. related Web Service (0..*) @@ -1322,8 +1322,8 @@ In principle, any existing or upcoming vocabulary for Web Services can be used i value added tax included (0..1) - This property specifies whether the applicable value-added tax (VAT) is included in the price of the gr:PriceSpecification or not. - + This property specifies whether the applicable value-added tax (VAT) is included in the price of the gr:PriceSpecification or not. + Note: This is a simple representation which may not properly reflect all details of local taxation. @@ -1334,7 +1334,7 @@ Note: This is a simple representation which may not properly reflect all details - + @@ -1349,12 +1349,12 @@ Note: This is a simple representation which may not properly reflect all details - + This specifies the business function of the gr:Offering, i.e. whether the gr:BusinessEntity is offering to sell, to lease, or to repair the particular type of product. In the case of bundles, it is also possible to attach individual business functions to each gr:TypeAndQuantityNode. The business function of the main gr:Offering determines the business function for all included objects or services, unless a business function attached to a gr:TypeAndQuantityNode overrides it. - + Note: While it is possible that an entity is offering multiple types of business functions for the same set of objects (e.g. rental and sales), this should usually not be stated by attaching multiple business functions to the same gr:Offering, since the gr:UnitPriceSpecification for the varying business functions will typically be very different. @@ -1380,11 +1380,11 @@ Note: Rely on this property only for data originating from a single RDF graph; o - + - The weight of the gr:ProductOrService. + The weight of the gr:ProductOrService. Typical unit code(s): GRM for gram, KGM for kilogram, LBR for pound @@ -1396,7 +1396,7 @@ Typical unit code(s): GRM for gram, KGM for kilogram, LBR for pound - + @@ -1405,27 +1405,27 @@ Typical unit code(s): GRM for gram, KGM for kilogram, LBR for pound - + has EAN/UCC-13 (0..*) - + - The EAN·UCC-13 code of the given gr:ProductOrService or gr:Offering. This code is now officially called GTIN-13 (Global Trade Identifier Number) or EAN·UCC-13. Former 12-digit UPC codes can be converted into EAN·UCC-13 code by simply adding a preceeding zero. - -Note 1: When using this property for searching by 12-digit UPC codes, you must add a preceeding zero digit. + The EAN·UCC-13 code of the given gr:ProductOrService or gr:Offering. This code is now officially called GTIN-13 (Global Trade Identifier Number) or EAN·UCC-13. Former 12-digit UPC codes can be converted into EAN·UCC-13 code by simply adding a preceding zero. + +Note 1: When using this property for searching by 12-digit UPC codes, you must add a preceding zero digit. Note 2: As of January 1, 2007, the former ISBN numbers for books etc. have been integrated into the EAN·UCC-13 code. For each old ISBN-10 code, there exists a proper translation into EAN·UCC-13 by adding "978" or "979" as prefix. Since the old ISBN-10 is now deprecated, GoodRelations does not provide a property for ISBNs. - This is the superclass for all classes that are placeholders for n-ary relations, which OWL cannot represent. + This is the superclass for all classes that are placeholders for n-ary relations, which OWL cannot represent. DEPRECATED. Do not use this class in data or queries. true @@ -1442,8 +1442,8 @@ DEPRECATED. Do not use this class in data or queries. - In case of a defect or malfunction, the buying party has the right to transport the good to a service location determined by the the selling gr:BusinessEntity and will be charged only for parts and materials needed to fix the problem. Labor will be covered by the selling business entity or one of its partnering business entities. - + In case of a defect or malfunction, the buying party has the right to transport the good to a service location determined by the the selling gr:BusinessEntity and will be charged only for parts and materials needed to fix the problem. Labor will be covered by the selling business entity or one of its partnering business entities. + Note: This is just a rough classification for filtering offers. It is up to the buying party to check the exact scope and terms and conditions of the gr:WarrantyPromise. Labor / bring-in (warranty scope) @@ -1455,11 +1455,11 @@ Note: This is just a rough classification for filtering offers. It is up to the - + - The height of the product. + The height of the product. Typical unit code(s): CMT for centimeters, INH for inches @@ -1471,11 +1471,11 @@ Typical unit code(s): CMT for centimeters, INH for inches - + - The width of the gr:ProductOrService. + The width of the gr:ProductOrService. Typical unit code(s): CMT for centimeters, INH for inches @@ -1493,15 +1493,15 @@ Typical unit code(s): CMT for centimeters, INH for inches - + - This specifies the interval and unit of measurement of ordering quantities for which the gr:Offering or gr:PriceSpecification is valid. This allows e.g. specifying that a certain freight charge is valid only for a certain quantity. + This specifies the interval and unit of measurement of ordering quantities for which the gr:Offering or gr:PriceSpecification is valid. This allows e.g. specifying that a certain freight charge is valid only for a certain quantity. Note that if an offering is a bundle, i.e. it consists of more than one unit of a single type of good, or if the unit of measurement for the good is different from unit (Common Code C62), then gr:hasEligibleQuantity refers to units of this bundle. In other words, "C62" for "Units or pieces" is usually the appropriate unit of measurement. - + @@ -1520,12 +1520,12 @@ Note that if an offering is a bundle, i.e. it consists of more than one unit of - + - The minimal and maximal duration for which the given gr:Offering or gr:License is valid. This is mostly used for offers regarding accommodation, the rental of objects, or software licenses. The duration is specified by attaching an instance of gr:QuantitativeValue. The lower and upper boundaries are specified using the properties gr:hasMinValue and gr:hasMaxValue to that instance. If they are the same, use the gr:hasValue property. The unit of measurement is specified using the property gr:hasUnitOfMeasurement with a string holding a UN/CEFACT code suitable for durations, e.g. MON (months), DAY (days), HUR (hours), or MIN (minutes). - + The minimal and maximal duration for which the given gr:Offering or gr:License is valid. This is mostly used for offers regarding accommodation, the rental of objects, or software licenses. The duration is specified by attaching an instance of gr:QuantitativeValue. The lower and upper boundaries are specified using the properties gr:hasMinValue and gr:hasMaxValue to that instance. If they are the same, use the gr:hasValue property. The unit of measurement is specified using the property gr:hasUnitOfMeasurement with a string holding a UN/CEFACT code suitable for durations, e.g. MON (months), DAY (days), HUR (hours), or MIN (minutes). + The difference to the gr:validFrom and gr:validThrough properties is that those specify the absiolute interval during which the gr:Offering or gr:License is valid, while gr:eligibleDuration specifies the acceptable duration of the contract or usage. @@ -1551,7 +1551,7 @@ The difference to the gr:validFrom and gr:validThrough properties is that those - + @@ -1559,7 +1559,7 @@ The difference to the gr:validFrom and gr:validThrough properties is that those - The gr:BusinessEntityType representing such agents that are part of the adminstration or owned by the public. + The gr:BusinessEntityType representing such agents that are part of the administration or owned by the public. Public institution (business entity type) @@ -1579,10 +1579,10 @@ The difference to the gr:validFrom and gr:validThrough properties is that those Direct debit (payment method) - This gr:BusinessFunction indicates that the gr:BusinessEntity offers (or seeks) the respective type of service. - -Note: Maintain and Repair are also types of Services. However, products and services ontologies often provide classes for tangible products as well as for types of services. The business function gr:ProvideService is to be used with such goods that are services, while gr:Maintain and gr:Repair can be used with goods for which only the class of product exists in the ontology, but not the respective type of service. - + This gr:BusinessFunction indicates that the gr:BusinessEntity offers (or seeks) the respective type of service. + +Note: Maintain and Repair are also types of Services. However, products and services ontologies often provide classes for tangible products as well as for types of services. The business function gr:ProvideService is to be used with such goods that are services, while gr:Maintain and gr:Repair can be used with goods for which only the class of product exists in the ontology, but not the respective type of service. + Example: Car maintenance could be expressed both as "provide the service car maintenance" or "maintain cars". Provide service (business function) @@ -1601,15 +1601,15 @@ Example: Car maintenance could be expressed both as "provide the service car mai - - + + - This property indicates that a particular person or business owns a particular product. It can be used to expose the products in one's posession in order to empower recommender systems to suggest matching offers. - -Note that the product must be an instance of the class gr:Individual. - + This property indicates that a particular person or business owns a particular product. It can be used to expose the products in one's possession in order to empower recommender systems to suggest matching offers. + +Note that the product must be an instance of the class gr:Individual. + This property can also be safely applied to foaf:Agent instances. @@ -1640,7 +1640,7 @@ This property can also be safely applied to foaf:Agent instances. - + @@ -1654,7 +1654,7 @@ This property can also be safely applied to foaf:Agent instances. - + @@ -1664,7 +1664,7 @@ This property can also be safely applied to foaf:Agent instances. A license is the specification of a bundle of rights that determines the type of activity or access offered by the gr:BusinessEntity on the gr:ProductOrService through the gr:Offering. - + Licenses can be standardized (e.g. LPGL, Creative Commons, ...), vendor-specific, or individually defined for a single offer or product. Whether there is a fee for obtaining the license is specified using the gr:UnitPriceSpecification attached to the gr:Offering. Use foaf:page for linking to a document containing the license, e.g. in PDF or HTML. @@ -1697,8 +1697,8 @@ Licenses can be standardized (e.g. LPGL, Creative Commons, ...), vendor-specific 3 - A business entity type is a conceptual entity representing the legal form, the size, the main line of business, the position in the value chain, or any combination thereof, of a gr:BusinessEntity. From the ontological point of view, business entity types are mostly roles that a business entity has in the market. Business entity types are important for specifying eligible customers, since a gr:Offering is often valid only for business entities of a certain size, legal structure, or role in the value chain. - + A business entity type is a conceptual entity representing the legal form, the size, the main line of business, the position in the value chain, or any combination thereof, of a gr:BusinessEntity. From the ontological point of view, business entity types are mostly roles that a business entity has in the market. Business entity types are important for specifying eligible customers, since a gr:Offering is often valid only for business entities of a certain size, legal structure, or role in the value chain. + Examples: Consumers, Retailers, Wholesalers, or Public Institutions Business entity type @@ -1755,12 +1755,12 @@ Examples: Consumers, Retailers, Wholesalers, or Public Institutions Location A location is a point or area of interest from which a particular product or service is available, e.g. a store, a bus stop, a gas station, or a ticket booth. The difference to gr:BusinessEntity is that the gr:BusinessEntity is the legal entity (e.g. a person or corporation) making the offer, while gr:Location is the store, office, or place. A chain restaurant will e.g. have one legal entity but multiple restaurant locations. Locations are characterized by an address or geographical position and a set of opening hour specifications for various days of the week. - -Example: A rental car company may offer the Business Function Lease Out of cars from two locations, one in Fort Myers, Florida, and one in Boston, Massachussetts. Both stations are open 7:00 - 23:00 Mondays through Saturdays. + +Example: A rental car company may offer the Business Function Lease Out of cars from two locations, one in Fort Myers, Florida, and one in Boston, Massachusetts. Both stations are open 7:00 - 23:00 Mondays through Saturdays. Note: Typical address standards (vcard) and location data (geo, WGC84) should be attached to a gr:Location node. Since there already exist established vocabularies for this, the GoodRelations ontology does not provide respective attributes. Instead, the use of respective vocabularies is recommended. However, the gr:hasGlobalLocationNumber property is provided for linking to public identifiers for business locations. - -Compatibility with schema.org: This class is equivalent to http://schema.org/Place. + +Compatibility with schema.org: This class is equivalent to https://schema.org/Place. @@ -1771,8 +1771,8 @@ Compatibility with schema.org: This class is equivalent to http://schema.org/Pla true - A payment method is a standardized procedure for transferring the monetary amount for a purchase. Payment methods are characterized by the legal and technical structures used, and by the organization or group carrying out the transaction. This element is mostly used for specifying the types of payment accepted by a gr:BusinessEntity. - + A payment method is a standardized procedure for transferring the monetary amount for a purchase. Payment methods are characterized by the legal and technical structures used, and by the organization or group carrying out the transaction. This element is mostly used for specifying the types of payment accepted by a gr:BusinessEntity. + Examples: VISA, MasterCard, Diners, cash, or bank transfer in advance. Payment method @@ -1792,8 +1792,8 @@ Examples: VISA, MasterCard, Diners, cash, or bank transfer in advance. - A delivery method is a standardized procedure for transferring the product or service to the destination of fulfilment chosen by the customer. Delivery methods are characterized by the means of transportation used, and by the organization or group that is the contracting party for the sending gr:BusinessEntity (this is important, since the contracted party may subcontract the fulfilment to smaller, regional businesses). - + A delivery method is a standardized procedure for transferring the product or service to the destination of fulfillment chosen by the customer. Delivery methods are characterized by the means of transportation used, and by the organization or group that is the contracting party for the sending gr:BusinessEntity (this is important, since the contracted party may subcontract the fulfillment to smaller, regional businesses). + Examples: Delivery by mail, delivery by direct download, delivery by UPS Delivery method @@ -1814,8 +1814,8 @@ Examples: Delivery by mail, delivery by direct download, delivery by UPS - A private parcel service as the delivery mode available for a certain offering. - + A private parcel service as the delivery mode available for a certain offering. + Examples: UPS, DHL @@ -1826,15 +1826,15 @@ Examples: UPS, DHL Delivery charge specification - A delivery charge specification is a conceptual entity that specifies the additional costs asked for the delivery of a given gr:Offering using a particular gr:DeliveryMethod by the respective gr:BusinessEntity. A delivery charge specification is characterized by (1) a monetary amount per order, specified as a literal value of type float in combination with a currency, (2) the delivery method, (3) the target country or region, and (4) whether this charge includes local sales taxes, namely VAT. -A gr:Offering may be linked to multiple gr:DeliveryChargeSpecification nodes that specify alternative charges for disjoint combinations of target countries or regions, and delivery methods. - -Examples: Delivery by direct download is free of charge worldwide, delivery by UPS to Germany is 10 Euros per order, delivery by mail within the US is 5 Euros per order. - -The total amount of this charge is specified as a float value of the gr:hasCurrencyValue property. The currency is specified via the gr:hasCurrency datatype property. Whether the price includes VAT or not is indicated by the gr:valueAddedTaxIncluded property. The gr:DeliveryMethod to which this charge applies is specified using the gr:appliesToDeliveryMethod object property. The region or regions to which this charge applies is specified using the gr:eligibleRegions property, which uses ISO 3166-1 and ISO 3166-2 codes. - -If the price can only be given as a range, use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue for the upper and lower bounds. - + A delivery charge specification is a conceptual entity that specifies the additional costs asked for the delivery of a given gr:Offering using a particular gr:DeliveryMethod by the respective gr:BusinessEntity. A delivery charge specification is characterized by (1) a monetary amount per order, specified as a literal value of type float in combination with a currency, (2) the delivery method, (3) the target country or region, and (4) whether this charge includes local sales taxes, namely VAT. +A gr:Offering may be linked to multiple gr:DeliveryChargeSpecification nodes that specify alternative charges for disjoint combinations of target countries or regions, and delivery methods. + +Examples: Delivery by direct download is free of charge worldwide, delivery by UPS to Germany is 10 Euros per order, delivery by mail within the US is 5 Euros per order. + +The total amount of this charge is specified as a float value of the gr:hasCurrencyValue property. The currency is specified via the gr:hasCurrency datatype property. Whether the price includes VAT or not is indicated by the gr:valueAddedTaxIncluded property. The gr:DeliveryMethod to which this charge applies is specified using the gr:appliesToDeliveryMethod object property. The region or regions to which this charge applies is specified using the gr:eligibleRegions property, which uses ISO 3166-1 and ISO 3166-2 codes. + +If the price can only be given as a range, use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue for the upper and lower bounds. + Important: When querying for the price, always use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue. @@ -1856,34 +1856,34 @@ Important: When querying for the price, always use gr:hasMaxCurrencyValue and gr - - + + Business entity An instance of this class represents the legal agent making (or seeking) a particular offering. This can be a legal body or a person. A business entity has at least a primary mailing address and contact details. For this, typical address standards (vCard) and location data (geo, WGS84) can be attached. Note that the location of the business entity is not necessarily the location from which the product or service is being available (e.g. the branch or store). Use gr:Location for stores and branches. - + Example: Siemens Austria AG, Volkswagen Ltd., Peter Miller's Cell phone Shop LLC -Compatibility with schema.org: This class is equivalent to the union of http://schema.org/Person and http://schema.org/Organization. +Compatibility with schema.org: This class is equivalent to the union of https://schema.org/Person and https://schema.org/Organization. - + Quantitative value integer - An instance of this class is an actual integer value for a quantitative property of a product. This instance is usually characterized by a minimal value, a maximal value, and a unit of measurement. - -Example: A seating capacity between 1 and 8 persons. - + An instance of this class is an actual integer value for a quantitative property of a product. This instance is usually characterized by a minimal value, a maximal value, and a unit of measurement. + +Example: A seating capacity between 1 and 8 persons. + Note: Users must keep in mind that ranges in here mean that ALL possible values in this interval are covered. (Sometimes, the actual commitment may be less than that: "We sell cars from 2 - 12 seats" does often not really mean that they have cars with 2,3,4,...12 seats.). Someone renting out two types of rowing boats, one that fits for 1 or 2 people, and another that must be operated by 4 people cannot claim to rent boats with a seating capacity between 1 and 4 people. He or she is offering two boat types for 1-2 and 4 persons. - -Compatibility with schema.org: This class is a subclass of http://schema.org/Quantity. + +Compatibility with schema.org: This class is a subclass of https://schema.org/Quantity. @@ -1944,20 +1944,20 @@ Compatibility with schema.org: This class is a subclass of http://schema.org/Qua successor of (0..*) - This property indicates that the subject is a newer, often updated or improved variant of the gr:ProductOrServiceModel used as the object. - -Example: Golf III successorOf Golf II - + This property indicates that the subject is a newer, often updated or improved variant of the gr:ProductOrServiceModel used as the object. + +Example: Golf III successorOf Golf II + This relation is transitive. predecessor of (0..*) - This property indicates that the subject is a previous, often discontinued variant of the gr:ProductOrServiceModel used as the object. - -Example: Golf III predecessorOf Golf IV - + This property indicates that the subject is a previous, often discontinued variant of the gr:ProductOrServiceModel used as the object. + +Example: Golf III predecessorOf Golf IV + This relation is transitive. @@ -1987,12 +1987,12 @@ This relation is transitive. 7 - + - + @@ -2003,8 +2003,8 @@ This relation is transitive. Examples: Ford T, Volkswagen Golf, Sony Ericsson W123 cell phone Note: An actual product or service (gr:Individual) by default shares the features of its model (e.g. the weight). However, this requires non-standard reasoning. See http://wiki.goodrelations-vocabulary.org/Axioms for respective rule sets. - -Compatibility with schema.org: This class is (approximately) a subclass of http://schema.org/Product. + +Compatibility with schema.org: This class is (approximately) a subclass of https://schema.org/Product. @@ -2012,15 +2012,15 @@ Compatibility with schema.org: This class is (approximately) a subclass of http: Payment charge specification - A payment charge specification is a conceptual entity that specifies the additional costs asked for settling the payment after accepting a given gr:Offering using a particular gr:PaymentMethod. A payment charge specification is characterized by (1) a monetary amount per order specified as a literal value of type float in combination with a Currency, (2) the payment method, and (3) a whether this charge includes local sales taxes, namely VAT. -A gr:Offering may be linked to multiple payment charge specifications that specify alternative charges for various payment methods. - -Examples: Payment by VISA or Mastercard costs a fee of 3 Euros including VAT, payment by bank transfer in advance is free of charge. - -The total amount of this surcharge is specified as a float value of the gr:hasCurrencyValue property. The currency is specified via the gr:hasCurrency datatype property. Whether the price includes VAT or not is indicated by the gr:valueAddedTaxIncluded datatype property. The gr:PaymentMethod to which this charge applies is specified using the gr:appliesToPaymentMethod object property. - -If the price can only be given as a range, use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue for the upper and lower bounds. - + A payment charge specification is a conceptual entity that specifies the additional costs asked for settling the payment after accepting a given gr:Offering using a particular gr:PaymentMethod. A payment charge specification is characterized by (1) a monetary amount per order specified as a literal value of type float in combination with a Currency, (2) the payment method, and (3) a whether this charge includes local sales taxes, namely VAT. +A gr:Offering may be linked to multiple payment charge specifications that specify alternative charges for various payment methods. + +Examples: Payment by VISA or Mastercard costs a fee of 3 Euros including VAT, payment by bank transfer in advance is free of charge. + +The total amount of this surcharge is specified as a float value of the gr:hasCurrencyValue property. The currency is specified via the gr:hasCurrency datatype property. Whether the price includes VAT or not is indicated by the gr:valueAddedTaxIncluded datatype property. The gr:PaymentMethod to which this charge applies is specified using the gr:appliesToPaymentMethod object property. + +If the price can only be given as a range, use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue for the upper and lower bounds. + Important: When querying for the price, always use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue. @@ -2029,23 +2029,23 @@ Important: When querying for the price, always use gr:hasMaxCurrencyValue and gr Unit price specification - A unit price specification is a conceptual entity that specifies the price asked for a given gr:Offering by the respective gr:Business Entity. An offering may be linked to multiple unit price specifications that specify alternative prices for non-overlapping sets of conditions (e.g. quantities or sales regions) or with differing validity periods. + A unit price specification is a conceptual entity that specifies the price asked for a given gr:Offering by the respective gr:Business Entity. An offering may be linked to multiple unit price specifications that specify alternative prices for non-overlapping sets of conditions (e.g. quantities or sales regions) or with differing validity periods. A unit price specification is characterized by (1) the lower and upper limits and the unit of measurement of the eligible quantity, (2) by a monetary amount per unit of the product or service, and (3) whether this prices includes local sales taxes, namely VAT. - + Example: The price, including VAT, for 1 kg of a given material is 5 Euros per kg for 0 - 5 kg and 4 Euros for quantities above 5 kg. The eligible quantity interval for a given price is specified using the object property gr:hasEligibleQuantity, which points to an instance of gr:QuantitativeValue. The currency is specified using the gr:hasCurrency property, which points to an ISO 4217 currency code. The unit of measurement for the eligible quantity is specified using the gr:hasUnitOfMeasurement datatype property, which points to an UN/CEFACT Common Code (3 characters). - + In most cases, the appropriate unit of measurement is the UN/CEFACT Common Code "C62" for "Unit or piece", since a gr:Offering is defined by the quantity and unit of measurement of all items included (e.g. "1 kg of bananas plus a 2 kg of apples"). As long at the offering consists of only one item, it is also possible to use an unit of measurement of choice for specifying the price per unit. For bundles, however, only "C62" for "Unit or piece" is a valid unit of measurement. You can assume that the price is given per unit or piece if there is no gr:hasUnitOfMeasurement property attached to the price. - + Whether VAT and sales taxes are included in this price is specified using the property gr:valueAddedTaxIncluded (xsd:boolean). - + The price per unit of measurement is specified as a float value of the gr:hasCurrencyValue property. The currency is specified via the gr:hasCurrency datatype property. Whether the price includes VAT or not is indicated by the gr:valueAddedTaxIncluded datatype property. -The property priceType can be used to indicate that the price is a retail price recommendation only (i.e. a list price). +The property priceType can be used to indicate that the price is a retail price recommendation only (i.e. a list price). If the price can only be given as a range, use gr:hasMaxCurrencyValue and gr:hasMinCurrencyValue for the upper and lower bounds. @@ -2053,11 +2053,11 @@ Important: When querying for the price, always use gr:hasMaxCurrencyValue and gr Note 1: Due to the complexity of pricing scenarios in various industries, it may be necessary to create extensions of this fundamental model of price specifications. Such can be done easily by importing and refining the GoodRelations ontology. -Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpecification is mandatory. +Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpecification is mandatory. - + @@ -2068,26 +2068,26 @@ Note 2: For Google, attaching a gr:validThrough statement to a gr:UnitPriceSpeci has previous (0..1) - This ordering relation for gr:DayOfWeek indicates that the subject is directly preceeded by the object. - -Example: Tuesday hasPrevious Monday - + This ordering relation for gr:DayOfWeek indicates that the subject is directly preceded by the object. + +Example: Tuesday hasPrevious Monday + Since days of the week are a cycle, this property is not transitive. has next (0..1) - This ordering relation for gr:DayOfWeek indicates that the subject is directly followed by the object. - -Example: Monday hasNext Tuesday - + This ordering relation for gr:DayOfWeek indicates that the subject is directly followed by the object. + +Example: Monday hasNext Tuesday + Since days of the week are a cycle, this property is not transitive. - The warranty scope represents types of services that will be provided free of charge by the vendor or manufacturer in the case of a defect (e.g. labor and parts, just parts), as part of the warranty included in an gr:Offering. The actual services may be provided by the gr:BusinessEntity making the offering, by the manufacturer of the product, or by a third party. - + The warranty scope represents types of services that will be provided free of charge by the vendor or manufacturer in the case of a defect (e.g. labor and parts, just parts), as part of the warranty included in an gr:Offering. The actual services may be provided by the gr:BusinessEntity making the offering, by the manufacturer of the product, or by a third party. + Examples: Parts and Labor, Parts Warranty scope @@ -2107,14 +2107,14 @@ Examples: Parts and Labor, Parts - + - This is a conceptual entity that holds together all aspects of the n-ary relation gr:hasWarrantyPromise. - -A Warranty promise is an entity representing the duration and scope of services that will be provided to a customer free of charge in case of a defect or malfunction of the gr:ProductOrService. A warranty promise is characterized by its temporal duration (usually starting with the date of purchase) and its gr:WarrantyScope. The warranty scope represents the types of services provided (e.g. labor and parts, just parts) of the warranty included in an gr:Offering. The actual services may be provided by the gr:BusinessEntity making the offering, by the manufacturer of the product, or by a third party. There may be multiple warranty promises associated with a particular offering, which differ in duration and scope (e.g. pick-up service during the first 12 months, just parts and labor for 36 months). - + This is a conceptual entity that holds together all aspects of the n-ary relation gr:hasWarrantyPromise. + +A Warranty promise is an entity representing the duration and scope of services that will be provided to a customer free of charge in case of a defect or malfunction of the gr:ProductOrService. A warranty promise is characterized by its temporal duration (usually starting with the date of purchase) and its gr:WarrantyScope. The warranty scope represents the types of services provided (e.g. labor and parts, just parts) of the warranty included in an gr:Offering. The actual services may be provided by the gr:BusinessEntity making the offering, by the manufacturer of the product, or by a third party. There may be multiple warranty promises associated with a particular offering, which differ in duration and scope (e.g. pick-up service during the first 12 months, just parts and labor for 36 months). + Examples: 12 months parts and labor, 36 months parts Warranty promise @@ -2135,8 +2135,8 @@ Examples: 12 months parts and labor, 36 months parts - The subclass of gr:PaymentMethod represents all variants and brands of credit or debit cards as a standardized procedure for transferring the monetary amount for a purchase. It is mostly used for specifying the types of payment accepted by a gr:Business Entity. - + The subclass of gr:PaymentMethod represents all variants and brands of credit or debit cards as a standardized procedure for transferring the monetary amount for a purchase. It is mostly used for specifying the types of payment accepted by a gr:Business Entity. + Examples: VISA, MasterCard, or American Express. @@ -2144,7 +2144,7 @@ Examples: VISA, MasterCard, or American Express. - + @@ -2156,12 +2156,12 @@ Examples: MyThinkpad T60, the pint of beer standing in front of me, my Volkswage Note 1: In many cases, product or service instances are not explicitly exposed on the Web but only claimed to exist (i.e. existentially quantified). In this case, use gr:SomeItems. Note 2: This class is the new, shorter form of the former gr:ActualProductOrServiceInstance. -Compatibility with schema.org: This class is a subclass of http://schema.org/Product. +Compatibility with schema.org: This class is a subclass of https://schema.org/Product. - The day of the week, used to specify to which day the opening hours of a gr:OpeningHoursSpecification refer. - + The day of the week, used to specify to which day the opening hours of a gr:OpeningHoursSpecification refer. + Examples: Monday, Tuesday, Wednesday,... Day of week @@ -2193,15 +2193,15 @@ Examples: Monday, Tuesday, Wednesday,... Quantitative value float - An instance of this class is an actual float value for a quantitative property of a product. This instance is usually characterized by a minimal value, a maximal value, and a unit of measurement. - -Examples: The intervals "between 10.0 and 25.4 kilogramms" or "10.2 and 15.5 milimeters". + An instance of this class is an actual float value for a quantitative property of a product. This instance is usually characterized by a minimal value, a maximal value, and a unit of measurement. -Compatibility with schema.org: This class is a subclass of http://schema.org/Quantity. +Examples: The intervals "between 10.0 and 25.4 kilogramms" or "10.2 and 15.5 millimeters". + +Compatibility with schema.org: This class is a subclass of https://schema.org/Quantity. - A brand is the identity of a specific product, service, or business. Use foaf:logo for attaching a brand logo and gr:name or rdfs:label for attaching the brand name. + A brand is the identity of a specific product, service, or business. Use foaf:logo for attaching a brand logo and gr:name or rdfs:label for attaching the brand name. (Source: Wikipedia, the free encyclopedia, see http://en.wikipedia.org/wiki/Brand) @@ -2223,13 +2223,13 @@ Compatibility with schema.org: This class is a subclass of http://schema.org/Qua - A qualitative value is a predefined value for a product characteristic. - + A qualitative value is a predefined value for a product characteristic. + Examples: the color "green" or the power cord plug type "US"; the garment sizes "S", "M", "L", and "XL". - + Note: Value sets are supported by creating subclasses of this class. Ordinal relations between values (gr:greater, gr:lesser, ...) are provided directly by GoodRelations. -Compatibility with schema.org: This class is equivalent to http://schema.org/Enumeration. +Compatibility with schema.org: This class is equivalent to https://schema.org/Enumeration. Qualitative value @@ -2255,14 +2255,14 @@ Compatibility with schema.org: This class is equivalent to http://schema.org/Enu This ordering relation for qualitative values indicates that the subject is greater than or equal to the object. - + - The business function specifies the type of activity or access (i.e., the bundle of rights) offered by the gr:BusinessEntity on the gr:ProductOrService through the gr:Offering. Typical are sell, rental or lease, maintenance or repair, manufacture / produce, recycle / dispose, engineering / construction, or installation. - -Licenses and other proprietary specifications of access rights are also instances of this class. - + The business function specifies the type of activity or access (i.e., the bundle of rights) offered by the gr:BusinessEntity on the gr:ProductOrService through the gr:Offering. Typical are sell, rental or lease, maintenance or repair, manufacture / produce, recycle / dispose, engineering / construction, or installation. + +Licenses and other proprietary specifications of access rights are also instances of this class. + Examples: A particular offering made by Miller Rentals Ltd. says that they (1) sell Volkswagen Golf convertibles, (2) lease out a particular Ford pick-up truck, and (3) dispose car wrecks of any make and model. Business function @@ -2315,10 +2315,10 @@ Example: An offering may include of 100g of Butter and 1 kg of potatoes, or 1 ce A quantitative value is a numerical interval that represents the range of a certain gr:quantitativeProductOrServiceProperty in terms of the lower and upper bounds for a particular gr:ProductOrService. It is to be interpreted in combination with the respective unit of measurement. Most quantitative values are intervals even if they are in practice often treated as a single point value. - -Example: a weight between 10 and 25 kilogramms, a length between 10 and 15 milimeters. -Compatibility with schema.org: This class is equivalent to http://schema.org/Quantity. +Example: a weight between 10 and 25 kilogramms, a length between 10 and 15 millimeters. + +Compatibility with schema.org: This class is equivalent to https://schema.org/Quantity. Quantitative value @@ -2341,14 +2341,14 @@ Compatibility with schema.org: This class is equivalent to http://schema.org/Qua The superclass of all classes describing products or services types, either by nature or purpose. Examples for such subclasses are "TV set", "vacuum cleaner", etc. An instance of this class can be either an actual product or service (gr:Individual), a placeholder instance for unknown instances of a mass-produced commodity (gr:SomeItems), or a model / prototype specification (gr:ProductOrServiceModel). When in doubt, use gr:SomeItems. -Examples: +Examples: a) MyCellphone123, i.e. my personal, tangible cell phone (gr:Individual) b) Siemens1234, i.e. the Siemens cell phone make and model 1234 (gr:ProductOrServiceModel) c) dummyCellPhone123 as a placeholder for actual instances of a certain kind of cell phones (gr:SomeItems) - + Note: Your first choice for specializations of gr:ProductOrService should be http://www.productontology.org. -Compatibility with schema.org: This class is (approximately) equivalent to http://schema.org/Product. +Compatibility with schema.org: This class is (approximately) equivalent to https://schema.org/Product. Product or service @@ -2365,16 +2365,16 @@ Compatibility with schema.org: This class is (approximately) equivalent to http: - An offering represents the public, not necessarily binding, not necessarily exclusive, announcement by a gr:BusinessEntity to provide (or seek) a certain gr:BusinessFunction for a certain gr:ProductOrService to a specified target audience. An offering is specified by the type of product or service or bundle it refers to, what business function is being offered (sales, rental, ...), and a set of commercial properties. It can either refer to + An offering represents the public, not necessarily binding, not necessarily exclusive, announcement by a gr:BusinessEntity to provide (or seek) a certain gr:BusinessFunction for a certain gr:ProductOrService to a specified target audience. An offering is specified by the type of product or service or bundle it refers to, what business function is being offered (sales, rental, ...), and a set of commercial properties. It can either refer to (1) a clearly specified instance (gr:Individual), (2) to a set of anonymous instances of a given type (gr:SomeItems), -(3) a product model specification (gr:ProductOrServiceModel), see also section 3.3.3 of the GoodRelations Technical Report. +(3) a product model specification (gr:ProductOrServiceModel), see also section 3.3.3 of the GoodRelations Technical Report. An offering may be constrained in terms of the eligible type of business partner, countries, quantities, and other commercial properties. The definition of the commercial properties, the type of product offered, and the business function are explained in other parts of this vocabulary in more detail. Example: Peter Miller offers to repair TV sets made by Siemens, Volkswagen Innsbruck sells a particular instance of a Volkswagen Golf at $10,000. -Compatibility with schema.org: This class is a superclass to http://schema.org/Offer, since gr:Offering can also represent demand. +Compatibility with schema.org: This class is a superclass to https://schema.org/Offer, since gr:Offering can also represent demand. Offering @@ -2396,7 +2396,7 @@ Compatibility with schema.org: This class is a superclass to http://schema.org/O - + @@ -2406,8 +2406,8 @@ Compatibility with schema.org: This class is a superclass to http://schema.org/O Example: An instance of this class can represent an anonymous set of green Siemens1234 phones. It is different from the gr:ProductOrServiceModel Siemens1234, since this refers to the make and model, and it is different from a particular instance of this make and model (e.g. my individual phone) since the latter can be sold only once. Note: This class is the new, shorter form of the former gr:ProductOrServicesSomeInstancesPlaceholder. - -Compatibility with schema.org: This class is (approximately) a subclass of http://schema.org/Product. + +Compatibility with schema.org: This class is (approximately) a subclass of https://schema.org/Product. diff --git a/tests/data/schema.rdf b/tests/data/schema.rdf new file mode 100644 index 00000000..7a33ff43 --- /dev/null +++ b/tests/data/schema.rdf @@ -0,0 +1,19284 @@ + + + + + + The date and time the reservation was modified. + modifiedTime + + + + productionDate + + The date of production of the item, e.g. vehicle. + + + + + The highest price of all offers available.\n\nUsage guidelines:\n\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + + + + highPrice + + + + + The Tax / Fiscal ID of the organization or person, e.g. the TIN in the US or the CIF/NIF in Spain. + + taxID + + + + + identifier + The identifier property represents any kind of identifier for any kind of [[Thing]], such as ISBNs, GTIN codes, UUIDs etc. Schema.org provides dedicated properties for representing many of these, either as textual strings or as URL (URI) links. See [background notes](/docs/datamodel.html#identifierBg) for more details. + + + + + + + + + + securityScreening + The type of security screening the passenger is subject to. + + + + + musicReleaseFormat + Format of this release (the type of recording media used, ie. compact disc, digital media, LP, etc.). + + + + + + ElectronicsStore + An electronics store. + + + + + + returnShippingFeesAmount + Amount of shipping costs for product returns (for any reason). Applicable when property [[returnFees]] equals [[ReturnShippingFees]]. + + + + + + bankAccountType + + + + + + The type of a bank account. + + + The name displayed in the channel guide. For many US affiliates, it is the network name. + + broadcastDisplayName + + + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + UserTweets + + + + negativeNotes + + + + Indicates, in the context of a [[Review]] (e.g. framed as 'pro' vs 'con' considerations), negative considerations - either as unstructured text, or a list. + + + + + + + + + A cardholder benefit that pays the cardholder a small percentage of their net expenditures. + + + cashBack + + + + The individual who adds color to inked drawings. + + + + + + colorist + + + + loanPaymentAmount + The amount of money to pay in a single payment. + + + + + + + Florist + + A florist. + + + constrainingProperty + + + Indicates a property used as a constraint to define a [[StatisticalPopulation]] with respect to the set of entities + corresponding to an indicated type (via [[populationType]]). + + + + + The act of expressing a negative sentiment about the object. An agent dislikes an object (a proposition, topic or theme) with participants. + DislikeAction + + + + + + typicalCreditsPerTerm + + + + The number of credits or units a full-time student would be expected to take in 1 term however 'term' is defined by the institution. + + + bloodSupply + + + The blood vessel that carries blood from the heart to the muscle. + + + + + + Oncologic + A specific branch of medical science that deals with benign and malignant tumors, including the study of their development, diagnosis, treatment and prevention. + + + bodyLocation + + + + + Location in the body of the anatomical structure. + + + Text of a notice appropriate for describing the copyright aspects of this Creative Work, ideally indicating the owner of the copyright for the Work. + copyrightNotice + + + + + + + AllWheelDriveConfiguration + + All-wheel Drive is a transmission layout where the engine drives all four wheels. + + + SocialEvent + + Event type: Social event. + + + A medical device used for therapeutic purposes. + + Therapeutic + + + honorificSuffix + + + An honorific suffix following a Person's name such as M.D. /PhD/MSCSW. + + + Endocrine + A specific branch of medical science that pertains to diagnosis and treatment of disorders of endocrine glands and their secretions. + + + + + A Buddhist temple. + BuddhistTemple + + + WPSideBar + A sidebar section of the page. + + + + + + + A schematic image showing the floorplan layout. + + + An image of the item. This can be a [[URL]] or a fully described [[ImageObject]]. + image + + + + + + + layoutImage + + + + This property specifies the minimal quantity and rounding increment that will be the basis for the billing. The unit of measurement is specified by the unitCode property. + + billingIncrement + + + + + + + cvdNumTotBeds + numtotbeds - ALL HOSPITAL BEDS: Total number of all Inpatient and outpatient beds, including all staffed,ICU, licensed, and overflow (surge) beds used for inpatients or outpatients. + + + + + Ear function assessment with clinical examination. + + Ear + + + + GeneralContractor + A general contractor. + + + + PerformingArtsTheater + A theater or other performing art center. + + + orderItemNumber + + + The identifier of the order item. + + + + An elementary school. + ElementarySchool + + + A nurse-like health profession that deals with pregnancy, childbirth, and the postpartum period (including care of the newborn), besides sexual and reproductive health of women throughout their lives. + Midwifery + + + + + processorRequirements + + + Processor architecture required to run the application (e.g. IA64). + + + + The eventAttendanceMode of an event indicates whether it occurs online, offline, or a mix. + + + eventAttendanceMode + + + + + + A floor limit is the amount of money above which credit card transactions must be authorized. + + + + floorLimit + + + + + + + estimatedSalary + An estimated salary for a job posting or occupation, based on a variety of variables including, but not limited to industry, job title, and location. Estimated salaries are often computed by outside organizations rather than the hiring organization, who may not have committed to the estimated value. + + + + + Cardiovascular system assessment withclinical examination. + CardiovascularExam + + + + duplicateTherapy + + + A therapy that duplicates or overlaps this one. + + + + + accessCode + + Password, PIN, or access code needed for delivery (e.g. from a locker). + + + + + + + startOffset + + + The start time of the clip expressed as the number of seconds from the beginning of the work. + + + + worksFor + + Organizations that the person works for. + + + Nonprofit501c23: Non-profit type referring to Veterans Organizations. + Nonprofit501c23 + + + + + OverviewHealthAspect + Overview of the content. Contains a summarized view of the topic with the most relevant information for an introduction. + + + + + + + + jobStartDate + + The date on which a successful applicant for this job would be expected to start work. Choose a specific date in the future or use the jobImmediateStart property to indicate the position is to be filled as soon as possible. + + + + + Nonprofit501c4: Non-profit type referring to Civic Leagues, Social Welfare Organizations, and Local Associations of Employees. + + Nonprofit501c4 + + + + + + + + + The beginning of the availability of the product or service included in the offer. + availabilityStarts + + + + + + requirements + + + + + + softwareRequirements + Component dependency requirements for application. This includes runtime environments and shared libraries that are not included in the application distribution package, but required to run the application (Examples: DirectX, Java or .NET runtime). + + + + + Component dependency requirements for application. This includes runtime environments and shared libraries that are not included in the application distribution package, but required to run the application (Examples: DirectX, Java or .NET runtime). + + + + + returnPolicyCountry + + + The country where the product has to be sent to for returns, for example "Ireland" using the [[name]] property of [[Country]]. You can also provide the two-letter [ISO 3166-1 alpha-2 country code](http://en.wikipedia.org/wiki/ISO_3166-1). Note that this can be different from the country where the product was originally shipped from or sent too. + + + + teaches + + + + + + + + The item being described is intended to help a person learn the competency or learning outcome defined by the referenced term. + + + + StudioAlbum + StudioAlbum. + + + + + + Quantitative measure gauging the degree of force involved in the exercise, for example, heartbeats per minute. May include the velocity of the movement. + + intensity + + + Specifies that product returns are not permitted. + + MerchantReturnNotPermitted + + + + VinylFormat + VinylFormat. + + + + + The predominant type or kind characterizing the learning resource. For example, 'presentation', 'handout'. + + + + learningResourceType + + + The 10th percentile value. + percentile10 + + + + + + + + + + The taxonomic grouping of the organism that expresses, encodes, or in someway related to the BioChemEntity. + + + taxonomicRange + + + + + + + + Biological process this BioChemEntity is involved in; please use PropertyValue if you want to include any evidence. + + + isInvolvedInBiologicalProcess + + + + Organization offering the job position. + + hiringOrganization + + + + The overall order the items in this delivery were included in. + partOfOrder + + + + Are in-store returns offered? (for more advanced return methods use the [[returnMethod]] property) + + + + inStoreReturnsOffered + + + + discountCurrency + The currency of the discount.\n\nUse standard formats: [ISO 4217 currency format](http://en.wikipedia.org/wiki/ISO_4217) e.g. "USD"; [Ticker symbol](https://en.wikipedia.org/wiki/List_of_cryptocurrencies) for cryptocurrencies e.g. "BTC"; well known names for [Local Exchange Tradings Systems](https://en.wikipedia.org/wiki/Local_exchange_trading_system) (LETS) and other currency types e.g. "Ithaca HOUR". + + + + + + + tool + + A sub property of instrument. An object used (but not consumed) when performing instructions or a direction. + + + + + instrument + The object that helped the agent perform the action. e.g. John wrote a book with *a pen*. + + + + + + ResumeAction + The act of resuming a device or application which was formerly paused (e.g. resume music playback or resume a timer). + + + + WPFooter + + The footer section of the page. + + + + + + + + + position + + The position of an item in a series or sequence of items. + + + + + + volumeNumber + + Identifies the volume of publication or multi-part work; for example, "iii" or "2". + + + maximumAttendeeCapacity + + + The total number of individuals that may attend an event or venue. + + + + + + + + object + + + The object upon which the action is carried out, whose state is kept intact or changed. Also known as the semantic roles patient, affected or undergoer (which change their state) or theme (which doesn't). e.g. John read *a book*. + + + + + + A sub property of object. The collection target of the action. + + + targetCollection + + + collection + A sub property of object. The collection target of the action. + + + + + + + + Indicates a correction to a [[CreativeWork]], either via a [[CorrectionComment]], textually or in another document. + + + correction + + + ReturnShippingFees + + + Specifies that the customer must pay the return shipping costs when returning a product + + + + Motorcycle + + A motorcycle or motorbike is a single-track, two-wheeled motor vehicle. + + + + + + + The floor level for an [[Accommodation]] in a multi-storey building. Since counting + systems [vary internationally](https://en.wikipedia.org/wiki/Storey#Consecutive_number_floor_designations), the local system should be used where possible. + + floorLevel + + + underName + + + + + The person or organization the reservation or ticket is for. + + + The currency accepted.\n\nUse standard formats: [ISO 4217 currency format](http://en.wikipedia.org/wiki/ISO_4217) e.g. "USD"; [Ticker symbol](https://en.wikipedia.org/wiki/List_of_cryptocurrencies) for cryptocurrencies e.g. "BTC"; well known names for [Local Exchange Tradings Systems](https://en.wikipedia.org/wiki/Local_exchange_trading_system) (LETS) and other currency types e.g. "Ithaca HOUR". + currenciesAccepted + + + + + CoOp + Play mode: CoOp. Co-operative games, where you play on the same team with friends. + + + + + + encodingFormat + + + + Media type typically expressed using a MIME format (see [IANA site](http://www.iana.org/assignments/media-types/media-types.xhtml) and [MDN reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types)) e.g. application/zip for a SoftwareApplication binary, audio/mpeg for .mp3 etc.). + +In cases where a [[CreativeWork]] has several media type representations, [[encoding]] can be used to indicate each [[MediaObject]] alongside particular [[encodingFormat]] information. + +Unregistered or niche encoding and file formats can be indicated instead via the most appropriate URL, e.g. defining Web page or a Wikipedia/Wikidata entry. + + + fileFormat + + Media type, typically MIME format (see [IANA site](http://www.iana.org/assignments/media-types/media-types.xhtml)) of the content e.g. application/zip of a SoftwareApplication binary. In cases where a CreativeWork has several media type representations, 'encoding' can be used to indicate each MediaObject alongside particular fileFormat information. Unregistered or niche file formats can be indicated instead via the most appropriate URL, e.g. defining Web page or a Wikipedia entry. + + + + + The individual reservations included in the package. Typically a repeated property. + + subReservation + + + + This Review or Rating is relevant to this part or facet of the itemReviewed. + + reviewAspect + + + + + + + PreOrderAction + + An agent orders a (not yet released) object/product/service to be delivered/sent. + + + + + + + + + + + ineligibleRegion + + The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is not valid, e.g. a region where the transaction is not allowed.\n\nSee also [[eligibleRegion]]. + + + + + + + + Represents EU Energy Efficiency Class G as defined in EU energy labeling regulations. + EUEnergyEfficiencyCategoryG + + + The stage represented as a number, e.g. 3. + stageAsNumber + + + + + + + + + isProprietary + + True if this item's name is a proprietary/brand name (vs. generic name). + + + The Person's occupation. For past professions, use Role for expressing dates. + hasOccupation + + + + + + + + + drug + + + + Specifying a drug or medicine used in a medication procedure. + + + + + + Current location of the item. + + + itemLocation + + + + The location of, for example, where an event is happening, where an organization is located, or where an action takes place. + + location + + + + + + + + + + + + + + WearableSizeSystemBR + Brazilian size system for wearables. + + + Another drug that is known to interact with this drug in a way that impacts the effect of this drug or causes a risk to the patient. Note: disease interactions are typically captured as contraindications. + + interactingDrug + + + + + smokingAllowed + + Indicates whether it is allowed to smoke in the place, e.g. in the restaurant, hotel or hotel room. + + + + + + + + cvdNumC19OverflowPats + numc19overflowpats - ED/OVERFLOW: Patients with suspected or confirmed COVID-19 who are in the ED or any overflow location awaiting an inpatient bed. + + + + + + + SurgicalProcedure + A medical procedure involving an incision with instruments; performed for diagnose, or therapeutic purposes. + + + A full description of the lodging unit. + + + lodgingUnitDescription + + + + BodyMeasurementWeight + + Body weight. Used, for example, to measure pantyhose. + + + A textual description of known damages, both repaired and unrepaired. + + knownVehicleDamages + + + + + + + + archivedAt + Indicates a page or other link involved in archival of a [[CreativeWork]]. In the case of [[MediaReview]], the items in a [[MediaReviewItem]] may often become inaccessible, but be archived by archival, journalistic, activist, or law enforcement organizations. In such cases, the referenced page may not directly publish the content. + + + + + A ski resort. + + SkiResort + + + + Season dedicated to radio broadcast and associated online delivery. + + RadioSeason + + + + The vasculature the lymphatic structure runs, or efferents, to. + + + runsTo + + + A shop that will buy, or lend money against the security of, personal possessions. + + PawnShop + + + + + + The modulation (e.g. FM, AM, etc) used by a particular broadcast service. + broadcastSignalModulation + + + + + + + + + + + The currency of the price, or a price component when attached to [[PriceSpecification]] and its subtypes.\n\nUse standard formats: [ISO 4217 currency format](http://en.wikipedia.org/wiki/ISO_4217) e.g. "USD"; [Ticker symbol](https://en.wikipedia.org/wiki/List_of_cryptocurrencies) for cryptocurrencies e.g. "BTC"; well known names for [Local Exchange Tradings Systems](https://en.wikipedia.org/wiki/Local_exchange_trading_system) (LETS) and other currency types e.g. "Ithaca HOUR". + priceCurrency + + + WearableSizeGroupShort + + + Size group "Short" for wearables. + + + dateModified + + The date on which the CreativeWork was most recently modified or when the item's entry was modified within a DataFeed. + + + + + + LiquorStore + A shop that sells alcoholic drinks such as wine, beer, whisky and other spirits. + + + + Size group "Mens" for wearables. + WearableSizeGroupMens + + + + + + + Attraction suitable for type(s) of tourist. eg. Children, visitors from a particular country, etc. + + + + touristType + + + + + + + + editEIDR + + + + An [EIDR](https://eidr.org/) (Entertainment Identifier Registry) [[identifier]] representing a specific edit / edition for a work of film or television. + +For example, the motion picture known as "Ghostbusters" whose [[titleEIDR]] is "10.5240/7EC7-228A-510A-053E-CBB8-J", has several edits e.g. "10.5240/1F2A-E1C5-680A-14C6-E76B-I" and "10.5240/8A35-3BEE-6497-5D12-9E4F-3". + +Since schema.org types like [[Movie]] and [[TVEpisode]] can be used for both works and their multiple expressions, it is possible to use [[titleEIDR]] alone (for a general description), or alongside [[editEIDR]] for a more edit-specific description. + + + + Subscription + + Represents the subscription pricing component of the total price for an offered product. + + + + + geoMidpoint + Indicates the GeoCoordinates at the centre of a GeoShape e.g. GeoCircle. + + + + + The task that a player-controlled character, or group of characters may complete in order to gain a reward. + + + quest + + + + Additional content for a software application. + + softwareAddOn + + + AutoWash + A car wash business. + + + + Terminated. + Terminated + + + + Textual description of the unit type (including suite vs. room, size of bed, etc.). + + lodgingUnitType + + + + + + + + thumbnail + Thumbnail image for an image or video. + + + + + fromLocation + + A sub property of location. The original location of the object or the agent before the action. + + + + + Brewery. + Brewery + + + + + The business function (e.g. sell, lease, repair, dispose) of the offer or component of a bundle (TypeAndQuantityNode). The default is http://purl.org/goodrelations/v1#Sell. + businessFunction + + + + + + + + + The airport where the flight terminates. + arrivalAirport + + + + + + + energyEfficiencyScaleMin + Specifies the least energy efficient class on the regulated EU energy consumption scale for the product category a product belongs to. For example, energy consumption for televisions placed on the market after January 1, 2020 is scaled from D to A+++. + + + + customer + + Party placing the order or paying the invoice. + + + + + + + includesHealthPlanFormulary + Formularies covered by this plan. + + + + + Podiatric + + + Podiatry is the care of the human foot, especially the diagnosis and treatment of foot disorders. + + + + + + + + + + startDate + + + + + The start date and time of the item (in [ISO 8601 date format](http://en.wikipedia.org/wiki/ISO_8601)). + + + + + The Manufacturer Part Number (MPN) of the product, or the product to which the offer refers. + + mpn + + + + + + + + geoRadius + Indicates the approximate radius of a GeoCircle (metres unless indicated otherwise via Distance notation). + + + + + + numberOfBathroomsTotal + + + + The total integer number of bathrooms in a some [[Accommodation]], following real estate conventions as [documented in RESO](https://ddwiki.reso.org/display/DDW17/BathroomsTotalInteger+Field): "The simple sum of the number of bathrooms. For example for a property with two Full Bathrooms and one Half Bathroom, the Bathrooms Total Integer will be 3.". See also [[numberOfRooms]]. + + + + MusicVideoObject + A music video file. + + + + The likely outcome in either the short term or long term of the medical condition. + + + expectedPrognosis + + + BusinessSupport + + + BusinessSupport: this is a benefit for supporting businesses. + + + A designation by the US FDA signifying that there is positive evidence of human fetal risk based on adverse reaction data from investigational or marketing experience or studies in humans, but potential benefits may warrant use of the drug in pregnant women despite potential risks. + FDAcategoryD + + + + The day of the week between Thursday and Saturday. + Friday + + + + + + arrivalTerminal + Identifier of the flight's arrival terminal. + + + + Motel +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+
+ + Specifies a regular expression for testing literal values according to the HTML spec. + + + valuePattern + + + + + gtin12 + The GTIN-12 code of the product, or the product to which the offer refers. The GTIN-12 is the 12-digit GS1 Identification Key composed of a U.P.C. Company Prefix, Item Reference, and Check Digit used to identify trade items. See [GS1 GTIN Summary](http://www.gs1.org/barcodes/technical/idkeys/gtin) for more details. + + + + + + + + + gtin + + + A Global Trade Item Number ([GTIN](https://www.gs1.org/standards/id-keys/gtin)). GTINs identify trade items, including products and services, using numeric identification codes. The [[gtin]] property generalizes the earlier [[gtin8]], [[gtin12]], [[gtin13]], and [[gtin14]] properties. The GS1 [digital link specifications](https://www.gs1.org/standards/Digital-Link/) express GTINs as URLs. A correct [[gtin]] value should be a valid GTIN, which means that it should be an all-numeric string of either 8, 12, 13 or 14 digits, or a "GS1 Digital Link" URL based on such a string. The numeric component should also have a [valid GS1 check digit](https://www.gs1.org/services/check-digit-calculator) and meet the other rules for valid GTINs. See also [GS1's GTIN Summary](http://www.gs1.org/barcodes/technical/idkeys/gtin) and [Wikipedia](https://en.wikipedia.org/wiki/Global_Trade_Item_Number) for more details. Left-padding of the gtin values is not required or encouraged. + + + + + + + + + + + + + The startTime of something. For a reserved event or service (e.g. FoodEstablishmentReservation), the time that it is expected to start. For actions that span a period of time, when the action was performed. e.g. John wrote a book from *January* to December. For media, including audio and video, it's the time offset of the start of a clip within a larger file.\n\nNote that Event uses startDate/endDate instead of startTime/endTime, even when describing dates with times. This situation may be clarified in future revisions. + startTime + + + + + + Throat + + Throat assessment with clinical examination. + + + AnalysisNewsArticle + + An AnalysisNewsArticle is a [[NewsArticle]] that, while based on factual reporting, incorporates the expertise of the author/producer, offering interpretations and conclusions. + + + + + + A set of links that can help a user understand and navigate a website hierarchy. + + + + breadcrumb + + + RemixAlbum. + + RemixAlbum + + + + The period of time after any due date that the borrower has to fulfil its obligations before a default (failure to pay) is deemed to have occurred. + + + gracePeriod + + + + + Beauty salon. + + BeautySalon + + + An embedded audio object. + + + + + + audio + + + + Neurologic + A specific branch of medical science that studies the nerves and nervous system and its respective disease states. + + + LowLactoseDiet + A diet appropriate for people with lactose intolerance. + + + InStoreOnly + Indicates that the item is available only at physical locations. + + + The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is valid.\n\nSee also [[ineligibleRegion]]. + + + + + areaServed + + + + + The geographic area where a service or offered item is provided. + + + + + + + + + + + + + eligibleRegion + + + + + + + A set of requirements that a must be fulfilled in order to perform an Action. If more than one value is specied, fulfilling one set of requirements will allow the Action to be performed. + + + + actionAccessibilityRequirement + + + Date on which the content on this web page was last reviewed for accuracy and/or completeness. + lastReviewed + + + + + Professional service: Attorney. \n\nThis type is deprecated - [[LegalService]] is more inclusive and less ambiguous. + Attorney + + + + + error + For failed actions, more information on the cause of the failure. + + + + address + + + + + + + + Physical address of the item. + + + + + + + + + Molecular function performed by this BioChemEntity; please use PropertyValue if you want to include any evidence. + hasMolecularFunction + + + LockerDelivery + A DeliveryMethod in which an item is made available via locker. + + + noBylinesPolicy + + + For a [[NewsMediaOrganization]] or other news-related [[Organization]], a statement explaining when authors of articles are not named in bylines. + + + + + + The publishingPrinciples property indicates (typically via [[URL]]) a document describing the editorial principles of an [[Organization]] (or individual e.g. a [[Person]] writing a blog) that relate to their activities as a publisher, e.g. ethics or diversity policies. When applied to a [[CreativeWork]] (e.g. [[NewsArticle]]) the principles are those of the party primarily responsible for the creation of the [[CreativeWork]]. + +While such policies are most typically expressed in natural language, sometimes related information (e.g. indicating a [[funder]]) can be expressed using schema.org terminology. + + + publishingPrinciples + + + + + + + + + + + + + subtitleLanguage + + + + + Languages in which subtitles/captions are available, in [IETF BCP 47 standard format](http://tools.ietf.org/html/bcp47). + + + + The Stock Keeping Unit (SKU), i.e. a merchant-specific identifier for a product or service, or the product to which the offer refers. + + + + + + + sku + + + A synagogue. + Synagogue + + + + + + + The endTime of something. For a reserved event or service (e.g. FoodEstablishmentReservation), the time that it is expected to end. For actions that span a period of time, when the action was performed. e.g. John wrote a book from January to *December*. For media, including audio and video, it's the time offset of the end of a clip within a larger file.\n\nNote that Event uses startDate/endDate instead of startTime/endTime, even when describing dates with times. This situation may be clarified in future revisions. + endTime + + + + + + + + maximumEnrollment + + + + The maximum number of students who may be enrolled in the program. + + + + + + + + diversityStaffingReport + For an [[Organization]] (often but not necessarily a [[NewsMediaOrganization]]), a report on staffing diversity issues. In a news context this might be for example ASNE or RTDNA (US) reports, or self-reported. + + + + + + + + + + + + A director of e.g. tv, radio, movie, video gaming etc. content, or of an event. Directors can be associated with individual items or with a series, episode, clip. + + + + + + director + + + + + + + + + + + directors + + + + A director of e.g. tv, radio, movie, video games etc. content. Directors can be associated with individual items or with a series, episode, clip. + + + + + + + + + clipNumber + + Position of the clip within an ordered group of clips. + + + + + + ResearchOrganization + A Research Organization (e.g. scientific institute, research company). + + + UserDownloads + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + + + + The quantity of the materials being described or an expression of the physical space they occupy. + + + + materialExtent + + + + Indicates that the event was changed to allow online participation. See [[eventAttendanceMode]] for specifics of whether it is now fully or partially online. + EventMovedOnline + + + CassetteFormat. + CassetteFormat + + + + ActivateAction + + The act of starting or activating a device or application (e.g. starting a timer or turning on a flashlight). + + + imagingTechnique + + Imaging technique used. + + + + + Genitourinary system function assessment with clinical examination. + + Genitourinary + + + + doseUnit + + The unit of the dose, e.g. 'mg'. + + + + The trailer of a movie or tv/radio series, season, episode, etc. + trailer + + + + + + + + + + + + The act of departing from a place. An agent departs from an fromLocation for a destination, optionally with participants. + + DepartAction + + + The CO2 emissions in g/km. When used in combination with a QuantitativeValue, put "g/km" into the unitText property of that value, since there is no UN/CEFACT Common Code for "g/km". + + emissionsCO2 + + + + + + ItemListOrderAscending + An ItemList ordered with lower values listed first. + + + SingleBlindedTrial + A trial design in which the researcher knows which treatment the patient was randomly assigned to but the patient does not. + + + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + UserPlusOnes + + + + + Defines the energy efficiency Category (also known as "class" or "rating") for a product according to an international energy efficiency standard. + + + hasEnergyConsumptionDetails + + + + A minimum amount that has to be paid in every month. + accountMinimumInflow + + + + + + + + + + + PodcastSeason + A single season of a podcast. Many podcasts do not break down into separate seasons. In that case, PodcastSeries should be used. + + + + discussionUrl + + A link to the page containing the comments of the CreativeWork. + + + A possible serious complication and/or serious side effect of this therapy. Serious adverse outcomes include those that are life-threatening; result in death, disability, or permanent damage; require hospitalization or prolong existing hospitalization; cause congenital anomalies or birth defects; or jeopardize the patient and may require medical or surgical intervention to prevent one of the outcomes in this definition. + + + seriousAdverseOutcome + + + + + A home goods store. + + HomeGoodsStore + + + + + + The item being described is intended to assess the competency or learning outcome defined by the referenced term. + assesses + + + + + + + + + numc19mechventpats - HOSPITALIZED and VENTILATED: Patients hospitalized in an NHSN inpatient care location who have suspected or confirmed COVID-19 and are on a mechanical ventilator. + + + cvdNumC19MechVentPats + + + + + + Date on which this guideline's recommendation was made. + guidelineDate + + + + + Used in conjunction with eventStatus for rescheduled or cancelled events. This property contains the previously scheduled start date. For rescheduled events, the startDate property should be used for the newly scheduled start date. In the (rare) case of an event that has been postponed and rescheduled multiple times, this field may be repeated. + previousStartDate + + + Indicates that the publisher gives some special status to the publication of the document. ("The Queens Printer" version of a UK Act of Parliament, or the PDF version of a Directive published by the EU Office of Publications). Something "Authoritative" is considered to be also [[OfficialLegalValue]]". + + + AuthoritativeLegalValue + + + + + A health club. + + HealthClub + + + + + + loanType + + The type of a loan or credit. + + + + + + + + The person who wrote the words. + + lyricist + + + A (typically single) geographic location associated with the job position. + + + jobLocation + + + + variantCover + + A description of the variant cover + for the issue, if the issue is a variant printing. For example, "Bryan Hitch + Variant Cover" or "2nd Printing Variant". + + + + sdDatePublished + + Indicates the date on which the current structured data was generated / published. Typically used alongside [[sdPublisher]] + + + + + + + unsaturatedFatContent + + The number of grams of unsaturated fat. + + + + + PublicToilet + + A public toilet is a room or small building containing one or more toilets (and possibly also urinals) which is available for use by the general public, or by customers or employees of certain businesses. + + + + + A dosage form in which this drug/supplement is available, e.g. 'tablet', 'suspension', 'injection'. + + dosageForm + + + + The most generic uni-directional social relation. + follows + + + + + numAdults + The number of adults staying in the unit. + + + + + Girth of natural waistline (between hip bones and lower ribs). Used, for example, to fit pants. + + + BodyMeasurementWaist + + + + + numberOfSeasons + + The number of seasons in this series. + + + + Indicates the populationType common to all members of a [[StatisticalPopulation]]. + + + populationType + + + + + + + actionStatus + Indicates the current disposition of the Action. + + + + Nonprofit501c6: Non-profit type referring to Business Leagues, Chambers of Commerce, Real Estate Boards. + + Nonprofit501c6 + + + + partOfSeason + The season to which this episode belongs. + + + + + + + isPartOf + + + Indicates an item or CreativeWork that this item, or CreativeWork (in some sense), is part of. + + + + + repeatFrequency + + + + How often the dose is taken, e.g. 'daily'. + + + frequency + + + + + + Defines the frequency at which [[Event]]s will occur according to a schedule [[Schedule]]. The intervals between + events should be defined as a [[Duration]] of time. + + + + + + A citation or reference to another creative work, such as another publication, web page, scholarly article, etc. + + citation + + + + + tourBookingPage + + + A page providing information on how to book a tour of some [[Place]], such as an [[Accommodation]] or [[ApartmentComplex]] in a real estate setting, as well as other kinds of tours as appropriate. + + + + + + + Rigid connective tissue that comprises up the skeletal structure of the human body. + + Bone + + + + + + + A sub property of participant. The participant who is at the receiving end of the action. + + + + + + + + + + recipient + + + + + + + + + + bccRecipient + A sub property of recipient. The recipient blind copied on a message. + + + Size group "Infants" for wearables. + + + WearableSizeGroupInfants + + + The typical delay between the receipt of the order and the goods either leaving the warehouse or being prepared for pickup, in case the delivery method is on site pickup. + + deliveryLeadTime + + + + + + letterer + The individual who adds lettering, including speech balloons and sound effects, to artwork. + + + + + + + + + ComedyClub + A comedy club. + + + + + + Indicates whether an [[url]] that is associated with a [[JobPosting]] enables direct application for the job, via the posting website. A job posting is considered to have directApply of [[True]] if an application process for the specified job can be directly initiated via the url(http://github.com/s) given (noting that e.g. multiple internet domains might nevertheless be involved at an implementation level). A value of [[False]] is appropriate if there is no clear path to applying directly online for the specified job, navigating directly from the JobPosting url(http://github.com/s) supplied. + + directApply + + + + + OfflineEventAttendanceMode - an event that is primarily conducted offline. + OfflineEventAttendanceMode + + + Indicates that the item is available for ordering and delivery before general availability. + PreSale + + + + A CovidTestingFacility is a [[MedicalClinic]] where testing for the COVID-19 Coronavirus + disease is available. If the facility is being made available from an established [[Pharmacy]], [[Hotel]], or other + non-medical organization, multiple types can be listed. This makes it easier to re-use existing schema.org information + about that place e.g. contact info, address, opening hours. Note that in an emergency, such information may not always be reliable. + + + CovidTestingFacility + + + + A casino. + Casino + + + + lyrics + + The words in the song. + + + + + + + Represents EU Energy Efficiency Class A+ as defined in EU energy labeling regulations. + EUEnergyEfficiencyCategoryA1Plus + + + + + Specifies a Web page or service by URL, for product returns. + merchantReturnLink + + + + + + The type of the legislation. Examples of values are "law", "act", "directive", "decree", "regulation", "statutory instrument", "loi organique", "règlement grand-ducal", etc., depending on the country. + + + + + Genre of the creative work, broadcast channel or group. + genre + + + + + + + + legislationType + + + + + + + + + A contact point for a person or organization. + + + + + contactPoint + + + + + A contact point for a person or organization. + + + contactPoints + + + + The anatomical or organ system drained by this vessel; generally refers to a specific part of an organ. + + regionDrained + + + + + + + AllergiesHealthAspect + Content about the allergy-related aspects of a health topic. + + + + A radio channel that uses AM. + + AMRadioChannel + + + + reviews + Review of the item. + + + + + + + A review of the item. + review + + + + + + + + + + + + + + + + workLocation + + + + + A contact location for a person's place of work. + + + Defines a [[Date]] or [[DateTime]] during which a scheduled [[Event]] will not take place. The property allows exceptions to + a [[Schedule]] to be specified. If an exception is specified as a [[DateTime]] then only the event that would have started at that specific date and time + should be excluded from the schedule. If an exception is specified as a [[Date]] then any event that is scheduled for that 24 hour period should be + excluded from the schedule. This allows a whole day to be excluded from the schedule without having to itemise every scheduled event. + + + exceptDate + + + + + + + + UnincorporatedAssociationCharity: Non-profit type referring to a charitable company that is not incorporated (UK). + UnincorporatedAssociationCharity + + + + headline + Headline of the article. + + + + + + + + First postal code in a range (included). + postalCodeBegin + + + + + + + A slogan or motto associated with the item. + + + slogan + + + + A Childcare center. + ChildCare + + + + The individual who draws the primary narrative artwork. + + + penciler + + + + + employerOverview + A description of the employer, career opportunities and work environment for this position. + + + + + + + tissueSample + + + The type of tissue sample required for the test. + + + + + + The temporalCoverage of a CreativeWork indicates the period that the content applies to, i.e. that it describes, either as a DateTime or as a textual string indicating a time period in [ISO 8601 time interval format](https://en.wikipedia.org/wiki/ISO_8601#Time_intervals). In + the case of a Dataset it will typically indicate the relevant time period in a precise notation (e.g. for a 2011 census dataset, the year 2011 would be written "2011/2012"). Other forms of content e.g. ScholarlyArticle, Book, TVSeries or TVEpisode may indicate their temporalCoverage in broader terms - textually or via well-known URL. + Written works such as books may sometimes have precise temporal coverage too, e.g. a work set in 1939 - 1945 can be indicated in ISO 8601 interval format format via "1939/1945". + +Open-ended date ranges can be written with ".." in place of the end date. For example, "2015-11/.." indicates a range beginning in November 2015 and with no specified final date. This is tentative and might be updated in future when ISO 8601 is officially updated. + + + + + + temporalCoverage + + + + The range of temporal applicability of a dataset, e.g. for a 2011 census dataset, the year 2011 (in ISO 8601 time interval format). + datasetTimeInterval + + + + + + + dateIssued + The date the ticket was issued. + + + An overdraft is an extension of credit from a lending institution when an account reaches zero. An overdraft allows the individual to continue withdrawing money even if the account has no funds in it. Basically the bank allows people to borrow a set amount of money. + + + + + accountOverdraftLimit + + + + modelDate + + + + + The release date of a vehicle model (often used to differentiate versions of the same make and model). + + + bookingAgent + + 'bookingAgent' is an out-dated term indicating a 'broker' that serves as a booking agent. + + + + + + broker + An entity that arranges for an exchange between a buyer and a seller. In most cases a broker never acquires or releases ownership of a product or service involved in an exchange. If it is not clear whether an entity is a broker, seller, or buyer, the latter two terms are preferred. + + + + + + + + + + + buyer + A sub property of participant. The participant/person/organization that bought the object. + + + + Other co-agents that participated in the action indirectly. e.g. John wrote a book with *Steve*. + + + + participant + + + + + + + productGroupID + Indicates a textual identifier for a ProductGroup. + + + + + + Recruiting + Recruiting participants. + + + + Crematorium + A crematorium. + + + + + + Attraction located at destination. + + + + + includesAttraction + + + + + numberOfPartialBathrooms + + Number of partial bathrooms - The total number of half and ¼ bathrooms in an [[Accommodation]]. This corresponds to the [BathroomsPartial field in RESO](https://ddwiki.reso.org/display/DDW17/BathroomsPartial+Field). + + + + + + + + For an [[Article]], typically a [[NewsArticle]], the backstory property provides a textual summary giving a brief explanation of why and how an article was created. In a journalistic setting this could include information about reporting process, methods, interviews, data sources, etc. + + backstory + + + + + + + + nonprofitStatus + nonprofit Status indicates the legal status of a non-profit organization in its primary place of business. + + + + + TennisComplex + A tennis complex. + + + + + + restockingFee + Use [[MonetaryAmount]] to specify a fixed restocking fee for product returns, or use [[Number]] to specify a percentage of the product price paid by the customer. + + + + + + + + + Indicates whether pets are allowed to enter the accommodation or lodging business. More detailed information can be put in a text value. + + petsAllowed + + + + + + The response (yes, no, maybe) to the RSVP. + rsvpResponse + + + + + + + + numberOfRooms + + + + + The number of rooms (excluding bathrooms and closets) of the accommodation or lodging business. +Typical unit code(s): ROM for room or C62 for no unit. The type of room can be put in the unitText property of the QuantitativeValue. + + + + + A sub property of object. The candidate subject of this action. + + + + candidate + + + A bridge. + Bridge + + + + + + structuralClass + + The name given to how bone physically connects to each other. + + + + + + + + + serviceArea + + The geographic area where the service is provided. + + + + + + + area + The area within which users can expect to reach the broadcast service. + + + EnrollingByInvitation + Enrolling participants by invitation only. + + + + readBy + + + An actor, e.g. in tv, radio, movie, video games etc., or in an event. Actors can be associated with individual items or with a series, episode, clip. + + + actor + + + + + + + + + + + + + + + + A person who reads (performs) the audiobook. + + + + + recognizingAuthority + + + If applicable, the organization that officially recognizes this entity as part of its endorsed system of medicine. + + + + Any special commitments associated with this job posting. Valid entries include VeteranCommit, MilitarySpouseCommit, etc. + + specialCommitments + + + + + The basic containment relation between a place and one that contains it. + + + The basic containment relation between a place and one that contains it. + + containedInPlace + + + + + containedIn + + + + Indicates a MediaManipulationRatingEnumeration classification of a media object (in the context of how it was published or shared). + + + mediaAuthenticityCategory + + + + + + + Newspaper + A publication containing information about varied topics that are pertinent to general information, a geographic area, or a specific subject matter (i.e. business, culture, education). Often published daily. + + + + webFeed + + The URL for a feed, e.g. associated with a podcast series, blog, or series of date-stamped updates. This is usually RSS or Atom. + + + + + + + + + monoisotopicMolecularWeight + + The monoisotopic mass is the sum of the masses of the atoms in a molecule using the unbound, ground-state, rest mass of the principal (most abundant) isotope for each element instead of the isotopic average mass. Please include the units the form '&lt;Number&gt; &lt;unit&gt;', for example '770.230488 g/mol' or as '&lt;QuantitativeValue&gt;. + + + + + + A hair salon. + HairSalon + + + WearableSizeSystemCN + + + Chinese size system for wearables. + + + + + The kind of release which this album is: single, EP or album. + albumReleaseType + + + + healthcareReportingData + + + Indicates data describing a hospital, e.g. a CDC [[CDCPMDRecord]] or as some kind of [[Dataset]]. + + + + + + loanPaymentFrequency + + + + + + Frequency of payments due, i.e. number of months between payments. This is defined as a frequency, i.e. the reciprocal of a period of time. + + + + HealthCare: this is a benefit for health care. + + HealthCare + + + childMaxAge + + + Maximal age of the child. + + + An additional offer that can only be obtained in combination with the first base offer (e.g. supplements and extensions that are available for a surcharge). + addOn + + + + + + + + naics + The North American Industry Classification System (NAICS) code for a particular organization or business person. + + + + + + + + + + + + duration + + The duration of the item (movie, audio recording, event, etc.) in [ISO 8601 date format](http://en.wikipedia.org/wiki/ISO_8601). + + + + + + + + + The duration of the loan or credit agreement. + + + loanTerm + + + + OutletStore + An outlet store. + + + + Tracking url for the parcel delivery. + trackingUrl + + + + + + Represents the manufacturer suggested retail price ("MSRP") of an offered product. + MSRP + + + + healthPlanCostSharing + + Whether The costs to the patient for services under this network or formulary. + + + + + + + + A unique instance of a television BroadcastService on a CableOrSatelliteService lineup. + TelevisionChannel + + + + RadioClip + A short radio program or a segment/part of a radio program. + + + + + + + legislationResponsible + + + An individual or organization that has some kind of responsibility for the legislation. Typically the ministry who is/was in charge of elaborating the legislation, or the adressee for potential questions about the legislation once it is published. + + + + + A media object that encodes this CreativeWork. This property is a synonym for encoding. + + associatedMedia + + + + + + + + URL of the item. + url + + + + + + ratingExplanation + + A short explanation (e.g. one to two sentences) providing background context and other information that led to the conclusion expressed in the rating. This is particularly applicable to ratings associated with "fact check" markup using [[ClaimReview]]. + + + A zoo. + Zoo + + + + + + interactionType + The Action representing the type of interaction. For up votes, +1s, etc. use [[LikeAction]]. For down votes use [[DislikeAction]]. Otherwise, use the most specific Action. + + + + The [Global Location Number](http://www.gs1.org/gln) (GLN, sometimes also referred to as International Location Number or ILN) of the respective organization, person, or place. The GLN is a 13-digit number used to identify parties and physical locations. + + + + globalLocationNumber + + + + + + unnamedSourcesPolicy + + + + + + + + For an [[Organization]] (typically a [[NewsMediaOrganization]]), a statement about policy on use of unnamed sources and the decision process required. + + + cvdFacilityId + + + + Identifier of the NHSN facility that this data record applies to. Use [[cvdFacilityCounty]] to indicate the county. To provide other details, [[healthcareReportingData]] can be used on a [[Hospital]] entry. + + + + + + A category of alignment between the learning resource and the framework node. Recommended values include: 'requires', 'textComplexity', 'readingLevel', and 'educationalSubject'. + alignmentType + + + Car repair business. + + AutoRepair + + + + Represents EU Energy Efficiency Class B as defined in EU energy labeling regulations. + + EUEnergyEfficiencyCategoryB + + + An indication for treating an underlying condition, symptom, etc. + TreatmentIndication + + + + + NonprofitSBBI: Non-profit type referring to a Social Interest Promoting Institution (NL). + + + NonprofitSBBI + + + seeks + + + + + A pointer to products or services sought by the organization or person (demand). + + + A medical device used for diagnostic purposes. + Diagnostic + + + + A diet focused on reduced sodium intake. + LowSaltDiet + + + MusicVenue + + A music venue. + + + + Whether the 3DModel allows resizing. For example, room layout applications often do not allow 3DModel elements to be resized to reflect reality. + + + isResizable + + + + + minimumPaymentDue + + The minimum payment required at this time. + + + + + Indicates that parts of the legislation are in force, and parts are not. + PartiallyInForce + + + + + + + availableAtOrFrom + The place(s) from which the offer can be obtained (e.g. store locations). + + + + + + + + + + + + Represents textual captioning from a [[MediaObject]], e.g. text of a 'meme'. + + embeddedTextCaption + + + + + caption + + + + The caption for this object. For downloadable machine formats (closed caption, subtitles etc.) use MediaObject and indicate the [[encodingFormat]]. + + + + + + + + skills + + + A statement of knowledge, skill, ability, task or any other assertion expressing a competency that is desired or required to fulfill this role or to work in this occupation. + + + + The total price for the reservation or ticket, including applicable taxes, shipping, etc.\n\nUsage guidelines:\n\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + totalPrice + + + + + + + + + + numberOfAxles + The number of axles.\n\nTypical unit code(s): C62 + + + + + Head assessment with clinical examination. + Head + + + + + The tier(s) for this network. + + + + healthPlanNetworkTier + + + + + Amount of mortgage mandate that can be converted into a proper mortgage at a later stage. + + + loanMortgageMandateAmount + + + + + + + + + bed + The type of bed or beds included in the accommodation. For the single case of just one bed of a certain type, you use bed directly with a text. + If you want to indicate the quantity of a certain kind of bed, use an instance of BedDetails. For more detailed information, use the amenityFeature property. + + + + A possible treatment to address this condition, sign or symptom. + possibleTreatment + + + + + + + billingStart + + + Specifies after how much time this price (or price component) becomes valid and billing starts. Can be used, for example, to model a price increase after the first year of a subscription. The unit of measurement is specified by the unitCode property. + + + + + + telephone + + The telephone number. + + + + + + + + BodyMeasurementHips + Girth of hips (measured around the buttocks). Used, for example, to fit skirts. + + + MovieRentalStore + A movie rental store. + + + + publicationType + + + + The type of the medical article, taken from the US NLM MeSH publication type catalog. See also [MeSH documentation](http://www.nlm.nih.gov/mesh/pubtypes.html). + + + + + vehicleTransmission + The type of component used for transmitting the power from a rotating power source to the wheels or other relevant component(s) ("gearbox" for cars). + + + + + + + Beach. + Beach + + + SafetyHealthAspect + Content about the safety-related aspects of a health topic. + + + + + distribution + + + A downloadable form of this dataset, at a specific location, in a specific format. + + + The home team in a sports event. + + + + + + A competitor in a sports event. + competitor + + + + + + homeTeam + + + + dateSent + The date/time at which the message was sent. + + + + MinimumAdvertisedPrice + + + Represents the minimum advertised price ("MAP") (as dictated by the manufacturer) of an offered product. + + + RsvpResponseYes + The invitee will attend. + + + + + + + currentExchangeRate + + The current price of a currency. + + + + + + + + The allowed total occupancy for the accommodation in persons (including infants etc). For individual accommodations, this is not necessarily the legal maximum but defines the permitted usage as per the contractual agreement (e.g. a double room used by a single person). +Typical unit code(s): C62 for person + occupancy + + + + + Storage requirements (free space required). + + + storageRequirements + + + + A state or province of a country. + State + + + title + + The title of the job. + + + + + authenticator + + + The Organization responsible for authenticating the user's subscription. For example, many media apps require a cable/satellite provider to authenticate your subscription before playing media. + + + + + numberedPosition + A number associated with a role in an organization, for example, the number on an athlete's jersey. + + + SingleRelease. + + SingleRelease + + + studyLocation + The location in which the study is taking/took place. + + + + + + + + + + + arterialBranch + The branches that comprise the arterial structure. + + + + + The branches that delineate from the nerve bundle. Not to be confused with [[branchOf]]. + + branch + + + Reservoir + + A reservoir of water, typically an artificially created lake, like the Lake Kariba reservoir. + + + Statistical information about the spread of a disease, either as [[WebContent]], or + described directly as a [[Dataset]], or the specific [[Observation]]s in the dataset. When a [[WebContent]] URL is + provided, the page indicated might also contain more such markup. + + + + diseaseSpreadStatistics + + + + + + + + A [callsign](https://en.wikipedia.org/wiki/Call_sign), as used in broadcasting and radio communications to identify people, radio and TV stations, or vehicles. + + callSign + + + + + + + + + + + Whether the provider is accepting new patients. + + isAcceptingNewPatients + + + + + Systematic method of naming chemical compounds as recommended by the International Union of Pure and Applied Chemistry (IUPAC). + + + iupacName + + + + Nonprofit501e: Non-profit type referring to Cooperative Hospital Service Organizations. + + Nonprofit501e + + + A winery. + + Winery + + + + creativeWorkStatus + + + The status of a creative work in terms of its stage in a lifecycle. Example terms include Incomplete, Draft, Published, Obsolete. Some organizations define a set of terms for the stages of their publication lifecycle. + + + + + + + + + + The drug or supplement's legal status, including any controlled substance schedules that apply. + legalStatus + + + + + + The Organization on whose behalf the creator was working. + + sourceOrganization + + + + A BioChemEntity that is known to interact with this item. + + + + bioChemInteraction + + + + Indicates the number of available accommodation units in an [[ApartmentComplex]], or the number of accommodation units for a specific [[FloorPlan]] (within its specific [[ApartmentComplex]]). See also [[numberOfAccommodationUnits]]. + + + + + numberOfAvailableAccommodationUnits + + + + + geoEquals + + Represents spatial relations in which two geometries (or the places they represent) are topologically equal, as defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). "Two geometries are topologically equal if their interiors intersect and no part of the interior or boundary of one geometry intersects the exterior of the other" (a symmetric relationship) + + + + + + + exerciseCourse + A sub property of location. The course where this action was taken. + + + + + A sub property of location. The course where this action was taken. + course + + + + + + + Hackathon + + A [hackathon](https://en.wikipedia.org/wiki/Hackathon) event. + + + + RentalVehicleUsage + + Indicates the usage of the vehicle as a rental car. + + + + The frame size of the video. + + + videoFrameSize + + + The 25th percentile value. + + percentile25 + + + + + + + + A monetary value above which (or equal to) the shipping rate becomes free. Intended to be used via an [[OfferShippingDetails]] with [[shippingSettingsLink]] matching this [[ShippingRateSettings]]. + + freeShippingThreshold + + + + + orderDelivery + The delivery of the parcel related to this order or order item. + + + + + + Indicate how many people can play this game (minimum, maximum, or range). + + + numberOfPlayers + + + + + torque + The torque (turning force) of the vehicle's engine.\n\nTypical unit code(s): NU for newton metre (N m), F17 for pound-force per foot, or F48 for pound-force per inch\n\n* Note 1: You can link to information about how the given value has been determined (e.g. reference RPM) using the [[valueReference]] property.\n* Note 2: You can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + + Any precaution, guidance, contraindication, etc. related to consumption of specific foods while taking this drug. + + foodWarning + + + + + + + Nonprofit501d + Nonprofit501d: Non-profit type referring to Religious and Apostolic Associations. + + + + physiologicalBenefits + + + Specific physiologic benefits associated to the plan. + + + + The high level platform(s) where the Action can be performed for the given URL. To specify a specific application or operating system instance, use actionApplication. + actionPlatform + + + + + The unique identifier for a flight including the airline IATA code. For example, if describing United flight 110, where the IATA code for United is 'UA', the flightNumber is 'UA110'. + + + flightNumber + + + + EventReservation + + A reservation for an event like a concert, sporting event, or lecture.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + + + + + Subcellular location where this BioChemEntity is located; please use PropertyValue if you want to include any evidence. + + isLocatedInSubcellularLocation + + + + + + + + + + A pointer to another, functionally similar product (or multiple products). + + isSimilarTo + + + Completed. + + Completed + + + coverageStartTime + + The time when the live blog will begin covering the Event. Note that coverage may begin before the Event's start time. The LiveBlogPosting may also be created before coverage begins. + + + + Content coded 'missing context' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'missing context': Presenting unaltered video in an inaccurate manner that misrepresents the footage. For example, using incorrect dates or locations, altering the transcript or sharing brief clips from a longer video to mislead viewers. (A video rated 'original' can also be missing context.) + +For an [[ImageObject]] to be 'missing context': Presenting unaltered images in an inaccurate manner to misrepresent the image and mislead the viewer. For example, a common tactic is using an unaltered image but saying it came from a different time or place. (An image rated 'original' can also be missing context.) + +For an [[ImageObject]] with embedded text to be 'missing context': An unaltered image presented in an inaccurate manner to misrepresent the image and mislead the viewer. For example, a common tactic is using an unaltered image but saying it came from a different time or place. (An 'original' image with inaccurate text would generally fall in this category.) + +For an [[AudioObject]] to be 'missing context': Unaltered audio presented in an inaccurate manner that misrepresents it. For example, using incorrect dates or locations, or sharing brief clips from a longer recording to mislead viewers. (Audio rated “original” can also be missing context.) + + + DecontextualizedContent + + + + printColumn + + The number of the column in which the NewsArticle appears in the print edition. + + + + + + + monthlyMinimumRepaymentAmount + The minimum payment is the lowest amount of money that one is required to pay on a credit card statement each month. + + + + + + labelDetails + + + Link to the drug's label details. + + + + EmployerReview + An [[EmployerReview]] is a review of an [[Organization]] regarding its role as an employer, written by a current or former employee of that organization. + + + + + + + + foodEvent + A sub property of location. The specific food event where the action occurred. + + + + + An electrician. + Electrician + + + + + seatingCapacity + + + + The number of persons that can be seated (e.g. in a vehicle), both in terms of the physical space available, and in terms of limitations set by law.\n\nTypical unit code(s): C62 for persons + + + + Whether prescriptions can be delivered by mail. + + + + offersPrescriptionByMail + + + + + + acceptsReservations + + Indicates whether a FoodEstablishment accepts reservations. Values can be Boolean, an URL at which reservations can be made or (for backwards compatibility) the strings ```Yes``` or ```No```. + + + Prion + + A prion is an infectious agent composed of protein in a misfolded form. + + + + + How often one should break from the activity. + + restPeriods + + + + originAddress + Shipper's address. + + + + + + Networks covered by this plan. + includesHealthPlanNetwork + + + + + + + + + + The delivery method(s) available for this offer. + availableDeliveryMethod + + + Symptoms or related symptoms of a Topic. + + SymptomsHealthAspect + + + + + + + landlord + + A sub property of participant. The owner of the real estate property. + + + + + + eligibleCustomerType + The type(s) of customers for which the given offer is valid. + + + + DanceEvent + Event type: A social dance. + + + + + instructor + + A person assigned to instruct or provide instructional assistance for the [[CourseInstance]]. + + + + Last postal code in the range (included). Needs to be after [[postalCodeBegin]]. + + + + postalCodeEnd + + + A gas station. + GasStation + + + + + A sub property of participant. The real estate agent involved in the action. + + + realEstateAgent + + + numberOfItems + The number of items in an ItemList. Note that some descriptions might not fully describe all items in a list (e.g., multi-page pagination); in such cases, the numberOfItems would be for the entire list. + + + + + A short summary of the specific claims reviewed in a ClaimReview. + + + + claimReviewed + + + + CausesHealthAspect + + Information about the causes and main actions that gave rise to the topic. + + + The most generic familial relation. + + relatedTo + + + + + + vehicleEngine + Information about the engine or engines of the vehicle. + + + + A jewelry store. + + JewelryStore + + + + DeactivateAction + The act of stopping or deactivating a device or application (e.g. stopping a timer or turning off a flashlight). + + + For itemListElement values, you can use simple strings (e.g. "Peter", "Paul", "Mary"), existing entities, or use ListItem.\n\nText values are best if the elements in the list are plain strings. Existing entities are best for a simple, unordered list of existing things in your data. ListItem is used with ordered lists when you want to provide additional context about the element in that list or when the same item might be in different places in different lists.\n\nNote: The order of elements in your mark-up is not sufficient for indicating the order or elements. Use ListItem with a 'position' property in such cases. + + itemListElement + + + + + + + unitCode.]]> + + + + + unitText + + + + + suggestedGender + + The suggested gender of the intended person or audience, for example "male", "female", or "unisex". + + + + + + measuredProperty + The measuredProperty of an [[Observation]], either a schema.org property, a property from other RDF-compatible systems e.g. W3C RDF Data Cube, or schema.org extensions such as [GS1's](https://www.gs1.org/voc/?show=properties). + + + + + + + ReturnLabelCustomerResponsibility + Indicated that creating a return label is the responsibility of the customer. + + + Associated product/technology version. e.g., .NET Framework 4.5. + assemblyVersion + + + + + + + + + + The brand(s) associated with a product or service, or the brand(s) maintained by an organization or business person. + + brand + + + The organization owning or operating the broadcast service. + broadcaster + + + + + + creditedTo + + The group the release is credited to if different than the byArtist. For example, Red and Blue is credited to "Stefani Germanotta Band", but by Lady Gaga. + + + + + A defined range of postal codes. + postalCodeRange + + + + + + + + + PreventionHealthAspect + Information about actions or measures that can be taken to avoid getting the topic or reaching a critical situation related to the topic. + + + interestRate + + + The interest rate, charged or paid, applicable to the financial product. Note: This is different from the calculated annualPercentageRate. + + + + + + Description of fees, commissions, and other terms applied either to a class of financial product, or by a financial service organization. + + + feesAndCommissionsSpecification + + + + + + + Indicates the party responsible for generating and publishing the current structured data markup, typically in cases where the structured data is derived automatically from existing published content but published on a different site. For example, student projects and open data initiatives often re-publish existing content with more explicitly structured metadata. The +[[sdPublisher]] property helps make such practices more explicit. + + + + sdPublisher + + + Indicates that the item has been discontinued. + Discontinued + + + + The priority status assigned to a passenger for security or boarding (e.g. FastTrack or Priority). + + + passengerPriorityStatus + + + stage + The stage of the condition, if applicable. + + + + + + + downloadUrl + If the file can be downloaded, URL to download the binary. + + + + + + A language someone may use with or at the item, service or place. Please use one of the language codes from the [IETF BCP 47 standard](http://tools.ietf.org/html/bcp47). See also [[inLanguage]] + + + + availableLanguage + + + + + PrescriptionOnly + Available by prescription only. + + + + + browserRequirements + Specifies browser requirements in human-readable text. For example, 'requires HTML5 support'. + + + + + ImageObjectSnapshot + + A specific and exact (byte-for-byte) version of an [[ImageObject]]. Two byte-for-byte identical files, for the purposes of this type, considered identical. If they have different embedded metadata (e.g. XMP, EXIF) the files will differ. Different external facts about the files, e.g. creator or dateCreated that aren't represented in their actual content, do not affect this notion of identity. + + + Nonprofit501a + Nonprofit501a: Non-profit type referring to Farmers’ Cooperative Associations. + + + + + The age or age range for the intended audience or person, for example 3-12 months for infants, 1-5 years for toddlers. + suggestedAge + + + + + + + + + + DrivingSchoolVehicleUsage + Indicates the usage of the vehicle for driving school. + + + A subway station. + SubwayStation + + + + + + DiagnosticProcedure + A medical procedure intended primarily for diagnostic, as opposed to therapeutic, purposes. + + + + + postalCode + + The postal code. For example, 94043. + + + + + + + + + Prerequisites for enrolling in the program. + + programPrerequisites + + + + + + publicTransportClosuresInfo + + Information about public transport closures. + + + + + + + + + + + + The result produced in the action. e.g. John wrote *a book*. + + result + + + A sub property of result. The Comment created or sent as a result of this action. + + resultComment + + + + schoolClosuresInfo + + + + + Information about school closures. + + + + suggestedMinAge + Minimum recommended age in years for the audience or user. + + + + + The identifier for the [[Course]] used by the course [[provider]] (e.g. CS101 or 6.001). + courseCode + + + + + + + + For a [[NewsMediaOrganization]] or other news-related [[Organization]], a statement about public engagement activities (for news media, the newsroom’s), including involving the public - digitally or otherwise -- in coverage decisions, reporting and activities after publication. + + + + actionableFeedbackPolicy + + + + + AgreeAction + The act of expressing a consistency of opinion with the object. An agent agrees to/about an object (a proposition, topic or theme) with participants. + + + InStock + Indicates that the item is in stock. + + + + contactlessPayment + + + + A secure method for consumers to purchase products or services via debit, credit or smartcards by using RFID or NFC technology. + + + + + HinduTemple + A Hindu temple. + + + + + healthPlanDrugOption + TODO. + + + + + LikeAction + The act of expressing a positive sentiment about the object. An agent likes an object (a proposition, topic or theme) with participants. + + + + + + + + The total integer number of bedrooms in a some [[Accommodation]], [[ApartmentComplex]] or [[FloorPlan]]. + numberOfBedrooms + + + + + + WearableSizeGroupWomens + Size group "Womens" for wearables. + + + + + MayTreatHealthAspect + + + Related topics may be treated by a Topic. + + + chemicalComposition + + + The chemical composition describes the identity and relative ratio of the chemical elements that make up the substance. + + + + + DisabilitySupport + + DisabilitySupport: this is a benefit for disability support. + + + + + + attendees + A person attending the event. + + + + + A person or organization attending the event. + + attendee + + + + + + Specifying the health condition(s) of a patient, medical study, or other target audience. + + + + + healthCondition + + + + + A sub property of result. The review that resulted in the performing of the action. + resultReview + + + + + Event type: Exhibition event, e.g. at a museum, library, archive, tradeshow, ... + ExhibitionEvent + + + + + The unit of measurement given using the UN/CEFACT Common Code (3 characters) or a URL. Other codes than the UN/CEFACT Common Code may be used with a prefix followed by a colon. + + + unitCode + + + + + + + + + + PalliativeProcedure + A medical procedure intended primarily for palliative purposes, aimed at relieving the symptoms of an underlying health condition. + + + healthPlanNetworkId + + + + + Name or unique ID of network. (Networks are often reused across different insurance plans). + + + + composer + The person or organization who wrote a composition, or who is the composer of a work performed at some event. + + + + + + + + CampingPitch + + A [[CampingPitch]] is an individual place for overnight stay in the outdoors, typically being part of a larger camping site, or [[Campground]].\n\n +In British English a campsite, or campground, is an area, usually divided into a number of pitches, where people can camp overnight using tents or camper vans or caravans; this British English use of the word is synonymous with the American English expression campground. In American English the term campsite generally means an area where an individual, family, group, or military unit can pitch a tent or park a camper; a campground may contain many campsites. +(Source: Wikipedia see [https://en.wikipedia.org/wiki/Campsite](https://en.wikipedia.org/wiki/Campsite)).\n\n +See also the dedicated [document on the use of schema.org for marking up hotels and other forms of accommodations](/docs/hotels.html). + + + + + + suitableForDiet + Indicates a dietary restriction or guideline for which this recipe or menu item is suitable, e.g. diabetic, halal etc. + + + + + seatNumber + + + The location of the reserved seat (e.g., 27). + + + countriesNotSupported + + Countries for which the application is not supported. You can also provide the two-letter ISO 3166-1 alpha-2 country code. + + + + The type of procedure, for example Surgical, Noninvasive, or Percutaneous. + procedureType + + + + + + + + + + includedInDataCatalog + + + A data catalog which contains this dataset. + + + A data catalog which contains this dataset. + catalog + + + + + map + A URL to a map of the place. + + + A URL to a map of the place. + + + + hasMap + + + + + + A position played, performed or filled by a person or organization, as part of an organization. For example, an athlete in a SportsTeam might play in the position named 'Quarterback'. + + + + namedPosition + + + roleName + + + A role played, performed or filled by a person or organization. For example, the team of creators for a comic book might fill the roles named 'inker', 'penciller', and 'letterer'; or an athlete in a SportsTeam might play in the position named 'Quarterback'. + + + + + + + + + + + + + + + endDate + + The end date and time of the item (in [ISO 8601 date format](http://en.wikipedia.org/wiki/ISO_8601)). + + + + A characteristic of the described resource that is physiologically dangerous to some users. Related to WCAG 2.0 guideline 2.3 ([WebSchemas wiki lists possible values](http://www.w3.org/wiki/WebSchemas/Accessibility)). + + accessibilityHazard + + + + Audiences defined by a person's maximum age. + requiredMaxAge + + + + + + + The payment method(s) to which the payment charge specification applies. + appliesToPaymentMethod + + + + Anesthesia + A specific branch of medical science that pertains to study of anesthetics and their application. + + + + openingHoursSpecification + + + + The opening hours of a certain place. + + + qualifications + Specific qualifications required for this role or Occupation. + + + + + + + + + + + + + EventSeries + A series of [[Event]]s. Included events can relate with the series using the [[superEvent]] property. + +An EventSeries is a collection of events that share some unifying characteristic. For example, "The Olympic Games" is a series, which +is repeated regularly. The "2012 London Olympics" can be presented both as an [[Event]] in the series "Olympic Games", and as an +[[EventSeries]] that included a number of sporting competitions as Events. + +The nature of the association between the events in an [[EventSeries]] can vary, but typical examples could +include a thematic event series (e.g. topical meetups or classes), or a series of regular events that share a location, attendee group and/or organizers. + +EventSeries has been defined as a kind of Event to make it easy for publishers to use it in an Event context without +worrying about which kinds of series are really event-like enough to call an Event. In general an EventSeries +may seem more Event-like when the period of time is compact and when aspects such as location are fixed, but +it may also sometimes prove useful to describe a longer-term series as an Event. + + + + + The date of the first registration of the vehicle with the respective public authorities. + dateVehicleFirstRegistered + + + + + + + + A similar BioChemEntity, e.g., obtained by fingerprint similarity algorithms. + + bioChemSimilarity + + + + primaryPrevention + + A preventative therapy used to prevent an initial occurrence of the medical condition, such as vaccination. + + + + + + + + suggestedMeasurement + + + A suggested range of body measurements for the intended audience or person, for example inseam between 32 and 34 inches or height between 170 and 190 cm. Typically found on a size chart for wearable products. + + + A travel agency. + TravelAgency + + + + The edition of the print product in which the NewsArticle appears. + printEdition + + + + + lesserOrEqual + + + This ordering relation for qualitative values indicates that the subject is lesser than or equal to the object. + + + + + LimitedByGuaranteeCharity: Non-profit type referring to a charitable company that is limited by guarantee (UK). + + LimitedByGuaranteeCharity + + + + musicalKey + + The key, mode, or scale this composition uses. + + + + + + width + + + + The width of the item. + + + + + exerciseRelatedDiet + + + A sub property of instrument. The diet used in this action. + + + + + The larger organization that this organization is a [[subOrganization]] of, if any. + + + + parentOrganization + + + branchOf + + + The larger organization that this local business is a branch of, if any. Not to be confused with (anatomical)[[branch]]. + + + + + + Guidelines about quarantine rules, e.g. in the context of a pandemic. + + quarantineGuidelines + + + + + + median + The median value. + + + + + + + + + molecularWeight + This is the molecular weight of the entity being described, not of the parent. Units should be included in the form '&lt;Number&gt; &lt;unit&gt;', for example '12 amu' or as '&lt;QuantitativeValue&gt;. + + + PrognosisHealthAspect + + Typical progression and happenings of life course of the topic. + + + + Nonprofit501c16 + + Nonprofit501c16: Non-profit type referring to Cooperative Organizations to Finance Crop Operations. + + + + A cafe or coffee shop. + CafeOrCoffeeShop + + + + + broadcastAffiliateOf + + The media network(s) whose content is broadcast on this station. + + + + + + + + + + + hasRepresentation + + A common representation such as a protein sequence or chemical structure for this entity. For images use schema.org/image. + + + + + + + hasBioPolymerSequence + A symbolic representation of a BioChemEnity. For example, a nucleotide sequence of a Gene or an amino acid sequence of a Protein. + + + + Changes in the normal mechanical, physical, and biochemical functions that are associated with this activity or condition. + + + pathophysiology + + + + + + + financialAidEligible + + + A financial aid type or program which students may use to pay for tuition or fees associated with the program. + + + The playlist to which this recording belongs. + + inPlaylist + + + + The lowest price if the price is a range. + minPrice + + + + + + + + + + amount + + The amount of money. + + + + + + + + + The end of the availability of the product or service included in the offer. + + + + availabilityEnds + + + + + + + + broadcastFrequency + + + The frequency used for over-the-air broadcasts. Numeric values or simple ranges e.g. 87-99. In addition a shortcut idiom is supported for frequences of AM and FM radio channels, e.g. "87 FM". + + + + + + author + + The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. + + + + + + + Represents a relationship between two geometries (or the places they represent), relating a containing geometry to a contained geometry. "a contains b iff no points of b lie in the exterior of a, and at least one point of the interior of b lies in the interior of a". As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + geoContains + + + + OnlineOnly + Indicates that the item is available only online. + + + + + maintainer + + A maintainer of a [[Dataset]], software package ([[SoftwareApplication]]), or other [[Project]]. A maintainer is a [[Person]] or [[Organization]] that manages contributions to, and/or publication of, some (typically complex) artifact. It is common for distributions of software and data to be based on "upstream" sources. When [[maintainer]] is applied to a specific version of something e.g. a particular version or packaging of a [[Dataset]], it is always possible that the upstream source has a different maintainer. The [[isBasedOn]] property can be used to indicate such relationships between datasets to make the different maintenance roles clear. Similarly in the case of software, a package may have dedicated maintainers working on integration into software distributions such as Ubuntu, as well as upstream maintainers of the underlying work. + + + + + + The number of offers for the product. + + offerCount + + + + molecularFormula + + The empirical formula is the simplest whole number ratio of all the atoms in a molecule. + + + + + + homeLocation + + + + + A contact location for a person's residence. + + + hasPOS + + Points-of-Sales operated by the organization or person. + + + + + + nerve + The underlying innervation associated with the muscle. + + + + + + minValue + The lower value of some characteristic or property. + + + + + + + + + audienceType + The target group associated with a given audience (e.g. veterans, car owners, musicians, etc.). + + + + + + Continental size system for wearables. + + WearableSizeSystemContinental + + + A venue map (e.g. for malls, auditoriums, museums, etc.). + VenueMap + + + childMinAge + + Minimal age of the child. + + + + + The drive wheel configuration, i.e. which roadwheels will receive torque from the vehicle's engine via the drivetrain. + + + driveWheelConfiguration + + + + + + + engineType + + The type of engine or engines powering the vehicle. + + + + + + + The capacity of the fuel tank or in the case of electric cars, the battery. If there are multiple components for storage, this should indicate the total of all storage of the same type.\n\nTypical unit code(s): LTR for liters, GLL of US gallons, GLI for UK / imperial gallons, AMH for ampere-hours (for electrical vehicles). + + fuelCapacity + + + + An arrangement derived from the composition. + + + + musicArrangement + + + + + + appliesToDeliveryMethod + + The delivery method(s) to which the delivery charge or payment charge specification applies. + + + + Event that this person is a performer or participant in. + + performerIn + + + Additional menu item(s) such as a side dish of salad or side order of fries that can be added to this menu item. Additionally it can be a menu section containing allowed add-on menu items for this menu item. + + + + menuAddOn + + + + + + + transitTime + + The typical delay the order has been sent for delivery and the goods reach the final customer. Typical properties: minValue, maxValue, unitCode (d for DAY). + + + + + + An organization identifier that uniquely identifies a legal entity as defined in ISO 17442. + + leiCode + + + + PlasticSurgery + A specific branch of medical science that pertains to therapeutic or cosmetic repair or re-formation of missing, injured or malformed tissues or body parts by manual and instrumental means. + + + + + + requiredQuantity + The required quantity of the item(s). + + + + + + The act of marrying a person. + MarryAction + + + + + + album + A music album. + + + + + albums + + + A collection of music albums. + + + + + + + + sensoryRequirement + + A description of any sensory requirements and levels necessary to function on the job, including hearing and vision. Defined terms such as those in O*net may be used, but note that there is no way to specify the level of ability as well as its nature when using a defined term. + + + value + + + + The value of the quantitative value or property value node.\n\n* For [[QuantitativeValue]] and [[MonetaryAmount]], the recommended type for values is 'Number'.\n* For [[PropertyValue]], it can be 'Text;', 'Number', 'Boolean', or 'StructuredValue'.\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + + + + + + + + + + + speed + + The speed range of the vehicle. If the vehicle is powered by an engine, the upper limit of the speed range (indicated by [[maxValue]] should be the maximum speed achievable under regular conditions.\n\nTypical unit code(s): KMH for km/h, HM for mile per hour (0.447 04 m/s), KNT for knot\n\n*Note 1: Use [[minValue]] and [[maxValue]] to indicate the range. Typically, the minimal value is zero.\n* Note 2: There are many different ways of measuring the speed range. You can link to information about how the given value has been determined using the [[valueReference]] property. + + + providesService + + + The service provided by this channel. + + + A file containing slides or used for a presentation. + + PresentationDigitalDocument + + + bookFormat + The format of the book. + + + + + An auto parts store. + + AutoPartsStore + + + + + + The identifier for the account the payment will be applied to. + accountId + + + + + + Italian size system for wearables. + WearableSizeSystemIT + + + The expected departure time. + + + departureTime + + + + + An additional type for the item, typically used for adding more specific types from external vocabularies in microdata syntax. This is a relationship between something and a class that the thing is in. In RDFa syntax, it is better to use the native RDFa syntax - the 'typeof' attribute - for multiple types. Schema.org tools may have only weaker understanding of extra types, in particular those defined externally. + + additionalType + + + + + The GTIN-14 code of the product, or the product to which the offer refers. See [GS1 GTIN Summary](http://www.gs1.org/barcodes/technical/idkeys/gtin) for more details. + + + + gtin14 + + + + + + + A medical condition associated with this anatomy. + + relatedCondition + + + + + + + + + + runtimePlatform + Runtime platform or script interpreter dependencies (Example - Java v1, Python2.3, .Net Framework 3.0). + + + runtime + Runtime platform or script interpreter dependencies (Example - Java v1, Python2.3, .Net Framework 3.0). + + + + + + busNumber + + The unique identifier for the bus. + + + ZoneBoardingPolicy + The airline boards by zones of the plane. + + + + hasHealthAspect + + + Indicates the aspect or aspects specifically addressed in some [[HealthTopicContent]]. For example, that the content is an overview, or that it talks about treatment, self-care, treatments or their side-effects. + + + + OrderStatus representing that an order is in transit. + OrderInTransit + + + + + + The Value-added Tax ID of the organization or person. + vatID + + + + givenName + + Given name. In the U.S., the first name of a Person. + + + + fundedItem + + + + + + Indicates an item funded or sponsored through a [[Grant]]. + + + + + + releaseDate + + The release date of a product or product model. This can be used to distinguish the exact variant of a product. + + + + A Consortium is a membership [[Organization]] whose members are typically Organizations. + + Consortium + + + + + ShareAction + The act of distributing content to people for their amusement or edification. + + + + + Description of the absorption and elimination of drugs, including their concentration (pharmacokinetics, pK) and biological effects (pharmacodynamics, pD). + + clinicalPharmacology + + + + + + Description of the absorption and elimination of drugs, including their concentration (pharmacokinetics, pK) and biological effects (pharmacodynamics, pD). + clincalPharmacology + + + + + + applicationStartDate + The date at which the program begins collecting applications for the next enrollment cycle. + + + + + + + + + hasDriveThroughService + Indicates whether some facility (e.g. [[FoodEstablishment]], [[CovidTestingFacility]]) offers a service that can be used by driving through in a car. In the case of [[CovidTestingFacility]] such facilities could potentially help with social distancing from other potentially-infected users. + + + + liveBlogUpdate + + + An update to the LiveBlog. + + + Code used to redeem a discount. + + + discountCode + + + + The anatomical or organ system that this structure is part of. + partOfSystem + + + + + A city or town. + City + + + + WearableSizeGroupJuniors + Size group "Juniors" for wearables. + + + + + The count of total number of ratings. + ratingCount + + + + + + EvidenceLevelA + Data derived from multiple randomized clinical trials or meta-analyses. + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + UserLikes + + + + + A sub property of participant. The participant who is at the sending end of the action. + sender + + + + + + + + + + An entity which offers (sells / leases / lends / loans) the services / goods. A seller may also be a provider. + + + + seller + + + + + + + + + 'merchant' is an out-dated term for 'seller'. + + merchant + + + + + + numberOfLoanPayments + The number of payments contractually required at origination to repay the loan. For monthly paying loans this is the number of months from the contractual first payment date to the maturity date. + + + + + The act of consuming dynamic/moving visual content. + WatchAction + + + + + + + + + The country of origin of something, including products as well as creative works such as movie and TV content. + +In the case of TV and movie, this would be the country of the principle offices of the production company or individual responsible for the movie. For other kinds of [[CreativeWork]] it is difficult to provide fully general guidance, and properties such as [[contentLocation]] and [[locationCreated]] may be more applicable. + +In the case of products, the country of origin of the product. The exact interpretation of this may vary by context and product type, and cannot be fully enumerated here. + + countryOfOrigin + + + + + + vehicleIdentificationNumber + + + + + + + The serial number or any alphanumeric identifier of a particular product. When attached to an offer, it is a shortcut for the serial number of the product included in the offer. + + serialNumber + + + + The Vehicle Identification Number (VIN) is a unique serial number used by the automotive industry to identify individual motor vehicles. + + + + ReturnLabelDownloadAndPrint + + Indicated that a return label must be downloaded and printed by the customer. + + + + + termsOfService + + + + + Human-readable terms of service documentation. + + + + BasicIncome: this is a benefit for basic income. + + BasicIncome + + + + Target Operating System / Product to which the code applies. If applies to several versions, just the product name can be used. + targetProduct + + + + + smiles + + A specification in form of a line notation for describing the structure of chemical species using short ASCII strings. Double bond stereochemistry \ indicators may need to be escaped in the string in formats where the backslash is an escape character. + + + + + + + The target audience for this permit. + + permitAudience + + + Pediatric + + + A specific branch of medical science that specializes in the care of infants, children and adolescents. + + + + The locality in which the street address is, and which is in the region. For example, Mountain View. + + addressLocality + + + + + orderItemStatus + The current status of the order item. + + + + BodyMeasurementChest + Maximum girth of chest. Used, for example, to fit men's suits. + + + + The location(s) applicants can apply from. This is usually used for telecommuting jobs where the applicant does not need to be in a physical office. Note: This should not be used for citizenship or work visa requirements. + + + + applicantLocationRequirements + + + + creditText + + + Text that can be used to credit person(s) and/or organization(s) associated with a published Creative Work. + + + + + A floorplan of some [[Accommodation]]. + + + + accommodationFloorPlan + + + + + + codingSystem + + The coding system, e.g. 'ICD-10'. + + + + RadioBroadcastService + + + A delivery service through which radio content is provided via broadcast over the air or online. + + + + + The GTIN-8 code of the product, or the product to which the offer refers. This code is also known as EAN/UCC-8 or 8-digit EAN. See [GS1 GTIN Summary](http://www.gs1.org/barcodes/technical/idkeys/gtin) for more details. + gtin8 + + + + + + + + + + targetPlatform + + Type of app development: phone, Metro style, desktop, XBox, etc. + + + + + + Description of what changed in this version. + releaseNotes + + + + + A secondary value that provides additional information on the original value, e.g. a reference temperature or a type of measurement. + + + valueReference + + + + + + + + + + + The number of words in the text of the Article. + + wordCount + + + + height + + + + + + The height of the item. + + + + borrower + + A sub property of participant. The person that borrows the object being lent. + + + + + Data type: Floating number. + + Float + + + SeatingMap + A seating map. + + + DryCleaningOrLaundry + A dry-cleaning business. + + + + FastFoodRestaurant + A fast-food restaurant. + + + + + ActiveNotRecruiting + Active, but not recruiting new participants. + + + educationalCredentialAwarded + A description of the qualification, award, certificate, diploma or other educational credential awarded as a consequence of successful completion of this course or program. + + + + + + + + + + Item(s) being shipped. + itemShipped + + + + A designation by the US FDA signifying that studies in animals or humans have demonstrated fetal abnormalities and/or there is positive evidence of human fetal risk based on adverse reaction data from investigational or marketing experience, and the risks involved in use of the drug in pregnant women clearly outweigh potential benefits. + FDAcategoryX + + + + Bacteria + + Pathogenic bacteria that cause bacterial infection. + + + + A branch of medicine that is involved in the dental care. + Dentistry + + + + + originalMediaContextDescription + + + + + description + + A description of the item. + + + + Describes, in a [[MediaReview]] when dealing with [[DecontextualizedContent]], background information that can contribute to better interpretation of the [[MediaObject]]. + + + + + characterAttribute + A piece of data that represents a particular aspect of a fictional character (skill, power, character points, advantage, disadvantage). + + + + + + The duration for which the given offer is valid. + + eligibleDuration + + + + + totalPaymentDue + + + + The total amount due. + + + + + paymentMethod + The name of the credit card or other method of payment for the order. + + + + + + The movement the muscle generates. + muscleAction + + + + Renal + + A specific branch of medical science that pertains to the study of the kidneys and its respective disease states. + + + + + + Specifies either a fixed return date or the number of days (from the delivery date) that a product can be returned. Used when the [[returnPolicyCategory]] property is specified as [[MerchantReturnFiniteReturnWindow]]. + + + + + merchantReturnDays + + + + + + + A product measurement, for example the inseam of pants, the wheel size of a bicycle, or the gauge of a screw. Usually an exact measurement, but can also be a range of measurements for adjustable products, for example belts and ski bindings. + hasMeasurement + + + + + Status of a game server. + + + serverStatus + + + Distillery + + + A distillery. + + + + departureGate + + Identifier of the flight's departure gate. + + + + relevantSpecialty + If applicable, a medical specialty in which this entity is relevant. + + + + + + + numberOfPreviousOwners + + + The number of owners of the vehicle, including the current one.\n\nTypical unit code(s): C62 + + + + Indicates the [NATO stock number](https://en.wikipedia.org/wiki/NATO_Stock_Number) (nsn) of a [[Product]]. + + nsn + + + + + + beneficiaryBank + + + + + + + A bank or bank’s branch, financial institution or international financial institution operating the beneficiary’s bank account or releasing funds for the beneficiary. + + + + The unit in which the drug is measured, e.g. '5 mg tablet'. + + drugUnit + + + + + PhotographAction + + The act of capturing still images of objects using a camera. + + + + OpinionNewsArticle + An [[OpinionNewsArticle]] is a [[NewsArticle]] that primarily expresses opinions rather than journalistic reporting of news and events. For example, a [[NewsArticle]] consisting of a column or [[Blog]]/[[BlogPosting]] entry in the Opinions section of a news publication. + + + + + + + A piece of sculpture. + Sculpture + + + Identifier of the flight's departure terminal. + + + departureTerminal + + + A sub property of location. The entertainment business where the action occurred. + + + + entertainmentBusiness + + + + + weightTotal + + + The permitted total weight of the loaded vehicle, including passengers and cargo and the weight of the empty vehicle.\n\nTypical unit code(s): KGM for kilogram, LBR for pound\n\n* Note 1: You can indicate additional information in the [[name]] of the [[QuantitativeValue]] node.\n* Note 2: You may also link to a [[QualitativeValue]] node that provides additional information using [[valueReference]].\n* Note 3: Note that you can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + cutoffTime + Order cutoff time allows merchants to describe the time after which they will no longer process orders received on that day. For orders processed after cutoff time, one day gets added to the delivery time estimate. This property is expected to be most typically used via the [[ShippingRateSettings]] publication pattern. The time is indicated using the ISO-8601 Time format, e.g. "23:30:00-05:00" would represent 6:30 pm Eastern Standard Time (EST) which is 5 hours behind Coordinated Universal Time (UTC). + + + + + + sdLicense + + + + A license document that applies to this structured data, typically indicated by URL. + + + + + + + + reviewedBy + People or organizations that have reviewed the content on this web page for accuracy and/or completeness. + + + correctionsPolicy + For an [[Organization]] (e.g. [[NewsMediaOrganization]]), a statement describing (in news media, the newsroom’s) disclosure and correction policy for errors. + + + + + + + + + + + People working for this organization. + + + + employee + + Someone working for this organization. + + + + employees + + + + EvidenceLevelC + + Only consensus opinion of experts, case studies, or standard-of-care. + + + + + + + The weight of the product or person. + weight + + + + + + originalMediaLink + + + Link to the page containing an original version of the content, or directly to an online copy of the original [[MediaObject]] content, e.g. video file. + + + + + Relates a term (i.e. a property, class or enumeration) to one that supersedes it. + + + supersededBy + + + + + + + repetitions + + + Number of times one should repeat the activity. + + + + + + Campground + A camping site, campsite, or [[Campground]] is a place used for overnight stay in the outdoors, typically containing individual [[CampingPitch]] locations. \n\n +In British English a campsite is an area, usually divided into a number of pitches, where people can camp overnight using tents or camper vans or caravans; this British English use of the word is synonymous with the American English expression campground. In American English the term campsite generally means an area where an individual, family, group, or military unit can pitch a tent or park a camper; a campground may contain many campsites (Source: Wikipedia see [https://en.wikipedia.org/wiki/Campsite](https://en.wikipedia.org/wiki/Campsite)).\n\n + +See also the dedicated [document on the use of schema.org for marking up hotels and other forms of accommodations](/docs/hotels.html). + + + + + + + + + Additional details to capture the origin of the cost data. For example, 'Medicare Part B'. + costOrigin + + + + administrationRoute + + + A route by which this drug may be administered, e.g. 'oral'. + + + + + A food or drink item contained in a menu or menu section. + + hasMenuItem + + + SingleCenterTrial + A trial that takes place at a single center. + + + + Physiotherapy + + + The practice of treatment of disease, injury, or deformity by physical methods such as massage, heat treatment, and exercise rather than by drugs or surgery.. + + + + + + The production company or studio responsible for the item e.g. series, video game, episode etc. + + + + productionCompany + + + + + + + True if the broadcast is of a live event. + isLiveBroadcast + + + + Name of the County of the NHSN facility that this data record applies to. Use [[cvdFacilityId]] to identify the facility. To provide other details, [[healthcareReportingData]] can be used on a [[Hospital]] entry. + + cvdFacilityCounty + + + + + + + CheckOutAction + The act of an agent communicating (service provider, social media, etc) their departure of a previously reserved service (e.g. flight check in) or place (e.g. hotel).\n\nRelated actions:\n\n* [[CheckInAction]]: The antonym of CheckOutAction.\n* [[DepartAction]]: Unlike DepartAction, CheckOutAction implies that the agent is informing/confirming the end of a previously reserved service.\n* [[CancelAction]]: Unlike CancelAction, CheckOutAction implies that the agent is informing/confirming the end of a previously reserved service. + + + + + mediaItemAppearance + + + In the context of a [[MediaReview]], indicates specific media item(s) that are grouped using a [[MediaReviewItem]]. + + + + PaidLeave + + PaidLeave: this is a benefit for paid leave. + + + SuspendAction + + The act of momentarily pausing a device or application (e.g. pause music playback or pause a timer). + + + + + cvdNumC19HospPats + numc19hosppats - HOSPITALIZED: Patients currently hospitalized in an inpatient care location who have suspected or confirmed COVID-19. + + + + + + The actual body of the review. + reviewBody + + + + Specifies a MerchantReturnPolicy that may be applicable. + + + + hasMerchantReturnPolicy + + + + + + diet + + + A sub property of instrument. The diet used in this action. + + + + + + A sub property of participant. The opponent on this action. + + + opponent + + + postOp + + + + A description of the postoperative procedures, care, and/or followups for this device. + + + + + biologicalRole + A role played by the BioChemEntity within a biological context. + + + + + An advertising section of the page. + + WPAdBlock + + + Fictional person connected with a creative work. + character + + + + + softwareHelp + + Software application help. + + + + + + + + titleEIDR + + + + An [EIDR](https://eidr.org/) (Entertainment Identifier Registry) [[identifier]] representing at the most general/abstract level, a work of film or television. + +For example, the motion picture known as "Ghostbusters" has a titleEIDR of "10.5240/7EC7-228A-510A-053E-CBB8-J". This title (or work) may have several variants, which EIDR calls "edits". See [[editEIDR]]. + +Since schema.org types like [[Movie]] and [[TVEpisode]] can be used for both works and their multiple expressions, it is possible to use [[titleEIDR]] alone (for a general description), or alongside [[editEIDR]] for a more edit-specific description. + + + + + + Indicates the [[productGroupID]] for a [[ProductGroup]] that this product [[isVariantOf]]. + + inProductGroupWithID + + + + + + + The amount of time in a term as defined by the institution. A term is a length of time where students take one or more classes. Semesters and quarters are common units for term. + + termDuration + + + + Content features of the resource, such as accessible media, alternatives and supported enhancements for accessibility ([WebSchemas wiki lists possible values](http://www.w3.org/wiki/WebSchemas/Accessibility)). + accessibilityFeature + + + + + Nonprofit501c2 + + Nonprofit501c2: Non-profit type referring to Title-holding Corporations for Exempt Organizations. + + + + The textual content of this CreativeWork. + + text + + + + An actor, e.g. in tv, radio, movie, video games etc. Actors can be associated with individual items or with a series, episode, clip. + + + + + + + + actors + + + + + + + returnFees + + + + The type of return fees for purchased products (for any return reason) + + + featureList + + + Features or modules provided by this application (and possibly required by other applications). + + + + affectedBy + + + Drugs that affect the test's results. + + + + Any complaint sensed and expressed by the patient (therefore defined as subjective) like stomachache, lower-back pain, or fatigue. + + MedicalSymptom + + + + + salaryCurrency + + The currency (coded using [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) ) used for the main salary information in this job posting or for this employee. + + + + Where a taxi will pick up a passenger or a rental car can be picked up. + + + + pickupLocation + + + + + + + knowsLanguage + Of a [[Person]], and less typically of an [[Organization]], to indicate a known language. We do not distinguish skill levels or reading/writing/speaking/signing here. Use language codes from the [IETF BCP 47 standard](http://tools.ietf.org/html/bcp47). + + + + + + + + measurementTechnique + + + + + + A technique or technology used in a [[Dataset]] (or [[DataDownload]], [[DataCatalog]]), +corresponding to the method used for measuring the corresponding variable(s) (described using [[variableMeasured]]). This is oriented towards scientific and scholarly dataset publication but may have broader applicability; it is not intended as a full representation of measurement, but rather as a high level summary for dataset discovery. + +For example, if [[variableMeasured]] is: molecule concentration, [[measurementTechnique]] could be: "mass spectrometry" or "nmr spectroscopy" or "colorimetry" or "immunofluorescence". + +If the [[variableMeasured]] is "depression rating", the [[measurementTechnique]] could be "Zung Scale" or "HAM-D" or "Beck Depression Inventory". + +If there are several [[variableMeasured]] properties recorded for some given data object, use a [[PropertyValue]] for each [[variableMeasured]] and attach the corresponding [[measurementTechnique]]. + + + + + + + The date that payment is due. + + paymentDue + + + The date that payment is due. + + + paymentDueDate + + + + + + + + Nonprofit501c3: Non-profit type referring to Religious, Educational, Charitable, Scientific, Literary, Testing for Public Safety, to Foster National or International Amateur Sports Competition, or Prevention of Cruelty to Children or Animals Organizations. + Nonprofit501c3 + + + + + + referenceQuantity + The reference quantity for which a certain price applies, e.g. 1 EUR per 4 kWh of electricity. This property is a replacement for unitOfMeasurement for the advanced cases where the price does not relate to a standard unit. + + + + + A [[LibrarySystem]] is a collaborative system amongst several libraries. + + + + LibrarySystem + + + + announcementLocation + Indicates a specific [[CivicStructure]] or [[LocalBusiness]] associated with the SpecialAnnouncement. For example, a specific testing facility or business with special opening hours. For a larger geographic region like a quarantine of an entire region, use [[spatialCoverage]]. + + + + + + + The spatialCoverage of a CreativeWork indicates the place(s) which are the focus of the content. It is a subproperty of + contentLocation intended primarily for more technical and detailed materials. For example with a Dataset, it indicates + areas that the dataset describes: a dataset of New York weather would have spatialCoverage which was the place: the state of New York. + + + + + spatialCoverage + + + + + + + + + + + + actionOption + A sub property of object. The options subject to this action. + + + + + + option + A sub property of object. The options subject to this action. + + + A sub property of object. The person or organization being followed. + + + + followee + + + + Indicates an OfferCatalog listing for this Organization, Person, or Service. + + hasOfferCatalog + + + + + + + encodings + + A media object that encodes this CreativeWork. + + + encoding + A media object that encodes this CreativeWork. This property is a synonym for associatedMedia. + + + + + + + + + The "temporal" property can be used in cases where more specific properties +(e.g. [[temporalCoverage]], [[dateCreated]], [[dateModified]], [[datePublished]]) are not known to be appropriate. + + temporal + + + + + producer + + The person or organization who produced the work (e.g. music album, movie, tv/radio series etc.). + + + + + Rheumatologic + A specific branch of medical science that deals with the study and treatment of rheumatic, autoimmune or joint diseases. + + + + usedToDiagnose + + A condition the test is used to diagnose. + + + + + + + + eduQuestionType + For questions that are part of learning resources (e.g. Quiz), eduQuestionType indicates the format of question being given. Example: "Multiple choice", "Open ended", "Flashcard". + + + + + Optometric + + The science or practice of testing visual acuity and prescribing corrective lenses. + + + + + addressCountry + + + + The country. For example, USA. You can also provide the two-letter [ISO 3166-1 alpha-2 country code](http://en.wikipedia.org/wiki/ISO_3166-1). + + + + + + + + The number or type of airbags in the vehicle. + numberOfAirbags + + + + + + + The stop or station from which the bus arrives. + arrivalBusStop + + + A specific branch of medical science that pertains to treating diseases, injuries and deformities by manual and instrumental means. + Surgical + + + + + + secondaryPrevention + + A preventative therapy used to prevent reoccurrence of the medical condition after an initial episode of the condition. + + + + + + loanRepaymentForm + + + A form of paying back money previously borrowed from a lender. Repayment usually takes the form of periodic payments that normally include part principal plus interest in each payment. + + + Indicates that the item is refurbished. + RefurbishedCondition + + + The [SHA-2](https://en.wikipedia.org/wiki/SHA-2) SHA256 hash of the content of the item. For example, a zero-length input has value 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' + + + sha256 + + + + + + An Offer which must be accepted before the user can perform the Action. For example, the user may need to buy a movie before being able to watch it. + + + + + expectsAcceptanceOf + + + + + Responsibilities associated with this role or Occupation. + + + responsibilities + + + + Ultrasound imaging. + + Ultrasound + + + + + ComicCoverArt + + The artwork on the cover of a comic. + + + + + occupationalCredentialAwarded + A description of the qualification, award, certificate, diploma or other occupational credential awarded as a consequence of successful completion of this course or program. + + + + + + + + + + + The latest date the package may arrive. + expectedArrivalUntil + + + + A FundingAgency is an organization that implements one or more [[FundingScheme]]s and manages + the granting process (via [[Grant]]s, typically [[MonetaryGrant]]s). + A funding agency is not always required for grant funding, e.g. philanthropic giving, corporate sponsorship etc. + +Examples of funding agencies include ERC, REA, NIH, Bill and Melinda Gates Foundation... + + + + + FundingAgency + + + + A possible complication and/or side effect of this therapy. If it is known that an adverse outcome is serious (resulting in death, disability, or permanent damage; requiring hospitalization; or is otherwise life-threatening or requires immediate medical attention), tag it as a seriouseAdverseOutcome instead. + + + + adverseOutcome + + + + + Type(s) of exercise or activity, such as strength training, flexibility training, aerobics, cardiac rehabilitation, etc. + + exerciseType + + + + + partySize + Number of people the reservation should accommodate. + + + + + + + + The condition, complication, or symptom whose risk is being estimated. + estimatesRiskOf + + + + Actual bytes of the media object, for example the image file or video file. + + + contentUrl + + + + WearableMeasurementSleeve + + Measurement of the sleeve length, for example of a shirt + + + The steering position is on the left side of the vehicle (viewed from the main direction of driving). + + LeftHandDriving + + + A diet focused on reduced calorie intake. + LowCalorieDiet + + + + advanceBookingRequirement + + + The amount of time that is required between accepting the offer and the actual usage of the resource or service. + + + + diagnosis + One or more alternative conditions considered in the differential diagnosis process as output of a diagnosis process. + + + + + + + + A taxi stand. + TaxiStand + + + + + Otolaryngologic + A specific branch of medical science that is concerned with the ear, nose and throat and their respective disease states. + + + + isRelatedTo + + + + + A pointer to another, somehow related product (or multiple products). + + + + regionsAllowed + + The regions where the media is allowed. If not specified, then it's assumed to be allowed everywhere. Specify the countries in [ISO 3166 format](http://en.wikipedia.org/wiki/ISO_3166). + + + + + + + The legal value of this legislation file. The same legislation can be written in multiple files with different legal values. Typically a digitally signed PDF have a "stronger" legal value than the HTML file of the same act. + + legislationLegalValue + + + + + enginePower + + + The power of the vehicle's engine. + Typical unit code(s): KWT for kilowatt, BHP for brake horsepower, N12 for metric horsepower (PS, with 1 PS = 735,49875 W)\n\n* Note 1: There are many different ways of measuring an engine's power. For an overview, see [http://en.wikipedia.org/wiki/Horsepower#Engine_power_test_codes](http://en.wikipedia.org/wiki/Horsepower#Engine_power_test_codes).\n* Note 2: You can link to information about how the given value has been determined using the [[valueReference]] property.\n* Note 3: You can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + + + + Identifies a price component (for example, a line item on an invoice), part of the total price for an offer. + priceComponentType + + + + + + + + + + The point-in-time at which the provided description of the legislation is valid (e.g. : when looking at the law on the 2016-04-07 (= dateVersion), I get the consolidation of 2015-04-12 of the "National Insurance Contributions Act 2015") + + + legislationDateVersion + + + ApplyAction + The act of registering to an organization/service without the guarantee to receive it.\n\nRelated actions:\n\n* [[RegisterAction]]: Unlike RegisterAction, ApplyAction has no guarantees that the application will be accepted. + + + + A box is the area enclosed by the rectangle formed by two points. The first point is the lower corner, the second point is the upper corner. A box is expressed as two points separated by a space character. + box + + + + + postalCodePrefix + + + A defined range of postal codes indicated by a common textual prefix. Used for non-numeric systems such as UK. + + + + + customerRemorseReturnFees + + + The type of return fees if the product is returned due to customer remorse. + + + + + + healthPlanCopay + + Whether The copay amount. + + + + + + estimatedFlightDuration + The estimated time the flight will take. + + + + + + + + AdvertiserContentArticle + + An [[Article]] that an external entity has paid to place or to produce to its specifications. Includes [advertorials](https://en.wikipedia.org/wiki/Advertorial), sponsored content, native advertising and other paid content. + + + + recipeCategory + + The category of the recipe—for example, appetizer, entree, etc. + + + + + + energyEfficiencyScaleMax + + Specifies the most energy efficient class on the regulated EU energy consumption scale for the product category a product belongs to. For example, energy consumption for televisions placed on the market after January 1, 2020 is scaled from D to A+++. + + + + PercutaneousProcedure + A type of medical procedure that involves percutaneous techniques, where access to organs or tissue is achieved via needle-puncture of the skin. For example, catheter-based procedures like stent delivery. + + + ReimbursementCap + + The drug's cost represents the maximum reimbursement paid by an insurer for the drug. + + + processingTime + + + Estimated processing time for the service using this channel. + + + WearableMeasurementInseam + + Measurement of the inseam, for example of pants + + + + masthead + + + + For a [[NewsMediaOrganization]], a link to the masthead page or a page listing top editorial management. + + + + + + + + + + The number of membership points earned by the member. If necessary, the unitText can be used to express the units the points are issued in. (e.g. stars, miles, etc.) + + + membershipPointsEarned + + + All the documents published by an official publisher should have at least the legal value level "OfficialLegalValue". This indicates that the document was published by an organisation with the public task of making it available (e.g. a consolidated version of a EU directive published by the EU Office of Publications). + + OfficialLegalValue + + + + + + + + Any precaution, guidance, contraindication, etc. related to consumption of alcohol while taking this drug. + alcoholWarning + + + + + + + owns + + + Products owned by the organization or person. + + + A notary. + + Notary + + + BefriendAction + + The act of forming a personal connection with someone (object) mutually/bidirectionally/symmetrically.\n\nRelated actions:\n\n* [[FollowAction]]: Unlike FollowAction, BefriendAction implies that the connection is reciprocal. + + + + cholesterolContent + The number of milligrams of cholesterol. + + + + + + The default value of the input. For properties that expect a literal, the default is a literal value, for properties that expect an object, it's an ID reference to one of the current values. + + defaultValue + + + priceSpecification + + + + + + One or more detailed price specifications, indicating the unit price and delivery or payment charges. + + + numberOfAccommodationUnits + + + Indicates the total (available plus unavailable) number of accommodation units in an [[ApartmentComplex]], or the number of accommodation units for a specific [[FloorPlan]] (within its specific [[ApartmentComplex]]). See also [[numberOfAvailableAccommodationUnits]]. + + + + + + + + The number of credits or units awarded by a Course or required to complete an EducationalOccupationalProgram. + + + + numberOfCredits + + + + + A clothing store. + ClothingStore + + + + SalePrice + + Represents a sale price (usually active for a limited period) of an offered product. + + + WPHeader + + The header section of the page. + + + foundingLocation + + The place where the Organization was founded. + + + + calories + + The number of calories. + + + + + Specifies the CreativeWork associated with the UserComment. + discusses + + + + + PatientExperienceHealthAspect + + Content about the real life experience of patients or people that have lived a similar experience about the topic. May be forums, topics, Q-and-A and related material. + + + + priceType + Defines the type of a price specified for an offered product, for example a list price, a (temporary) sale price or a manufacturer suggested retail price. If multiple prices are specified for an offer the [[priceType]] property can be used to identify the type of each such specified price. The value of priceType can be specified as a value from enumeration PriceTypeEnumeration or as a free form text string for price types that are not already predefined in PriceTypeEnumeration. + + + + + + + Foot length (measured between end of the most prominent toe and the most prominent part of the heel). Used, for example, to measure socks. + + BodyMeasurementFoot + + + + A bike store. + + BikeStore + + + coverageEndTime + + + The time when the live blog will stop covering the Event. Note that coverage may continue after the Event concludes. + + + + + + + A medical specialty of the provider. + + medicalSpecialty + + + + + A CreativeWork attached to the message. + + messageAttachment + + + The label that issued the release. + + + recordLabel + + + + + + + BodyMeasurementBust + Maximum girth of bust. Used, for example, to fit women's suits. + + + + + + + + For a [[Claim]] interpreted from [[MediaObject]] content + sed to indicate a claim contained, implied or refined from the content of a [[MediaObject]]. + claimInterpreter + + + + Audiences defined by a person's minimum age. + requiredMinAge + + + + + cvdNumICUBeds + + + + numicubeds - ICU BEDS: Total number of staffed inpatient intensive care unit (ICU) beds. + + + File size in (mega/kilo) bytes. + + + contentSize + + + + CrossSectional + Studies carried out on pre-existing data (usually from 'snapshot' surveys), such as that collected by the Census Bureau. Sometimes called Prevalence Studies. + + + associatedAnatomy + + + + + The anatomy of the underlying organ system or structures associated with this entity. + + + + + A resource that was used in the creation of this resource. This term can be repeated for multiple sources. For example, http://example.com/great-multiplication-intro.html. + + + + + + + A resource from which this work is derived or from which it is a modification or adaption. + + isBasedOn + + + + + + isBasedOnUrl + + + availableFrom + + When the item is available for pickup from the store, locker, etc. + + + + The total delay between the receipt of the order and the goods reaching the final customer. + + + + + deliveryTime + + + + Content coded 'edited or cropped content' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'edited or cropped content': The video has been edited or rearranged. This category applies to time edits, including editing multiple videos together to alter the story being told or editing out large portions from a video. + +For an [[ImageObject]] to be 'edited or cropped content': Presenting a part of an image from a larger whole to mislead the viewer. + +For an [[ImageObject]] with embedded text to be 'edited or cropped content': Presenting a part of an image from a larger whole to mislead the viewer. + +For an [[AudioObject]] to be 'edited or cropped content': The audio has been edited or rearranged. This category applies to time edits, including editing multiple audio clips together to alter the story being told or editing out large portions from the recording. + + EditedOrCroppedContent + + + + + reviewRating + + + The rating given in this review. Note that reviews can themselves be rated. The ```reviewRating``` applies to rating given by the review. The [[aggregateRating]] property applies to the review itself, as a creative work. + + + + Strength of evidence of the data used to formulate the guideline (enumerated). + + + evidenceLevel + + + URL of a reference Web page that unambiguously indicates the item's identity. E.g. the URL of the item's Wikipedia page, Wikidata entry, or official website. + + sameAs + + + + + + A Category code contained in this code set. + + + + + + + hasDefinedTerm + A Defined Term contained in this term set. + + + + + + hasCategoryCode + + + + + The method (from an enumeration) by which the customer obtains a return shipping label for a defect product. + + + itemDefectReturnLabelSource + + + + + Range of acceptable values for a typical patient, when applicable. + + normalRange + + + + cookTime + + + + performTime + + The length of time it takes to perform instructions or a direction (not including time to prepare the supplies), in [ISO 8601 duration format](http://en.wikipedia.org/wiki/ISO_8601). + + + + The time it takes to actually cook the dish, in [ISO 8601 duration format](http://en.wikipedia.org/wiki/ISO_8601). + + + + + When a taxi will pickup a passenger or a rental car can be picked up. + pickupTime + + + + + + + The muscle whose action counteracts the specified muscle. + + + antagonist + + + + + mileageFromOdometer + + The total distance travelled by the particular vehicle since its initial production, as read from its odometer.\n\nTypical unit code(s): KMT for kilometers, SMI for statute miles + + + The name of the application suite to which the application belongs (e.g. Excel belongs to Office). + + + applicationSuite + + + An associated logo. + + + + + + + + + logo + + + + availableIn + + The location in which the strength is available. + + + + + travelBans + + + + + Information about travel bans, e.g. in the context of a pandemic. + + + + + + numberOfDoors + The number of doors.\n\nTypical unit code(s): C62 + + + + + + + + status + + + The status of the study (enumerated). + + + + + A short textual code that uniquely identifies the value. + + + + + termCode + + A code that identifies this [[DefinedTerm]] within a [[DefinedTermSet]] + + + + + + + + + codeValue + + + deliveryAddress + + + Destination address. + + + ExerciseGym + + A gym. + + + returnPolicyCategory + Specifies an applicable return policy (from an enumeration). + + + + + + + + + + An episode of a TV/radio series or season. + episodes + + + + + + + episode + + + An episode of a tv, radio or game media within a series or season. + + + + + + + + + + Indicates (by URL or string) a particular version of a schema used in some CreativeWork. This property was created primarily to + indicate the use of a specific schema.org release, e.g. ```10.0``` as a simple string, or more explicitly via URL, ```https://schema.org/docs/releases.html#v10.0```. There may be situations in which other schemas might usefully be referenced this way, e.g. ```http://dublincore.org/specifications/dublin-core/dces/1999-07-02/``` but this has not been carefully explored in the community. + + schemaVersion + + + + hasCourse + + + A course or class that is one of the learning opportunities that constitute an educational / occupational program. No information is implied about whether the course is mandatory or optional; no guarantee is implied about whether the course will be available to everyone on the program. + + + + + byDay + + Defines the day(s) of the week on which a recurring [[Event]] takes place. May be specified using either [[DayOfWeek]], or alternatively [[Text]] conforming to iCal's syntax for byDay recurrence rules. + + + + + + EatAction + The act of swallowing solid objects. + + + + + + The date on which the CreativeWork was created or the item was added to a DataFeed. + + + + + dateCreated + + + + + + + + legislationDate + The date of adoption or signature of the legislation. This is the date at which the text is officially aknowledged to be a legislation, even though it might not even be published or in force. + + + + + benefits + Description of benefits associated with the job. + + + + + jobBenefits + Description of benefits associated with the job. + + + + + + + + + A field of public health focusing on improving health characteristics of a defined population in relation with their geographical or environment areas. + CommunityHealth + + + How the procedure is performed. + howPerformed + + + + + + Assets required to secure loan or credit repayments. It may take form of third party pledge, goods, financial instruments (cash, securities, etc.) + + requiredCollateral + + + + + + A theater group or company, for example, the Royal Shakespeare Company or Druid Theatre. + TheaterGroup + + + + + + + The RxCUI drug identifier from RXNORM. + rxcui + + + + Conversation + + One or more messages between organizations or people on a particular topic. Individual messages can be linked to the conversation with isPartOf or hasPart properties. + + + + + An abstract is a short description that summarizes a [[CreativeWork]]. + abstract + + + + + The date when the item becomes valid. + validFrom + + + + + + + + + + + + + + + + + interpretedAsClaim + Used to indicate a specific claim contained, implied, translated or refined from the content of a [[MediaObject]] or other [[CreativeWork]]. The interpreting party can be indicated using [[claimInterpreter]]. + + + + + FDAcategoryC + A designation by the US FDA signifying that animal reproduction studies have shown an adverse effect on the fetus and there are no adequate and well-controlled studies in humans, but potential benefits may warrant use of the drug in pregnant women despite potential risks. + + + + + The system of medicine that includes this MedicalEntity, for example 'evidence-based', 'homeopathic', 'chiropractic', etc. + medicineSystem + + + + + + applicationDeadline + + The date at which the program stops collecting applications for the next enrollment cycle. + + + + + newsUpdatesAndGuidelines + + Indicates a page with news updates and guidelines. This could often be (but is not required to be) the main page containing [[SpecialAnnouncement]] markup on a site. + + + + + + + An automatic payment system is in place and will be used. + PaymentAutomaticallyApplied + + + + + The page on which the work starts; for example "135" or "xiii". + + + + + + pageStart + + + + + EmployerAggregateRating + + An aggregate rating of an Organization related to its role as an employer. + + + + Operating systems supported (Windows 7, OSX 10.6, Android 1.6). + operatingSystem + + + + + playersOnline + Number of players on the server. + + + + + healthPlanCoinsuranceOption + + + + Whether the coinsurance applies before or after deductible, etc. TODO: Is this a closed set? + + + + + tocContinuation + + + A [[HyperTocEntry]] can have a [[tocContinuation]] indicated, which is another [[HyperTocEntry]] that would be the default next item to play or render. + + + + chemicalRole + + + + + A role played by the BioChemEntity within a chemical context. + + + + endorsers + + + + People or organizations that endorse the plan. + + + + + A person or organization that supports (sponsors) something through some kind of financial contribution. + + + + + + + + + + + + + sponsor + A person or organization that supports a thing through a pledge, promise, or financial contribution. e.g. a sponsor of a Medical Study or a corporate sponsor of an event. + + + + + + funder + + + + earlyPrepaymentPenalty + + + The amount to be paid as a penalty in the event of early payment of the loan. + + + + + + Any FDA or other warnings about the drug (text or URL). + + warning + + + + + The type of service being offered, e.g. veterans' benefits, emergency relief, etc. + + serviceType + + + + + Suspended. + + Suspended + + + + The number of grams of trans fat. + transFatContent + + + + + + + + The fax number. + + faxNumber + + + + + + + A medical service available from this provider. + availableService + + + + + + The act of an agent communicating (service provider, social media, etc) their arrival by registering/confirming for a previously reserved service (e.g. flight check in) or at a place (e.g. hotel), possibly resulting in a result (boarding pass, etc).\n\nRelated actions:\n\n* [[CheckOutAction]]: The antonym of CheckInAction.\n* [[ArriveAction]]: Unlike ArriveAction, CheckInAction implies that the agent is informing/confirming the start of a previously reserved service.\n* [[ConfirmAction]]: Unlike ConfirmAction, CheckInAction implies that the agent is informing/confirming the *start* of a previously reserved service rather than its validity/existence. + CheckInAction + + + + + An agent associated with the publication event. + + + + publishedBy + + + The phone number to use to access the service. + servicePhone + + + + + Cardiovascular + + A specific branch of medical science that pertains to diagnosis and treatment of disorders of heart and vasculature. + + + + Component (sub-)structure(s) that comprise this anatomical structure. + subStructure + + + + + + + + This property links to all [[UnitPriceSpecification]] nodes that apply in parallel for the [[CompoundPriceSpecification]] node. + priceComponent + + + PaymentComplete + The payment has been received and processed. + + + programType + + + + + + The type of educational or occupational program. For example, classroom, internship, alternance, etc.. + + + Medical clinicians, including practicing physicians and other medical professionals involved in clinical practice. + Clinician + + + + + MiddleSchool + A middle school (typically for children aged around 11-14, although this varies somewhat). + + + OriginalMediaContent + + Content coded 'as original media content' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'original': No evidence the footage has been misleadingly altered or manipulated, though it may contain false or misleading claims. + +For an [[ImageObject]] to be 'original': No evidence the image has been misleadingly altered or manipulated, though it may still contain false or misleading claims. + +For an [[ImageObject]] with embedded text to be 'original': No evidence the image has been misleadingly altered or manipulated, though it may still contain false or misleading claims. + +For an [[AudioObject]] to be 'original': No evidence the audio has been misleadingly altered or manipulated, though it may contain false or misleading claims. + + + + + + + + + legislationConsolidates property.]]> + + + legislationChanges + + + + + + + Indicates, in the context of a [[Review]] (e.g. framed as 'pro' vs 'con' considerations), positive considerations - either as unstructured text, or a list. + + positiveNotes + + + + + + + email + + Email address. + + + + + An art gallery. + + ArtGallery + + + + Infectious + Something in medical science that pertains to infectious diseases i.e caused by bacterial, viral, fungal or parasitic infections. + + + + + + termsPerYear + The number of times terms of study are offered per year. Semesters and quarters are common units for term. For example, if the student can only take 2 semesters for the program in one year, then termsPerYear should be 2. + + + + nerveMotor + The neurological pathway extension that involves muscle control. + + + + + + TreatmentsHealthAspect + + Treatments or related therapies for a Topic. + + + + drainsTo + + + + The vasculature that the vein drains into. + + + + checkoutTime + + + + The latest someone may check out of a lodging establishment. + + + + carrierRequirements + + Specifies specific carrier(s) requirements for the application (e.g. an application may only work on a specific carrier network). + + + + + accelerationTime + The time needed to accelerate the vehicle from a given start velocity to a given target velocity.\n\nTypical unit code(s): SEC for seconds\n\n* Note: There are unfortunately no standard unit codes for seconds/0..100 km/h or seconds/0..60 mph. Simply use "SEC" for seconds and indicate the velocities in the [[name]] of the [[QuantitativeValue]], or use [[valueReference]] with a [[QuantitativeValue]] of 0..60 mph or 0..100 km/h to specify the reference speeds. + + + + + + + + totalJobOpenings + The number of positions open for this job posting. Use a positive integer. Do not use if the number of positions is unclear or not known. + + + + + The typical working hours for this job (e.g. 1st shift, night shift, 8am-5pm). + + workHours + + + + TouristInformationCenter + A tourist information center. + + + + publishedOn + + A broadcast service associated with the publication event. + + + Relates a property to a class that is (one of) the type(s) the property is expected to be used on. + + domainIncludes + + + + + Downpayment + + + Represents the downpayment (up-front payment) price component of the total price for an offered product that has additional installment payments. + + + + hasMenuSection + A subgrouping of the menu (by dishes, course, serving time period, etc.). + + + + + + numc19ofmechventpats - ED/OVERFLOW and VENTILATED: Patients with suspected or confirmed COVID-19 who are in the ED or any overflow location awaiting an inpatient bed and on a mechanical ventilator. + + cvdNumC19OFMechVentPats + + + + + + + Indicates the design and body style of the vehicle (e.g. station wagon, hatchback, etc.). + + + + bodyType + + + + An ItemList ordered with no explicit order. + ItemListUnordered + + + + The act of expressing a desire about the object. An agent wants an object. + WantAction + + + + A specific branch of medical science that pertains to hereditary transmission and the variation of inherited characteristics and disorders. + Genetic + + + Book format: Paperback. + Paperback + + + Represents the list price (the price a product is actually advertised for) of an offered product. + ListPrice + + + + + + A file containing a note, primarily for the author. + NoteDigitalDocument + + + + cvdNumBedsOcc + + numbedsocc - HOSPITAL INPATIENT BED OCCUPANCY: Total number of staffed inpatient beds that are occupied. + + + + + + The neurological pathway extension that inputs and sends information to the brain or spinal cord. + + + + sensoryUnit + + + + A bakery. + Bakery + + + + ShoppingCenter + A shopping center or mall. + + + Text of an utterances (spoken words, lyrics etc.) that occurs at a certain section of a media object, represented as a [[HyperTocEntry]]. + + + utterances + + + + + + + Indicates that a legislation is currently not in force. + + NotInForce + + + + departureStation + The station from which the train departs. + + + + + + The measuredValue of an [[Observation]]. + + + measuredValue + + + + + programmingLanguage + The computer programming language. + + + + + + The number of passengers that can be seated in the vehicle, both in terms of the physical space available, and in terms of limitations set by law.\n\nTypical unit code(s): C62 for persons. + + + + vehicleSeatingCapacity + + + + + collectionSize + The number of items in the [[Collection]]. + + + + + + + Nonprofit501c20: Non-profit type referring to Group Legal Services Plan Organizations. + Nonprofit501c20 + + + The total financial value of the person as calculated by subtracting assets from liabilities. + netWorth + + + + + + + + Length of the lease for some [[Accommodation]], either particular to some [[Offer]] or in some cases intrinsic to the property. + leaseLength + + + + + + + + + vehicleConfiguration + + + A short text indicating the configuration of the vehicle, e.g. '5dr hatchback ST 2.5 MT 225 hp' or 'limited edition'. + + + Associates an [[Event]] with a [[Schedule]]. There are circumstances where it is preferable to share a schedule for a series of + repeating events rather than data on the individual events themselves. For example, a website or application might prefer to publish a schedule for a weekly + gym class rather than provide data on every event. A schedule could be processed by applications to add forthcoming events to a calendar. An [[Event]] that + is associated with a [[Schedule]] using this property should not have [[startDate]] or [[endDate]] properties. These are instead defined within the associated + [[Schedule]], this avoids any ambiguity for clients using the data. The property might have repeated values to specify different schedules, e.g. for different months + or seasons. + + eventSchedule + + + + + + + The earliest date the package may arrive. + expectedArrivalFrom + + + + + + + + + Conditions that affect the availability of, or method(s) of access to, an item. Typically used for real world items such as an [[ArchiveComponent]] held by an [[ArchiveOrganization]]. This property is not suitable for use as a general Web access control mechanism. It is expressed only in natural language.\n\nFor example "Available by appointment from the Reading Room" or "Accessible only from logged-in accounts ". + conditionsOfAccess + + + + variableMeasured + + + + + The variableMeasured property can indicate (repeated as necessary) the variables that are measured in some dataset, either described as text or as pairs of identifier and description using PropertyValue. + + + + An amenity feature (e.g. a characteristic or service) of the Accommodation. This generic property does not make a statement about whether the feature is included in an offer for the main accommodation or available at extra costs. + + amenityFeature + + + + + + + Specifies the minimum allowed range for number of characters in a literal value. + + + valueMinLength + + + WearableSizeGroupExtraShort + + Size group "Extra Short" for wearables. + + + + + + legalName + + The official name of the organization, e.g. the registered company name. + + + + + + OfferForPurchase + An [[OfferForPurchase]] in Schema.org represents an [[Offer]] to sell something, i.e. an [[Offer]] whose + [[businessFunction]] is [sell](http://purl.org/goodrelations/v1#Sell.). See [Good Relations](https://en.wikipedia.org/wiki/GoodRelations) for + background on the underlying concepts. + + + + A short textual code (also called "store code") that uniquely identifies a place of business. The code is typically assigned by the parentOrganization and used in structured URLs.\n\nFor example, in the URL http://www.starbucks.co.uk/store-locator/etc/detail/3047 the code "3047" is a branchCode for a particular branch. + + branchCode + + + + + + + + + isPlanForApartment + Indicates some accommodation that this floor plan describes. + + + + + spokenByCharacter + The (e.g. fictional) character, Person or Organization to whom the quotation is attributed within the containing CreativeWork. + + + + + + + The units of an active ingredient's strength, e.g. mg. + + + strengthUnit + + + + + The time interval used to compute the invoice. + billingPeriod + + + + + The publishing division which published the comic. + + publisherImprint + + + A media object representing the circumstances after performing this direction. + + + + afterMedia + + + inAlbum + + + The album to which this recording belongs. + + + + A sub property of object. The object that is being replaced. + replacee + + + + + + DanceGroup + A dance group&#x2014;for example, the Alvin Ailey Dance Theater or Riverdance. + + + EventCancelled + The event has been cancelled. If the event has multiple startDate values, all are assumed to be cancelled. Either startDate or previousStartDate may be used to specify the event's cancelled date(s). + + + + contributor + + + + A secondary contributor to the CreativeWork or Event. + + + + customerRemorseReturnShippingFeesAmount + + + + The amount of shipping costs if a product is returned due to customer remorse. Applicable when property [[customerRemorseReturnFees]] equals [[ReturnShippingFees]]. + + + + The taxonomic rank of this taxon given preferably as a URI from a controlled vocabulary – (typically the ranks from TDWG TaxonRank ontology or equivalent Wikidata URIs). + + + taxonRank + + + + + + EPRelease. + EPRelease + + + + + + The airline-specific indicator of boarding order / preference. + boardingGroup + + + Nonprofit501c14: Non-profit type referring to State-Chartered Credit Unions, Mutual Reserve Funds. + Nonprofit501c14 + + + + + Maximum hand girth (measured over the knuckles of the open right hand excluding thumb, fingers together). Used, for example, to fit gloves. + + BodyMeasurementHand + + + + + The price range of the business, for example ```$$$```. + priceRange + + + + + + + + + inker + The individual who traces over the pencil drawings in ink after pencils are complete. + + + + BodyMeasurementNeck + Girth of neck. Used, for example, to fit shirts. + + + + StagedContent + Content coded 'staged content' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'staged content': A video that has been created using actors or similarly contrived. + +For an [[ImageObject]] to be 'staged content': An image that was created using actors or similarly contrived, such as a screenshot of a fake tweet. + +For an [[ImageObject]] with embedded text to be 'staged content': An image that was created using actors or similarly contrived, such as a screenshot of a fake tweet. + +For an [[AudioObject]] to be 'staged content': Audio that has been created using actors or similarly contrived. + + + + + + + + The person or organization that originally passed or made the law : typically parliament (for primary legislation) or government (for secondary legislation). This indicates the "legal author" of the law, as opposed to its physical author. + legislationPassedBy + + + + + + + + The creator/author of this CreativeWork. This is the same as the Author property for CreativeWork. + + creator + + + + + + + + + OrderPickupAvailable + OrderStatus representing availability of an order for pickup. + + + The longitude of a location. For example ```-122.08585``` ([WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)). + + + + + longitude + + + Physical activity that is engaged in to improve joint and muscle flexibility. + Flexibility + + + + + Observational + An observational study design. + + + + + + The elevation of a location ([WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)). Values may be of the form 'NUMBER UNIT_OF_MEASUREMENT' (e.g., '1,000 m', '3,200 ft') while numbers alone should be assumed to be a value in meters. + + elevation + + + medicalAudience + Medical audience for page. + + + + + + + + The act of reaching a draw in a competitive activity. + TieAction + + + A medical study or trial related to this entity. + + + study + + + + MedicalResearcher + Medical researchers. + + + + The act of arriving at a place. An agent arrives at a destination from a fromLocation, optionally with participants. + + ArriveAction + + + ethicsPolicy + + + + + Statement about ethics policy, e.g. of a [[NewsMediaOrganization]] regarding journalistic and publishing practices, or of a [[Restaurant]], a page describing food source policies. In the case of a [[NewsMediaOrganization]], an ethicsPolicy is typically a statement describing the personal, organizational, and corporate standards of behavior expected by the organization. + + + + + + printSection + + If this NewsArticle appears in print, this field indicates the print section in which the article appeared. + + + The permitted weight of a trailer attached to the vehicle.\n\nTypical unit code(s): KGM for kilogram, LBR for pound\n* Note 1: You can indicate additional information in the [[name]] of the [[QuantitativeValue]] node.\n* Note 2: You may also link to a [[QualitativeValue]] node that provides additional information using [[valueReference]].\n* Note 3: Note that you can use [[minValue]] and [[maxValue]] to indicate ranges. + trailerWeight + + + + + + + + + + Further documentation describing the Web API in more detail. + + documentation + + + + + + + A sub property of recipient. The recipient copied on a message. + ccRecipient + + + + + + The date the item e.g. vehicle was purchased by the current owner. + + purchaseDate + + + + + + + The medical conditions, treatments, etc. that are the subject of the guideline. + + guidelineSubject + + + nextItem + A link to the ListItem that follows the current one. + + + + + industry + + The industry associated with the job position. + + + + + recognizedBy + + + An organization that acknowledges the validity, value or utility of a credential. Note: recognition may include a process of quality assurance or accreditation. + + + + + Represents the distance fee (e.g., price per km or mile) part of the total price for an offered product, for example a car rental. + + + DistanceFee + + + PharmacySpecialty + The practice or art and science of preparing and dispensing drugs and medicines. + + + + + + publisher + + The publisher of the creative work. + + + Disease associated to this BioChemEntity. Such disease can be a MedicalCondition or a URL. If you want to add an evidence supporting the association, please use PropertyValue. + + + + + associatedDisease + + + + + bitrate + + The bitrate of the media object. + + + + + SearchResultsPage + Web page type: Search results page. + + + AutoBodyShop + + Auto body shop. + + + OTC + + The character of a medical substance, typically a medicine, of being available over the counter or not. + + + + Specifies that the customer must pay the original shipping costs when returning a product. + OriginalShippingFees + + + + PrimaryCare + The medical care by a physician, or other health-care professional, who is the patient's first contact with the health-care system and who may recommend a specialist if necessary. + + + + + The day of the week between Tuesday and Thursday. + + Wednesday + + + VegetarianDiet + A diet exclusive of animal meat. + + + doseSchedule + + A dosing schedule for the drug for a given population, either observed, recommended, or maximum dose based on the type used. + + + + + + vehicleInteriorColor + + + The color or color combination of the interior of the vehicle. + + + + An image containing a diagram that illustrates the structure and/or its component substructures and/or connections with other structures. + diagram + + + + + + + + + + + datePosted + + + + Publication date of an online listing. + + + PublicHealth + Branch of medicine that pertains to the health services to improve and protect community health, especially epidemiology, sanitation, immunization, and preventive medicine. + + + + + + repeatCount + + + + Defines the number of times a recurring [[Event]] will take place + + + interactionService + + + The WebSite or SoftwareApplication where the interactions took place. + + + + + + domiciledMortgage + + Whether borrower is a resident of the jurisdiction where the property is located. + + + + + A type of medical procedure that involves noninvasive techniques. + + NoninvasiveProcedure + + + typicalTest + A medical test typically performed given this condition. + + + + + + + A data catalog which contains this dataset (this property was previously 'catalog', preferred name is now 'includedInDataCatalog'). + + + includedDataCatalog + + + The organization issuing the ticket or permit. + issuedBy + + + + + + A trial design in which neither the researcher nor the patient knows the details of the treatment the patient was randomly assigned to. + DoubleBlindedTrial + + + + + + familyName + Family name. In the U.S., the last name of a Person. + + + activityDuration + + Length of time to engage in the activity. + + + + + + + + + videoFormat + + The type of screening or video broadcast used (e.g. IMAX, 3D, SD, HD, etc.). + + + Specifies that product returns must to be done by mail. + ReturnByMail + + + + + + + shippingSettingsLink + Link to a page containing [[ShippingRateSettings]] and [[DeliveryTimeSettings]] details. + + + + + + + educationalRole + An educationalRole of an EducationalAudience. + + + steeringPosition + + + + The position of the steering wheel or similar device (mostly for cars). + + + + + The actual infectious agent, such as a specific bacterium. + + infectiousAgent + + + Ligament + + A short band of tough, flexible, fibrous connective tissue that functions to connect multiple bones, cartilages, and structurally support joints. + + + + A sub property of participant. The person that lends the object being borrowed. + + + + lender + + + + shippingDetails + + Indicates information about the shipping policies and options associated with an [[Offer]]. + + + + + + + reservationFor + + The thing -- flight, event, restaurant,etc. being reserved. + + + + + The lowest price of all offers available.\n\nUsage guidelines:\n\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + + lowPrice + + + Supporting data for a SoftwareApplication. + supportingData + + + + + + Pulmonary + A specific branch of medical science that pertains to the study of the respiratory system and its respective disease states. + + + InstallAction + + The act of installing an application. + + + + A refund type, from an enumerated list. + + + + refundType + + + + + aircraft + The kind of aircraft (e.g., "Boeing 747"). + + + + The condition, complication, symptom, sign, etc. caused. + causeOf + + + + + + Indicates the relationship type of a Web link. + linkRelationship + + + + + + + + + A sub property of object. The object that replaces. + + replacer + + + A step-by-step or full explanation about Answer. Can outline how this Answer was achieved or contain more broad clarification or statement about it. + answerExplanation + + + + + + + + providerMobility + + + Indicates the mobility of a provided service (e.g. 'static', 'dynamic'). + + + itemReviewed + + The item that is being reviewed/rated. + + + + + + + + educationalAlignment + An alignment to an established educational framework. + +This property should not be used where the nature of the alignment can be described using a simple property, for example to express that a resource [[teaches]] or [[assesses]] a competency. + + + + Represents EU Energy Efficiency Class C as defined in EU energy labeling regulations. + EUEnergyEfficiencyCategoryC + + + + An associated [[MediaReview]], related by specific common content, topic or claim. The expectation is that this property would be most typically used in cases where a single activity is conducting both claim reviews and media reviews, in which case [[relatedMediaReview]] would commonly be used on a [[ClaimReview]], while [[relatedClaimReview]] would be used on [[MediaReview]]. + + + + + associatedMediaReview + + + associatedReview + + + + + An associated [[Review]]. + + + + + An item is an object within the game world that can be collected by a player or, occasionally, a non-player character. + + + gameItem + + + + WearableMeasurementCollar + + + Measurement of the collar, for example of a shirt + + + + + + An active ingredient, typically chemical compounds and/or biologic substances. + + + + activeIngredient + + + + + + A media object representing the circumstances while performing this direction. + duringMedia + + + valueAddedTaxIncluded + + + Specifies whether the applicable value-added tax (VAT) is included in the price specification or not. + + + + Japanese size system for wearables. + + WearableSizeSystemJP + + + + Manuscript + + + + A book, document, or piece of music written by hand rather than typed or printed. + + + + free + + + + + isAccessibleForFree + + + A flag to signal that the item, event, or place is accessible for free. + + + + A flag to signal that the item, event, or place is accessible for free. + + + Musculoskeletal + + A specific branch of medical science that pertains to diagnosis and treatment of disorders of muscles, ligaments and skeletal system. + + + amountOfThisGood + The quantity of the goods included in the offer. + + + + + + + The type of composition (e.g. overture, sonata, symphony, etc.). + + + musicCompositionForm + + + + The act of swallowing liquids. + DrinkAction + + + + + numberOfEpisodes + + The number of episodes in this season or series. + + + + + FDAcategoryA + A designation by the US FDA signifying that adequate and well-controlled studies have failed to demonstrate a risk to the fetus in the first trimester of pregnancy (and there is no evidence of risk in later trimesters). + + + + + + orderNumber + The identifier of the transaction. + + + + A treatment of people with physical, emotional, or social problems, using purposeful activity to help them overcome or learn to deal with their problems. + + + OccupationalTherapy + + + + A service to convert funds from one currency to another currency. + CurrencyConversionService + + + + greaterOrEqual + This ordering relation for qualitative values indicates that the subject is greater than or equal to the object. + + + + + + + streetAddress + The street address. For example, 1600 Amphitheatre Pkwy. + + + + Non-proprietary identifier for molecular entity that can be used in printed and electronic data sources thus enabling easier linking of diverse data compilations. + + inChI + + + + + + + + + + propertyID + A commonly used identifier for the characteristic represented by the property, e.g. a manufacturer or a standard code for a property. propertyID can be +(1) a prefixed string, mainly meant to be used with standards for product properties; (2) a site-specific, non-prefixed string (e.g. the primary key of the property or the vendor-specific id of the property), or (3) +a URL indicating the type of the property, either pointing to an external vocabulary, or a Web resource that describes the property (e.g. a glossary entry). +Standards bodies should promote a standard prefix for the identifiers of properties from their standards. + + + MovieClip + + A short segment/part of a movie. + + + + + + The only way you get the money back in the event of default is the security. Recourse is where you still have the opportunity to go back to the borrower for the rest of the money. + recourseLoan + + + + + + + The International Standard Recording Code for the recording. + + isrcCode + + + + + occupationalCategory + + + + + + + + + A category describing the job, preferably using a term from a taxonomy such as [BLS O*NET-SOC](http://www.onetcenter.org/taxonomy.html), [ISCO-08](https://www.ilo.org/public/english/bureau/stat/isco/isco08/) or similar, with the property repeated for each applicable value. Ideally the taxonomy should be identified, and both the textual label and formal code for the category should be provided.\n +Note: for historical reasons, any textual label and formal code provided as a literal may be assumed to be from O*NET-SOC. + + + + + estimatedCost + + The estimated cost of the supply or supplies consumed when performing instructions. + + + + + + TaxiVehicleUsage + + Indicates the usage of the car as a taxi. + + + Sunday + + The day of the week between Saturday and Monday. + + + differentialDiagnosis + + + + One of a set of differential diagnoses for the condition. Specifically, a closely-related or competing diagnosis typically considered later in the cognitive process whereby this medical condition is distinguished from others most likely responsible for a similar collection of signs and symptoms to reach the most parsimonious diagnosis or diagnoses in a patient. + + + A NewsArticle associated with the Media Object. + + + associatedArticle + + + associatedClaimReview + + + + + + An associated [[ClaimReview]], related by specific common content, topic or claim. The expectation is that this property would be most typically used in cases where a single activity is conducting both claim reviews and media reviews, in which case [[relatedMediaReview]] would commonly be used on a [[ClaimReview]], while [[relatedClaimReview]] would be used on [[MediaReview]]. + + + + + + Quiz + Quiz: A test of knowledge, skills and abilities. + + + + + + + + legislationTransposes property. For example an informative consolidated law of a European Union's member state "applies" the consolidated version of the European Directive implemented in it.]]> + + + + legislationApplies + + + + + + + Indicates that this legislation (or part of legislation) fulfills the objectives set by another legislation, by passing appropriate implementation measures. Typically, some legislations of European Union's member states or regions transpose European Directives. This indicates a legally binding link between the 2 legislations. + + + + + legislationTransposes + + + + + + + Typical preparation that a patient must undergo before having the procedure performed. + preparation + + + + An entity represented by an entry in a list or data feed (e.g. an 'artist' in a list of 'artists')’. + + item + + + + + + One of the more significant URLs on the page. Typically, these are the non-navigation links that are clicked on the most. + + + significantLink + + + + significantLinks + + The most significant URLs on the page. Typically, these are the non-navigation links that are clicked on the most. + + + Reference to an asset (e.g., Barcode, QR code image or PDF) usable for entrance. + + + ticketToken + + + + Specifying something physically contained by something else. Typically used here for the underlying anatomical structures, such as organs, that comprise the anatomical system. + + comprisedOf + + + + + + An honorific prefix preceding a Person's name such as Dr/Mrs/Mr. + honorificPrefix + + + + + + + Position of the season within an ordered group of seasons. + + + seasonNumber + + + + ownedFrom + + + The date and time of obtaining the product. + + + successorOf + A pointer from a newer variant of a product to its previous, often discontinued predecessor. + + + + + + + collectiondate - Date for which patient counts are reported. + cvdCollectionDate + + + + + + + + broadcastSubChannel + + + + The subchannel used for the broadcast. + + + A trial design in which the researcher knows the full details of the treatment, and so does the patient. + OpenTrial + + + + + PaymentService + + A Service to transfer funds from a person or organization to a beneficiary person or organization. + + + + A reservation for boat travel. + +Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + + BoatReservation + + + + paymentAccepted + Cash, Credit Card, Cryptocurrency, Local Exchange Tradings System, etc. + + + + + + RadiationTherapy + + A process of care using radiation aimed at improving a health condition. + + + + typeOfBed + + + The type of bed to which the BedDetail refers, i.e. the type of bed available in the quantity indicated by quantity. + + + + CompilationAlbum + CompilationAlbum. + + + + + DJMixAlbum. + DJMixAlbum + + + GolfCourse + A golf course. + + + + LakeBodyOfWater + A lake (for example, Lake Pontrachain). + + + + + + + This links to a node or nodes indicating the exact quantity of the products included in an [[Offer]] or [[ProductCollection]]. + + + includesObject + + + The distance between the centers of the front and rear wheels.\n\nTypical unit code(s): CMT for centimeters, MTR for meters, INH for inches, FOT for foot/feet + + + wheelbase + + + + + Content that discusses and explains how a particular health-related topic works, e.g. in terms of mechanisms and underlying science. + + + HowItWorksHealthAspect + + + + + issn + + + The International Standard Serial Number (ISSN) that identifies this serial publication. You can repeat this property to identify different formats of, or the linking ISSN (ISSN-L) for, this serial publication. + + + + + + + + The act of asserting that a future event/action is no longer going to happen.\n\nRelated actions:\n\n* [[ConfirmAction]]: The antonym of CancelAction. + CancelAction + + + AlbumRelease + AlbumRelease. + + + + A collection or bound volume of maps, charts, plates or tables, physical or in media form illustrating any subject. + + + + Atlas + + + + awayTeam + + + The away team in a sports event. + + + + The end time of the clip expressed as the number of seconds from the beginning of the work. + endOffset + + + + + + + + + cvdNumICUBedsOcc + + + + numicubedsocc - ICU BED OCCUPANCY: Total number of staffed inpatient ICU beds that are occupied. + + + Barcode + An image of a visual machine-readable code such as a barcode or QR code. + + + + + geoCoveredBy + + + Represents a relationship between two geometries (or the places they represent), relating a geometry to another that covers it. As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + + + Indicates that the item has limited availability. + LimitedAvailability + + + + + percentile75 + The 75th percentile value. + + + + + transcript + If this MediaObject is an AudioObject or VideoObject, the transcript of that object. + + + + + Park + A park. + + + + + + verificationFactCheckingPolicy + + + + Disclosure about verification and fact-checking processes for a [[NewsMediaOrganization]] or other fact-checking [[Organization]]. + + + + + + + countryOfAssembly + The place where the product was assembled. + + + + + + + + + + Recommended intake of this supplement for a given population as defined by a specific recommending authority. + maximumIntake + + + + Content about the effectiveness-related aspects of a health topic. + EffectivenessHealthAspect + + + + + relatedStructure + + + Related anatomical structure(s) that are not part of the system but relate or connect to it, such as vascular bundles associated with an organ system. + + + + + PhysicalTherapy + + A process of progressive physical care and rehabilitation aimed at improving a health condition. + + + + + + + + eligibleQuantity + The interval and unit of measurement of ordering quantities for which the offer or price specification is valid. This allows e.g. specifying that a certain freight charge is valid only for a certain quantity. + + + A placebo-controlled trial design. + + PlaceboControlledTrial + + + + + + An official rating for a lodging business or food establishment, e.g. from national associations or standards bodies. Use the author property to indicate the rating organization, e.g. as an Organization with name such as (e.g. HOTREC, DEHOGA, WHR, or Hotelstars). + starRating + + + + + produces + + + + + The tangible thing generated by the service, e.g. a passport, permit, etc. + serviceOutput + + + + The tangible thing generated by the service, e.g. a passport, permit, etc. + + + + + + The type of fuel suitable for the engine or engines of the vehicle. If the vehicle has only one engine, this property can be attached directly to the vehicle. + + + + fuelType + + + + + + employmentUnit + Indicates the department, unit and/or facility where the employee reports and/or in which the job is to be performed. + + + + timeOfDay + The time of day the program normally runs. For example, "evenings". + + + + + + + The type of service required to have access to the channel (e.g. Standard or Premium). + broadcastServiceTier + + + + + Either the actual menu as a structured representation, as text, or a URL of the menu. + + menu + + + + + Either the actual menu as a structured representation, as text, or a URL of the menu. + hasMenu + + + + + + + + + + + vendor + + 'vendor' is an earlier term for 'seller'. + + + + + + geoDisjoint + Represents spatial relations in which two geometries (or the places they represent) are topologically disjoint: they have no point in common. They form a set of disconnected geometries." (a symmetric relationship, as defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM)) + + + + + + + + The act of rejecting to/adopting an object.\n\nRelated actions:\n\n* [[AcceptAction]]: The antonym of RejectAction. + RejectAction + + + + + + + coursePrerequisites + Requirements for taking the Course. May be completion of another [[Course]] or a textual description like "permission of instructor". Requirements may be a pre-requisite competency, referenced using [[AlignmentObject]]. + + + + numvent - MECHANICAL VENTILATORS: Total number of ventilators available. + + cvdNumVent + + + + + diversityPolicy + + + + + + + Statement on diversity policy by an [[Organization]] e.g. a [[NewsMediaOrganization]]. For a [[NewsMediaOrganization]], a statement describing the newsroom’s diversity policy on both staffing and sources, typically providing staffing data. + + + + + WearableSizeGroupPlus + + Size group "Plus" for wearables. + + + An additional name for a Person, can be used for a middle name. + + additionalName + + + + BedAndBreakfast +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+ +
+ + + + + commentTime + The time at which the UserComment was made. + + + FurnitureStore + A furniture store. + + + + The geographic area where a permit or similar thing is valid. + validIn + + + + + + + Representation of a text [[textValue]] using the specified [[speechToTextMarkup]]. For example the city name of Houston in IPA: /ˈhjuːstən/. + + + phoneticText + + + + + + tongueWeight + + + The permitted vertical load (TWR) of a trailer attached to the vehicle. Also referred to as Tongue Load Rating (TLR) or Vertical Load Rating (VLR)\n\nTypical unit code(s): KGM for kilogram, LBR for pound\n\n* Note 1: You can indicate additional information in the [[name]] of the [[QuantitativeValue]] node.\n* Note 2: You may also link to a [[QualitativeValue]] node that provides additional information using [[valueReference]].\n* Note 3: Note that you can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + The maximum physical attendee capacity of an [[Event]] whose [[eventAttendanceMode]] is [[OfflineEventAttendanceMode]] (or the offline aspects, in the case of a [[MixedEventAttendanceMode]]). + maximumPhysicalAttendeeCapacity + + + + + + + Specifies that a refund can be done as an exchange for the same product. + ExchangeRefund + + + + + The predominant mode of learning supported by the learning resource. Acceptable values are 'active', 'expositive', or 'mixed'. + + interactivityType + + + + + + + The lowest value allowed in this rating system. If worstRating is omitted, 1 is assumed. + worstRating + + + + + A sub property of location. The final location of the object or the agent after the action. + + + + + toLocation + + + A library. + + Library + + + HalalDiet + A diet conforming to Islamic dietary practices. + + + + artform + + e.g. Painting, Drawing, Sculpture, Print, Photograph, Assemblage, Collage, etc. + + + + + + The current approximate inventory level for the item or items. + inventoryLevel + + + + + + + Gender of something, typically a [[Person]], but possibly also fictional characters, animals, etc. While https://schema.org/Male and https://schema.org/Female may be used, text strings are also acceptable for people who do not identify as a binary gender. The [[gender]] property can also be used in an extended sense to cover e.g. the gender of sports teams. As with the gender of individuals, we do not try to enumerate all possibilities. A mixed-gender [[SportsTeam]] can be indicated with a text value of "Mixed". + + + gender + + + + + + Indicates that the item has sold out. + SoldOut + + + credentialCategory + The category or type of credential being described, for example "degree”, “certificate”, “badge”, or more specific term. + + + + + + + + + PostOffice + A post office. + + + + breastfeedingWarning + + + + Any precaution, guidance, contraindication, etc. related to this drug's use by breastfeeding mothers. + + + + + + availability + The availability of this item&#x2014;for example In stock, Out of stock, Pre-order, etc. + + + + + + + + Upcoming or past event associated with this place, organization, or action. + + + + event + + + + + + + + Upcoming or past events associated with this place or organization. + events + + + WearableSizeSystemEurope + + + European size system for wearables. + + + + targetDescription + + The description of a node in an established educational framework. + + + fuelEfficiency + The distance traveled per unit of fuel used; most commonly miles per gallon (mpg) or kilometers per liter (km/L).\n\n* Note 1: There are unfortunately no standard unit codes for miles per gallon or kilometers per liter. Use [[unitText]] to indicate the unit of measurement, e.g. mpg or km/L.\n* Note 2: There are two ways of indicating the fuel consumption, [[fuelConsumption]] (e.g. 8 liters per 100 km) and [[fuelEfficiency]] (e.g. 30 miles per gallon). They are reciprocal.\n* Note 3: Often, the absolute value is useful only when related to driving speed ("at 80 km/h") or usage pattern ("city traffic"). You can use [[valueReference]] to link the value for the fuel economy to another value. + + + + + + + The item ordered. + orderedItem + + + + + + + + A marginOfError for an [[Observation]]. + + + marginOfError + + + + + + + + + award + + + + An award won by or for this item. + + + + + + + + awards + Awards won by or for this item. + + + + baseSalary + + + + The base salary of the job or of an employee in an EmployeeRole. + + + + Arm length (measured between arms/shoulder line intersection and the prominent wrist bone). Used, for example, to fit shirts. + BodyMeasurementArm + + + + + ShortStory + + + + Short story or tale. A brief work of literature, usually written in narrative prose. + + + A sign or symptom of this condition. Signs are objective or physically observable manifestations of the medical condition while symptoms are the subjective experience of the medical condition. + signOrSymptom + + + + + + + seasons + + + + + + A season in a media series. + season + + + + + + + + A season in a media series. + + + + + RiverBodyOfWater + + A river (for example, the broad majestic Shannon). + + + + + Tissue, organ, biological sample, etc in which activity of this gene has been observed experimentally. For example brain, digestive system. + + + expressedIn + + + + + + departureAirport + + + The airport where the flight originates. + + + + userInteractionCount + The number of interactions for the CreativeWork using the WebSite or SoftwareApplication. + + + + WearableSizeSystemGS1 + + + GS1 (formerly NRF) size system for wearables. + + + DiscoverAction + The act of discovering/finding an object. + + + + Indicates when shipping to a particular [[shippingDestination]] is not available. + + + + + doesNotShip + + + + + Anatomical systems or structures that relate to the superficial anatomy. + + + + relatedAnatomy + + + + + prescriptionStatus + Indicates the status of drug prescription eg. local catalogs classifications or whether the drug is available by prescription or over-the-counter, etc. + + + + + + + Dietetic and nutrition as a medical specialty. + DietNutrition + + + availableStrength + + An available dosage strength for the drug. + + + + + BookmarkAction + + An agent bookmarks/flags/labels/tags/marks an object. + + + + + The ISBN of the book. + + isbn + + + + + CatholicChurch + A Catholic church. + + + + AmusementPark + An amusement park. + + + Nonprofit501c19: Non-profit type referring to Post or Organization of Past or Present Members of the Armed Forces. + Nonprofit501c19 + + + + + TollFree + The associated telephone number is toll free. + + + + webCheckinTime + + The time when a passenger can check into the flight online. + + + acrissCode + + + The ACRISS Car Classification Code is a code used by many car rental companies, for classifying vehicles. ACRISS stands for Association of Car Rental Industry Systems and Standards. + + + + + + availableThrough + + + After this date, the item will no longer be available for pickup. + + + + + Smaller compositions included in this work (e.g. a movement in a symphony). + includedComposition + + + + + + Whether The rate of coinsurance expressed as a number between 0.0 and 1.0. + + healthPlanCoinsuranceRate + + + + + + + + + + A material that something is made from, e.g. leather, wool, cotton, paper. + + material + + + The material used. (e.g. Oil, Watercolour, Acrylic, Linoprint, Marble, Cyanotype, Digital, Lithograph, DryPoint, Intaglio, Pastel, Woodcut, Pencil, Mixed Media, etc.) + + + + artMedium + + + + + The tier(s) of drugs offered by this formulary or insurance plan. + healthPlanDrugTier + + + + + + + itemListOrder + + + Type of ordering (e.g. Ascending, Descending, Unordered). + + + + + + + + + + + For an [[Organization]] (often but not necessarily a [[NewsMediaOrganization]]), a description of organizational ownership structure; funding and grants. In a news/media setting, this is with particular reference to editorial independence. Note that the [[funder]] is also available and can be used to make basic funder information machine-readable. + ownershipFundingInfo + + + + + + + + ReportageNewsArticle + + The [[ReportageNewsArticle]] type is a subtype of [[NewsArticle]] representing + news articles which are the result of journalistic news reporting conventions. + +In practice many news publishers produce a wide variety of article types, many of which might be considered a [[NewsArticle]] but not a [[ReportageNewsArticle]]. For example, opinion pieces, reviews, analysis, sponsored or satirical articles, or articles that combine several of these elements. + +The [[ReportageNewsArticle]] type is based on a stricter ideal for "news" as a work of journalism, with articles based on factual information either observed or verified by the author, or reported and verified from knowledgeable sources. This often includes perspectives from multiple viewpoints on a particular issue (distinguishing news reports from public relations or propaganda). News reports in the [[ReportageNewsArticle]] sense de-emphasize the opinion of the author, with commentary and value judgements typically expressed elsewhere. + +A [[ReportageNewsArticle]] which goes deeper into analysis can also be marked with an additional type of [[AnalysisNewsArticle]]. + + + + A garden store. + GardenStore + + + + + Self care actions or measures that can be taken to sooth, health or avoid a topic. This may be carried at home and can be carried/managed by the person itself. + SelfCareHealthAspect + + + + + + Indicates that the resource is compatible with the referenced accessibility API ([WebSchemas wiki lists possible values](http://www.w3.org/wiki/WebSchemas/Accessibility)). + accessibilityAPI + + + + BloodTest + + A medical test performed on a sample of a patient's blood. + + + Lung and respiratory system clinical examination. + Lung + + + + returnMethod + + + + + The type of return method offered, specified from an enumeration. + + + OrderCancelled + OrderStatus representing cancellation of an order. + + + + permissionType + The type of permission granted the person, organization, or audience. + + + + A nightclub or discotheque. + NightClub + + + + The currency (in 3-letter of the drug cost. See: http://en.wikipedia.org/wiki/ISO_4217. + costCurrency + + + + + + + The maximum physical attendee capacity of an [[Event]] whose [[eventAttendanceMode]] is [[OnlineEventAttendanceMode]] (or the online aspects, in the case of a [[MixedEventAttendanceMode]]). + maximumVirtualAttendeeCapacity + + + + + + governmentBenefitsInfo + + + + governmentBenefitsInfo provides information about government benefits associated with a SpecialAnnouncement. + + + + + UserCheckins + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + Wholesale + + The drug's cost represents the wholesale acquisition cost of the drug. + + + + Measurement of the chest/bust section, for example of a suit + + WearableMeasurementChestOrBust + + + A specific branch of medical science that is concerned with the study, treatment, and prevention of mental illness, using both medical and psychological therapies. + Psychiatric + + + + + A trial design in which neither the researcher, the person administering the therapy nor the patient knows the details of the treatment the patient was randomly assigned to. + TripleBlindedTrial + + + + + pattern + A pattern that something has, for example 'polka dot', 'striped', 'Canadian flag'. Values are typically expressed as text, although links to controlled value schemes are also supported. + + + + + + + + + DiscussionForumPosting + A posting to a discussion forum. + + + + The CableOrSatelliteService offering the channel. + + inBroadcastLineup + + + + MedicalGuidelineContraindication + + A guideline contraindication that designates a process as harmful and where quality of the data supporting the contraindication is sound. + + + + + + + + + + jurisdiction + + Indicates a legal jurisdiction, e.g. of some legislation, or where some government service is based. + + + + + + + The jurisdiction from which the legislation originates. + + + legislationJurisdiction + + + + + + + WearAction + The act of dressing oneself in clothing. + + + + + deliveryMethod + + A sub property of instrument. The method of delivery. + + + + + + A parking map. + ParkingMap + + + A locksmith. + Locksmith + + + + SchoolDistrict + + + A School District is an administrative area for the administration of schools. + + + + + Comments, typically from users. + + comment + + + + + servingSize + + The serving size, in terms of the number of volume or mass. + + + + + + exchangeRateSpread + + + + The difference between the price at which a broker or other intermediary buys and sells foreign currency. + + + + An explanation in the instructions for how to achieve a result. It provides supplementary information about a technique, supply, author's preference, etc. It can explain what could be done, or what should not be done, but doesn't specify what should be done (see HowToDirection). + + HowToTip + + + + ReviewNewsArticle + + + + A [[NewsArticle]] and [[CriticReview]] providing a professional critic's assessment of a service, product, performance, or artistic or literary work. + + + + Articles may belong to one or more 'sections' in a magazine or newspaper, such as Sports, Lifestyle, etc. + articleSection + + + + + If applicable, a description of the pathophysiology associated with the anatomical system, including potential abnormal changes in the mechanical, physical, and biochemical functions of the system. + + + + + + associatedPathophysiology + + + A governmental organization or agency. + + GovernmentOrganization + + + + + + cvdNumC19HOPats + + numc19hopats - HOSPITAL ONSET: Patients hospitalized in an NHSN inpatient care location with onset of suspected or confirmed COVID-19 14 or more days after hospitalization. + + + + The earliest someone may check into a lodging establishment. + + + + checkinTime + + + A sports club. + SportsClub + + + + Indicates a potential Action, which describes an idealized action in which this thing would play an 'object' role. + + potentialAction + + + + athlete + + A person that acts as performing member of a sports team; a player as opposed to a coach. + + + + + A CSS selector, e.g. of a [[SpeakableSpecification]] or [[WebPageElement]]. In the latter case, multiple matches within a page can constitute a single conceptual "Web page element". + + + cssSelector + + + + CT + X-ray computed tomography imaging. + + + + + SatireOrParodyContent + Content coded 'satire or parody content' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'satire or parody content': A video that was created as political or humorous commentary and is presented in that context. (Reshares of satire/parody content that do not include relevant context are more likely to fall under the “missing context” rating.) + +For an [[ImageObject]] to be 'satire or parody content': An image that was created as political or humorous commentary and is presented in that context. (Reshares of satire/parody content that do not include relevant context are more likely to fall under the “missing context” rating.) + +For an [[ImageObject]] with embedded text to be 'satire or parody content': An image that was created as political or humorous commentary and is presented in that context. (Reshares of satire/parody content that do not include relevant context are more likely to fall under the “missing context” rating.) + +For an [[AudioObject]] to be 'satire or parody content': Audio that was created as political or humorous commentary and is presented in that context. (Reshares of satire/parody content that do not include relevant context are more likely to fall under the “missing context” rating.) + + + + + + A media object representing the circumstances before performing this direction. + beforeMedia + + + + + + + + A statement about something, for example a fun or interesting fact. If known, the main entity this statement is about, can be indicated using mainEntity. For more formal claims (e.g. in Fact Checking), consider using [[Claim]] instead. Use the [[text]] property to capture the text of the statement. + Statement + + + TireShop + + A tire shop. + + + AudioObjectSnapshot + A specific and exact (byte-for-byte) version of an [[AudioObject]]. Two byte-for-byte identical files, for the purposes of this type, considered identical. If they have different embedded metadata the files will differ. Different external facts about the files, e.g. creator or dateCreated that aren't represented in their actual content, do not affect this notion of identity. + + + + + + + DownloadAction + The act of downloading an object. + + + + nutrition + + Nutrition information about the recipe or menu item. + + + + + experienceInPlaceOfEducation + Indicates whether a [[JobPosting]] will accept experience (as indicated by [[OccupationalExperienceRequirements]]) in place of its formal educational qualifications (as indicated by [[educationRequirements]]). If true, indicates that satisfying one of these requirements is sufficient. + + + + + + XRay + X-ray imaging. + + + + dropoffLocation + + + Where a rental car can be dropped off. + + + + True if the drug is available in a generic form (regardless of name). + isAvailableGenerically + + + + + VideoGallery + Web page type: Video gallery page. + + + + + billingAddress + The billing address for the order. + + + + Table + A table on a Web page. + + + + The exchange traded instrument associated with a Corporation object. The tickerSymbol is expressed as an exchange and an instrument name separated by a space character. For the exchange component of the tickerSymbol attribute, we recommend using the controlled vocabulary of Market Identifier Codes (MIC) specified in ISO15022. + tickerSymbol + + + + + + UserPageVisits + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + + + A child of the person. + children + + + Permission to write or edit the document. + WritePermission + + + + tracks + A music recording (track)&#x2014;usually a single song. + + + A music recording (track)&#x2014;usually a single song. If an ItemList is given, the list should contain items of type MusicRecording. + + + + + + track + + + + + + + + + + nonProprietaryName + + The generic name of this drug or supplement. + + + The model of the product. Use with the URL of a ProductModel or a textual representation of the model identifier. The URL of the ProductModel can be from an external source. It is recommended to additionally provide strong product identifiers via the gtin8/gtin13/gtin14 and mpn properties. + model + + + + + + + + + Keywords or tags used to describe this content. Multiple entries in a keywords list are typically delimited by commas. + + keywords + + + A diet appropriate for people with diabetes. + DiabeticDiet + + + The terminal or port from which the boat departs. + + + departureBoatTerminal + + + + + geoTouches + + + Represents spatial relations in which two geometries (or the places they represent) touch: they have at least one boundary point in common, but no interior points." (a symmetric relationship, as defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM) ) + + + + + + + + The level in terms of progression through an educational or training context. Examples of educational levels include 'beginner', 'intermediate' or 'advanced', and formal sets of level indicators. + + + + + + + educationalLevel + + + The closing hour of the place or service on the given day(s) of the week. + closes + + + + + + + Specifies that product returns must be made in a store. + + ReturnInStore + + + + + The unique address by which the BroadcastService can be identified in a provider lineup. In US, this is typically a number. + broadcastChannelId + + + An email message. + + EmailMessage + + + The status of a reservation when a request has been sent, but not confirmed. + ReservationPending + + + A medical guideline related to this entity. + + + guideline + + + + A diagnostic test or procedure offered by this lab. + + + availableTest + + + + WearableSizeSystemUK + + + United Kingdom size system for wearables. + + + Indicates the kind of Map, from the MapCategoryType Enumeration. + mapType + + + + + An office equipment store. + OfficeEquipmentStore + + + + + geoIntersects + + + Represents spatial relations in which two geometries (or the places they represent) have at least one point in common. As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + + + Withdrawn. + + Withdrawn + + + previousItem + + + A link to the ListItem that preceeds the current one. + + + + + The total number of forward gears available for the transmission system of the vehicle.\n\nTypical unit code(s): C62 + + numberOfForwardGears + + + + durationOfWarranty + + + + The duration of the warranty promise. Common unitCode values are ANN for year, MON for months, or DAY for days. + + + A large, usually printed placard, bill, or announcement, often illustrated, that is posted to advertise or publicize something. + + + Poster + + + + + A means of accessing the service (e.g. a phone bank, a web site, a location, etc.). + availableChannel + + + + infectiousAgentClass + The class of infectious agent (bacteria, prion, etc.) that causes the disease. + + + + + + + + + The "spatial" property can be used in cases when more specific properties +(e.g. [[locationCreated]], [[spatialCoverage]], [[contentLocation]]) are not known to be appropriate. + spatial + + + OutOfStock + Indicates that the item is out of stock. + + + + + A specific branch of medical science that specializes in the care of women during the prenatal and postnatal care and with the delivery of the child. + Obstetric + + + Pharmacy + + A pharmacy or drugstore. + + + + + + + validThrough + + + The date after when the item is not valid. For example the end of an offer, salary period, or a period of opening hours. + + + + + + + + ToyStore + A toy store. + + + + byArtist + + + The artist that performed this album or recording. + + + + + A radio station. + + RadioStation + + + + + DepositAccount + + A type of Bank Account with a main purpose of depositing funds to gain interest or other benefits. + + + + competencyRequired + + + + + + + Knowledge, skill, ability or personal attribute that must be demonstrated by a person or other entity in order to do something such as earn an Educational Occupational Credential or understand a LearningResource. + + + + The category or type of pharmacy associated with this cost sharing. + healthPlanPharmacyCategory + + + + + + softwareVersion + + Version of the software instance. + + + + + + monthsOfExperience + + Indicates the minimal number of months of experience required for a position. + + + + Indications regarding the permitted usage of the accommodation. + permittedUsage + + + + + + + + + significance + The significance associated with the superficial anatomy; as an example, how characteristics of the superficial anatomy can suggest underlying medical conditions or courses of treatment. + + + + Indicates a page documenting how licenses can be purchased or otherwise acquired, for the current item. + + + + The schema.org [[usageInfo]] property indicates further information about a [[CreativeWork]]. This property is applicable both to works that are freely available and to those that require payment or other transactions. It can reference additional information e.g. community expectations on preferred linking and citation conventions, as well as purchasing details. For something that can be commercially licensed, usageInfo can provide detailed, resource-specific information about licensing options. + +This property can be used alongside the license property which indicates license(s) applicable to some piece of content. The usageInfo property can provide information about other licensing options, e.g. acquiring commercial usage rights for an image that is also available under non-commercial creative commons licenses. + + usageInfo + + + + + + + + + acquireLicensePage + + + + + BodyMeasurementHeight + + Body height (measured between crown of head and soles of feet). Used, for example, to fit jackets. + + + arrivalTime + + + The expected arrival time. + + + + broadcastOfEvent + The event being broadcast such as a sporting event or awards ceremony. + + + + + increasesRiskOf + + + The condition, complication, etc. influenced by this factor. + + + + OnlineFull + Game server status: OnlineFull. Server is online but unavailable. The maximum number of players has reached. + + + + issuedThrough + + The service through with the permit was granted. + + + + PublicHolidays + This stands for any day that is a public holiday; it is a placeholder for all official public holidays in some particular location. While not technically a "day of the week", it can be used with [[OpeningHoursSpecification]]. In the context of an opening hours specification it can be used to indicate opening hours on public holidays, overriding general opening hours for the day of the week on which a public holiday occurs. + + + + + cvdNumBeds + numbeds - HOSPITAL INPATIENT BEDS: Inpatient beds, including all staffed, licensed, and overflow (surge) beds used for inpatients. + + + + + + + + Specifics about the trial design (enumerated). + trialDesign + + + + The name of the bus (e.g. Bolt Express). + + busName + + + A nail salon. + NailSalon + + + + + + + + + + + + + The service provider, service operator, or service performer; the goods producer. Another party (a seller) may offer those services or goods on behalf of the provider. A provider may also serve as the seller. + provider + + + + + + + 'carrier' is an out-dated term indicating the 'provider' for parcel delivery and flights. + + carrier + + + + ResultsAvailable + + Results are available. + + + + URL at which the app may be installed, if different from the URL of the item. + + installUrl + + + + + + performer + A performer at the event&#x2014;for example, a presenter, musician, musical group or actor. + + + + + The main performer or performers of the event&#x2014;for example, a presenter, musician, or actor. + + + performers + + + + + + Nonprofit501c25 + Nonprofit501c25: Non-profit type referring to Real Property Title-Holding Corporations or Trusts with Multiple Parents. + + + members + + + + + + A member of an Organization or a ProgramMembership. Organizations can be members of organizations; ProgramMembership is typically for individuals. + + + member + + + + A member of this organization. + + + + + + + fiberContent + + The number of grams of fiber. + + + Permission to read or view the document. + ReadPermission + + + OnSitePickup + A DeliveryMethod in which an item is collected on site, e.g. in a store or at a box office. + + + + programName + + The program providing the membership. + + + + Animal shelter. + AnimalShelter + + + WearableSizeGroupTall + Size group "Tall" for wearables. + + + + + serviceLocation + + The location (e.g. civic structure, local business, etc.) where a person can go to access the service. + + + + + + The date that this organization was founded. + foundingDate + + + + + The cuisine of the restaurant. + servesCuisine + + + + + + + + + + workExample + + Example/instance/realization/derivation of the concept of this creative work. eg. The paperback edition, first edition, or eBook. + + + + appearance + + Indicates an occurence of a [[Claim]] in some [[CreativeWork]]. + + + + ResultsNotAvailable + Results are not available. + + + The distance of the flight. + + + + flightDistance + + + + A college, university, or other third-level educational institution. + CollegeOrUniversity + + + + + + customerRemorseReturnLabelSource + The method (from an enumeration) by which the customer obtains a return shipping label for a product returned due to customer remorse. + + + + + + byMonthDay + + + Defines the day(s) of the month on which a recurring [[Event]] takes place. Specified as an [[Integer]] between 1-31. + + + + A medical code for the entity, taken from a controlled vocabulary or ontology such as ICD-9, DiseasesDB, MeSH, SNOMED-CT, RxNorm, etc. + code + + + + + The party holding the legal copyright to the CreativeWork. + + copyrightHolder + + + + + + The size system used to identify a product's size. Typically either a standard (for example, "GS1" or "ISO-EN13402"), country code (for example "US" or "JP"), or a measuring system (for example "Metric" or "Imperial"). + + + + sizeSystem + + + + + + + A sub property of participant. The loser of the action. + loser + + + + + agent + + The direct performer or driver of the action (animate or inanimate). e.g. *John* wrote a book. + + + + + alternativeOf + + Another gene which is a variation of this one. + + + + + + + + The overall rating, based on a collection of reviews or ratings, of the item. + + + + aggregateRating + + + + + + TheaterEvent + Event type: Theater performance. + + + A person or organization can have different contact points, for different purposes. For example, a sales contact point, a PR contact point and so on. This property is used to specify the kind of contact point. + + + contactType + + + + + fuelConsumption + + The amount of fuel consumed for traveling a particular distance or temporal duration with the given vehicle (e.g. liters per 100 km).\n\n* Note 1: There are unfortunately no standard unit codes for liters per 100 km. Use [[unitText]] to indicate the unit of measurement, e.g. L/100 km.\n* Note 2: There are two ways of indicating the fuel consumption, [[fuelConsumption]] (e.g. 8 liters per 100 km) and [[fuelEfficiency]] (e.g. 30 miles per gallon). They are reciprocal.\n* Note 3: Often, the absolute value is useful only when related to driving speed ("at 80 km/h") or usage pattern ("city traffic"). You can use [[valueReference]] to link the value for the fuel consumption to another value. + + + + A card payment method of a particular brand or name. Used to mark up a particular payment method and/or the financial product/service that supplies the card account.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#AmericanExpress\n* http://purl.org/goodrelations/v1#DinersClub\n* http://purl.org/goodrelations/v1#Discover\n* http://purl.org/goodrelations/v1#JCB\n* http://purl.org/goodrelations/v1#MasterCard\n* http://purl.org/goodrelations/v1#VISA + + + + CreditCard + + + + + The number of comments this CreativeWork (e.g. Article, Question or Answer) has received. This is most applicable to works published in Web sites with commenting system; additional comments may exist elsewhere. + commentCount + + + + + An ocean (for example, the Pacific). + OceanBodyOfWater + + + Characteristics of the population for which this is intended, or which typically uses it, e.g. 'adults'. + + + targetPopulation + + + + + + contentRating + + + Official rating of a piece of content&#x2014;for example,'MPAA PG-13'. + + + + The permitted weight of passengers and cargo, EXCLUDING the weight of the empty vehicle.\n\nTypical unit code(s): KGM for kilogram, LBR for pound\n\n* Note 1: Many databases specify the permitted TOTAL weight instead, which is the sum of [[weight]] and [[payload]]\n* Note 2: You can indicate additional information in the [[name]] of the [[QuantitativeValue]] node.\n* Note 3: You may also link to a [[QualitativeValue]] node that provides additional information using [[valueReference]].\n* Note 4: Note that you can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + payload + + + The place and time the release was issued, expressed as a PublicationEvent. + releasedEvent + + + + + + ICAO identifier for an airport. + icaoCode + + + + Game server status: OfflineTemporarily. Server is offline now but it can be online soon. + OfflineTemporarily + + + + + + A human-readable summary of specific accessibility features or deficiencies, consistent with the other accessibility metadata but expressing subtleties such as "short descriptions are present but long descriptions will be needed for non-visual users" or "short descriptions are present and no long descriptions are needed." + accessibilitySummary + + + The human sensory perceptual system or cognitive faculty through which a person may process or perceive information. Expected values include: auditory, tactile, textual, visual, colorDependent, chartOnVisual, chemOnVisual, diagramOnVisual, mathOnVisual, musicOnVisual, textOnVisual. + + accessMode + + + + + + A pond. + + Pond + + + + postOfficeBoxNumber + The post office box number for PO box addresses. + + + + + knows + The most generic bi-directional social/work relation. + + + + + The composer of the soundtrack. + + + + + + + + + + + musicBy + + + + DepartmentStore + A department store. + + + + A roofing contractor. + RoofingContractor + + + + Specifies that the customer receives a store credit as refund when returning a product + + StoreCreditRefund + + + NotYetRecruiting + + Not yet recruiting. + + + + + A description of the job location (e.g TELECOMMUTE for telecommute jobs). + + + jobLocationType + + + + + missionCoveragePrioritiesPolicy + + + + + For a [[NewsMediaOrganization]], a statement on coverage priorities, including any public agenda or stance on issues. + + + + Maximum girth of head above the ears. Used, for example, to fit hats. + + + BodyMeasurementHead + + + + + + Pregnancy category of this drug. + pregnancyCategory + + + + + + + The product that this structured value is referring to. + typeOfGood + + + + A permit issued by a government agency. + + GovernmentPermit + + + A system of medicine based on common theoretical concepts that originated in China and evolved over thousands of years, that uses herbs, acupuncture, exercise, massage, dietary therapy, and other methods to treat a wide range of conditions. + + TraditionalChinese + + + + + Size group "Boys" for wearables. + WearableSizeGroupBoys + + + The act of allocating an action/event/task to some destination (someone or something). + AssignAction + + + + + A colleague of the person. + + colleagues + + + + + colleague + + A colleague of the person. + + + + + + Type of software application, e.g. 'Game, Multimedia'. + + applicationCategory + + + + + + + applicationSubCategory + Subcategory of the application, e.g. 'Arcade Game'. + + + InvoicePrice + + + Represents the invoice price of an offered product. + + + + UnemploymentSupport: this is a benefit for unemployment support. + + UnemploymentSupport + + + + + isGift + Was the offer accepted as a gift for someone other than the buyer. + + + The organization (airline, travelers' club, etc.) the membership is made with. + hostingOrganization + + + + + + relatedTherapy + + + + A medical therapy related to this anatomy. + + + + ReservationHold + The status of a reservation on hold pending an update like credit card number or flight changes. + + + + The number of grams of protein. + proteinContent + + + + + + + InvestmentFund + + A company or fund that gathers capital from a number of investors to create a pool of money that is then re-invested into stocks, bonds and other assets. + + + + + Whether the legislation is currently in force, not in force, or partially in force. + legislationLegalForce + + + + + + + + + workPerformed + + + A work featured in some event, e.g. exhibited in an ExhibitionEvent. + Specific subproperties are available for workPerformed (e.g. a play), or a workPresented (a Movie at a ScreeningEvent). + + workFeatured + + + + A work performed in some event, for example a play performed in a TheaterEvent. + + + + + + sodiumContent + The number of milligrams of sodium. + + + + + The International Standard of Industrial Classification of All Economic Activities (ISIC), Revision 4 code for a particular organization, business person, or place. + + + isicV4 + + + + + + playerType + Player type required&#x2014;for example, Flash or Silverlight. + + + MotorcycleDealer + A motorcycle dealer. + + + + PaymentPastDue + The payment is due and considered late. + + + BrokerageAccount + An account that allows an investor to deposit funds and place investment orders with a licensed broker or brokerage firm. + + + + + + + MerchantReturnFiniteReturnWindow + Specifies that there is a finite window for product returns. + + + + + + The offer(s) -- e.g., product, quantity and price combinations -- included in the order. + + acceptedOffer + + + Computer programming source code. Example: Full (compile ready) solutions, code snippet samples, scripts, templates. + + + Code + + + Shipper tracking number. + trackingNumber + + + + + The date/time at which the message has been read by the recipient if a single recipient exists. + + + + dateRead + + + Nonprofit501k + + Nonprofit501k: Non-profit type referring to Child Care Organizations. + + + + AnaerobicActivity + + Physical activity that is of high-intensity which utilizes the anaerobic metabolism of the body. + + + VitalSign + + + Vital signs are measures of various physiological functions in order to assess the most basic body functions. + + + + + + + indicates (possibly multiple) shipping destinations. These can be defined in several ways e.g. postalCode ranges. + shippingDestination + + + + + + OfferForLease + + An [[OfferForLease]] in Schema.org represents an [[Offer]] to lease out something, i.e. an [[Offer]] whose + [[businessFunction]] is [lease out](http://purl.org/goodrelations/v1#LeaseOut.). See [Good Relations](https://en.wikipedia.org/wiki/GoodRelations) for + background on the underlying concepts. + + + + + + A step in making the recipe, in the form of a single item (document, video, etc.) or an ordered list with HowToStep and/or HowToSection items. + + + + recipeInstructions + + + + A single step item (as HowToStep, text, document, video, etc.) or a HowToSection. + step + + + + + + + + + + + + vehicleInteriorType + The type or material of the interior of the vehicle (e.g. synthetic fabric, leather, wood, etc.). While most interior types are characterized by the material used, an interior type can also be based on vehicle usage or target audience. + + + + + + + + + + + + category + + + + + + A category for the item. Greater signs or slashes can be used to informally indicate a category hierarchy. + + + + + + + Category of an [[Accommodation]], following real estate conventions e.g. RESO (see [PropertySubType](https://ddwiki.reso.org/display/DDW17/PropertySubType+Field), and [PropertyType](https://ddwiki.reso.org/display/DDW17/PropertyType+Field) fields for suggested values). + + + accommodationCategory + + + TattooParlor + A tattoo parlor. + + + + The region in which the locality is, and which is in the country. For example, California or another appropriate first-level [Administrative division](https://en.wikipedia.org/wiki/List_of_administrative_divisions_by_country) + + + + addressRegion + + + + + originatesFrom + The vasculature the lymphatic structure originates, or afferents, from. + + + + + Any other drug related to this one, for example commonly-prescribed alternatives. + + relatedDrug + + + + + + reservationStatus + + The current status of the reservation. + + + subStageSuffix + The substage, e.g. 'a' for Stage IIIa. + + + + + + + DrawAction + The act of producing a visual/graphical representation of an object, typically with a pen/pencil and paper as instruments. + + + albumProductionType + + + + Classification of the album by it's type of content: soundtrack, live album, studio album, etc. + + + + commentText + The text of the UserComment. + + + + Abdomen clinical examination. + + Abdomen + + + + + + dateDeleted + The datetime the item was removed from the DataFeed. + + + + Nonprofit501c8 + Nonprofit501c8: Non-profit type referring to Fraternal Beneficiary Societies and Associations. + + + + serviceAudience + + + + + + + audience + + An intended audience, i.e. a group for whom something was created. + + + + + + + The audience eligible for this service. + + + deathPlace + The place where the person died. + + + + + + Cheat codes to the game. + + cheatCode + + + + Monday + + The day of the week between Sunday and Tuesday. + + + proficiencyLevel + + Proficiency needed for this content; expected values: 'Beginner', 'Expert'. + + + + maxPrice + + + The highest price if the price is a range. + + + + + + + surface + A material used as a surface in some artwork, e.g. Canvas, Paper, Wood, Board, etc. + + + + artworkSurface + + The supporting materials for the artwork, e.g. Canvas, Paper, Wood, Board, etc. + + + + + + + + Nonprofit501c5: Non-profit type referring to Labor, Agricultural and Horticultural Organizations. + + Nonprofit501c5 + + + A specific branch of medical science that is concerned with the diagnosis and treatment of diseases pertaining to the urinary tract and the urogenital system. + + Urologic + + + A music store. + + MusicStore + + + + Nonprofit527 + + Nonprofit527: Non-profit type referring to Political organizations. + + + + + WearableSizeGroupMaternity + Size group "Maternity" for wearables. + + + + + + + + Destination(s) ( [[Place]] ) that make up a trip. For a trip where destination order is important use [[ItemList]] to specify that order (see examples). + itinerary + + + + ReserveAction + + Reserving a concrete object.\n\nRelated actions:\n\n* [[ScheduleAction]]: Unlike ScheduleAction, ReserveAction reserves concrete objects (e.g. a table, a hotel) towards a time slot / spatial allocation. + + + + A courthouse. + Courthouse + + + + + Indicates the name of the PropertyValueSpecification to be used in URL templates and form encoding in a manner analogous to HTML's input@name. + valueName + + + memoryRequirements + + + + Minimum memory requirements. + + + + + + video games.]]> + + + gamePlatform + + + OccupationalActivity + Any physical activity engaged in for job-related purposes. Examples may include waiting tables, maid service, carrying a mailbag, picking fruits or vegetables, construction work, etc. + + + + Specific physiologic risks associated to the diet plan. + + risks + + + + + + + prescribingInfo + Link to prescribing information for the drug. + + + + One of the domain specialities to which this web page's content applies. + + + specialty + + + The expected salary upon completing the training. + + salaryUponCompletion + + + + + + A recycling center. + + RecyclingCenter + + + WearableSizeGroupPetite + Size group "Petite" for wearables. + + + + + NonprofitANBI: Non-profit type referring to a Public Benefit Organization (NL). + + NonprofitANBI + + + + latitude + + + + The latitude of a location. For example ```37.42242``` ([WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)). + + + + + prepTime + The length of time it takes to prepare the items to be used in instructions or a direction, in [ISO 8601 duration format](http://en.wikipedia.org/wiki/ISO_8601). + + + + + The legal requirements such as citizenship, visa and other documentation required for an applicant to this job. + + + + eligibilityToWorkRequirement + + + + + + + A sign detected by the test. + signDetected + + + BookSeries + A series of books. Included books can be indicated with the hasPart property. + + + + TakeAction + + The act of gaining ownership of an object from an origin. Reciprocal of GiveAction.\n\nRelated actions:\n\n* [[GiveAction]]: The reciprocal of TakeAction.\n* [[ReceiveAction]]: Unlike ReceiveAction, TakeAction implies that ownership has been transfered. + + + Identifier of the flight's arrival gate. + + + arrivalGate + + + ComedyEvent + Event type: Comedy event. + + + + + + + Indicates that the vehicle meets the respective emission standard. + + + + meetsEmissionStandard + + + targetUrl + The URL of a node in an established educational framework. + + + + + Residence type: Gated community. + GatedResidenceCommunity + + + + AerobicActivity + + Physical activity of relatively low intensity that depends primarily on the aerobic energy-generating process; during activity, the aerobic metabolism uses oxygen to adequately meet energy demands during exercise. + + + + characterName + + The name of a character played in some acting or performing role, i.e. in a PerformanceRole. + + + + MixedEventAttendanceMode - an event that is conducted as a combination of both offline and online modes. + + MixedEventAttendanceMode + + + + + A sub property of object. A question. + question + + + + + + geoCrosses + + + Represents a relationship between two geometries (or the places they represent), relating a geometry to another that crosses it: "a crosses b: they have some but not all interior points in common, and the dimension of the intersection is less than that of at least one of them". As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + + A specific branch of medical science that pertains to diagnosis and treatment of disorders of digestive system. + + Gastroenterologic + + + + + + + + + + inDefinedTermSet + A [[DefinedTermSet]] that contains this term. + + + + + + + A [[CategoryCodeSet]] that contains this category code. + + inCodeSet + + + + UKTrust: Non-profit type referring to a UK trust. + + UKTrust + + + + arrivalBoatTerminal + + + + The terminal or port from which the boat arrives. + + + + + + An embedded video object. + + video + + + MisconceptionsHealthAspect + Content about common misconceptions and myths that are related to a topic. + + + + + + + + + + inChIKey + InChIKey is a hashed version of the full InChI (using the SHA-256 algorithm). + + + + printPage + + If this NewsArticle appears in print, this field indicates the name of the page on which the article is found. Please note that this field is intended for the exact page name (e.g. A5, B18). + + + functionalClass + The degree of mobility the joint allows. + + + + + + + The act of intentionally disregarding the object. An agent ignores an object. + IgnoreAction + + + + + + Play + A play is a form of literature, usually consisting of dialogue between characters, intended for theatrical performance rather than just reading. Note: A performance of a Play would be a [[TheaterEvent]] or [[BroadcastEvent]] - the *Play* being the [[workPerformed]]. + + + + Optician + A store that sells reading glasses and similar devices for improving vision. + + + + + Also known as a panel study. A cohort study is a form of longitudinal study used in medicine and social science. It is one type of study design and should be compared with a cross-sectional study. A cohort is a group of people who share a common characteristic or experience within a defined period (e.g., are born, leave school, lose their job, are exposed to a drug or a vaccine, etc.). The comparison group may be the general population from which the cohort is drawn, or it may be another cohort of persons thought to have had little or no exposure to the substance under investigation, but otherwise similar. Alternatively, subgroups within the cohort may be compared with each other. + + CohortStudy + + + + + + + Label to match an [[OfferShippingDetails]] with a [[DeliveryTimeSettings]] (within the context of a [[shippingSettingsLink]] cross-reference). + + transitTimeLabel + + + isAccessoryOrSparePartFor + + + A pointer to another product (or multiple products) for which this product is an accessory or spare part. + + + + A link related to this web page, for example to other related web pages. + relatedLink + + + + + + + Measurement of the hip section, for example of a skirt + WearableMeasurementHips + + + CharitableIncorporatedOrganization + + + CharitableIncorporatedOrganization: Non-profit type referring to a Charitable Incorporated Organization (UK). + + + + + A vet's office. + VeterinaryCare + + + Event type: Music event. + MusicEvent + + + + Information about coping or life related to the topic. + + LivingWithHealthAspect + + + + Female + The female gender. + + + + MeetingRoom + http://en.wikipedia.org/wiki/Conference_hall). +

+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+ +
+ + + + OnlineEventAttendanceMode - an event that is primarily conducted online. + OnlineEventAttendanceMode + + + + A system of medicine based on the principle that a disease can be cured by a substance that produces similar symptoms in healthy people. + Homeopathic + + + ATM/cash machine. + + AutomatedTeller + + + DefenceEstablishment + A defence establishment, such as an army or navy base. + + + + AutoDealer + + An car dealership. + + + dayOfWeek + + + + The day of the week for which these opening hours are valid. + + + + A painting. + Painting + + + + + + equal + + This ordering relation for qualitative values indicates that the subject is equal to the object. + + + version + + The version of the CreativeWork embodied by a specified resource. + + + + + MusculoskeletalExam + + Musculoskeletal system clinical examination. + + + maps + A URL to a map of the place. + + + + + + + SpokenWordAlbum. + SpokenWordAlbum + + + + + serviceUrl + The website to access the service. + + + + + currency + + + + The currency in which the monetary amount is expressed.\n\nUse standard formats: [ISO 4217 currency format](http://en.wikipedia.org/wiki/ISO_4217) e.g. "USD"; [Ticker symbol](https://en.wikipedia.org/wiki/List_of_cryptocurrencies) for cryptocurrencies e.g. "BTC"; well known names for [Local Exchange Tradings Systems](https://en.wikipedia.org/wiki/Local_exchange_trading_system) (LETS) and other currency types e.g. "Ithaca HOUR". + + + + + + The release date of a vehicle model (often used to differentiate versions of the same make and model). + vehicleModelDate + + + + + The number of grams of sugar. + + + sugarContent + + + + + United States size system for wearables. + WearableSizeSystemUS + + + Date when this media object was uploaded to this site. + + + uploadDate + + + The number of children staying in the unit. + numChildren + + + + + + + The act of registering to be a user of a service, product or web page.\n\nRelated actions:\n\n* [[JoinAction]]: Unlike JoinAction, RegisterAction implies you are registering to be a user of a service, *not* a group/team of people.\n* [FollowAction]]: Unlike FollowAction, RegisterAction doesn't imply that the agent is expecting to poll for updates from the object.\n* [[SubscribeAction]]: Unlike SubscribeAction, RegisterAction doesn't imply that the agent is expecting updates from the object. + RegisterAction + + + + + birthPlace + The place where the person was born. + + + isUnlabelledFallback + + + + + This can be marked 'true' to indicate that some published [[DeliveryTimeSettings]] or [[ShippingRateSettings]] are intended to apply to all [[OfferShippingDetails]] published by the same merchant, when referenced by a [[shippingSettingsLink]] in those settings. It is not meaningful to use a 'true' value for this property alongside a transitTimeLabel (for [[DeliveryTimeSettings]]) or shippingLabel (for [[ShippingRateSettings]]), since this property is for use with unlabelled settings. + + + + + TelevisionStation + A television station. + + + The year an [[Accommodation]] was constructed. This corresponds to the [YearBuilt field in RESO](https://ddwiki.reso.org/display/DDW17/YearBuilt+Field). + + + + + yearBuilt + + + A sub property of participant. The person/organization being supported. + + endorsee + + + + + + + + language + A sub property of instrument. The language used on this action. + + + inLanguage + + + + The language of the content or performance or used in an action. Please use one of the language codes from the [IETF BCP 47 standard](http://tools.ietf.org/html/bcp47). See also [[availableLanguage]]. + + + + + + + + + + + + + + Play mode: MultiPlayer. Requiring or allowing multiple human players to play simultaneously. + MultiPlayer + + + A specific branch of medical science that pertains to the health care of women, particularly in the diagnosis and treatment of disorders affecting the female reproductive system. + Gynecologic + + + + + + Form of markup used. eg. [SSML](https://www.w3.org/TR/speech-synthesis11) or [IPA](https://www.wikidata.org/wiki/Property:P898). + + speechToTextMarkup + + + + + + + + + The upper value of some characteristic or property. + + + maxValue + + + Represents EU Energy Efficiency Class F as defined in EU energy labeling regulations. + + EUEnergyEfficiencyCategoryF + + + + + + The platform where the train arrives. + arrivalPlatform + + + + + Description of skills and experience needed for the position or Occupation. + + experienceRequirements + + + + + valueRequired + Whether the property must be filled in to complete the action. Default is false. + + + + + EUEnergyEfficiencyCategoryD + Represents EU Energy Efficiency Class D as defined in EU energy labeling regulations. + + + + + + + The movie presented during this event. + + workPresented + + + + + The date and time the reservation was booked. + bookingTime + + + GlutenFreeDiet + A diet exclusive of gluten. + + + textValue + + + + + Text value being annotated. + + + + Pathogenic fungus. + Fungus + + + + The number of upvotes this question, answer or comment has received from the community. + + upvoteCount + + + A modifiable or non-modifiable risk factor included in the calculation, e.g. age, coexisting condition. + includedRiskFactor + + + + + + + accessibilityControl + + Identifies input methods that are sufficient to fully control the described resource ([WebSchemas wiki lists possible values](http://www.w3.org/wiki/WebSchemas/Accessibility)). + + + variesBy + Indicates the property or properties by which the variants in a [[ProductGroup]] vary, e.g. their size, color etc. Schema.org properties can be referenced by their short name e.g. "color"; terms defined elsewhere can be referenced with their URIs. + + + + + + + + + + A single episode of a podcast series. + + PodcastEpisode + + + FailedActionStatus + An action that failed to complete. The action's error property and the HTTP return code contain more information about the failure. + + + AmpStory + A creative work with a visual storytelling format intended to be viewed online, particularly on mobile devices. + + + + + + + Hotel + +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+
+ + physicalRequirement + + + + + + + A description of the types of physical activity associated with the job. Defined terms such as those in O*net may be used, but note that there is no way to specify the level of ability as well as its nature when using a defined term. + + + The type of return fees for returns of defect products. + + + + itemDefectReturnFees + + + + Permission(s) required to run the app (for example, a mobile app may require full internet access or may run only on wifi). + + permissions + + + + The parent of a question, answer or item in general. + + + parentItem + + + + algorithm + The algorithm or rules to follow to compute the score. + + + + + + + stepValue + The stepValue attribute indicates the granularity that is expected (and required) of the value in a PropertyValueSpecification. + + + + dropoffTime + When a rental car can be dropped off. + + + + procedure + A description of the procedure involved in setting up, using, and/or installing the device. + + + + + + DamagedCondition + Indicates that the item is damaged. + + + + Specifies that product returns must be made at a kiosk. + ReturnAtKiosk + + + + + + + gtin13 + + + + The GTIN-13 code of the product, or the product to which the offer refers. This is equivalent to 13-digit ISBN codes and EAN UCC-13. Former 12-digit UPC codes can be converted into a GTIN-13 code by simply adding a preceding zero. See [GS1 GTIN Summary](http://www.gs1.org/barcodes/technical/idkeys/gtin) for more details. + + + + mealService + + + Description of the meals that will be provided or available for purchase. + + + Method used for delivery or shipping. + + + + hasDeliveryMethod + + + + + + The stop or station from which the bus departs. + departureBusStop + + + The International Standard Musical Work Code for the composition. + iswcCode + + + + + + + sizeGroup + + The size group (also known as "size type") for a product's size. Size groups are common in the fashion industry to define size segments and suggested audiences for wearable products. Multiple values can be combined, for example "men's big and tall", "petite maternity" or "regular" + + + + + + + German size system for wearables. + + WearableSizeSystemDE + + + + + + Relates a property to a property that is its inverse. Inverse properties relate the same pairs of items to each other, but in reversed direction. For example, the 'alumni' and 'alumniOf' properties are inverseOf each other. Some properties don't have explicit inverses; in these situations RDFa and JSON-LD syntax for reverse properties can be used. + inverseOf + + + + The number of the item ordered. If the property is not set, assume the quantity is one. + orderQuantity + + + + + + A fire station. With firemen. + FireStation + + + + mechanismOfAction + The specific biochemical interaction through which this drug or supplement produces its pharmacological effect. + + + + + + + WearableMeasurementCup + Measurement of the cup, for example of a bra + + + + EventScheduled + The event is taking place or has taken place on the startDate as scheduled. Use of this value is optional, as it is assumed by default. + + + + doorTime + + + The time admission will commence. + + + Hematologic + A specific branch of medical science that pertains to diagnosis and treatment of disorders of blood and blood producing organs. + + + + + floorSize + + + + The size of the accommodation, e.g. in square meter or squarefoot. +Typical unit code(s): MTK for square meter, FTK for square foot, or YDK for square yard + + + Indicates whether API is managed or unmanaged. + programmingModel + + + + + + Continent + One of the continents (for example, Europe or Africa). + + + + A convenience store. + ConvenienceStore + + + KosherDiet + A diet conforming to Jewish dietary practices. + + + MerchantReturnUnlimitedWindow + + Specifies that there is an unlimited window for product returns. + + + + + countryOfLastProcessing + The place where the item (typically [[Product]]) was last processed and tested before importation. + + + + + + + Strength of the guideline's recommendation (e.g. 'class I'). + + + recommendationStrength + + + + MensClothingStore + A men's clothing store. + + + + + Device used to perform the test. + + usesDevice + + + ItemListOrderDescending + An ItemList ordered with higher values listed first. + + + The event has been postponed and no new date has been set. The event's previousStartDate should be set. + EventPostponed + + + EUEnergyEfficiencyCategoryE + + + Represents EU Energy Efficiency Class E as defined in EU energy labeling regulations. + + + + + The quantity of the given bed type available in the HotelRoom, Suite, House, or Apartment. + + numberOfBeds + + + securityClearanceRequirement + + + + + + A description of any security clearance requirements of the job. + + + Indicates if use of the media require a subscription (either paid or free). Allowed values are ```true``` or ```false``` (note that an earlier version had 'yes', 'no'). + + + + + + requiresSubscription + + + + + A sub property of participant. The winner of the action. + + winner + + + Mosque + A mosque. + + + + + + + size + A standardized size of a product or creative work, specified either through a simple textual string (for example 'XL', '32Wx34L'), a QuantitativeValue with a unitCode, or a comprehensive and structured [[SizeSpecification]]; in other cases, the [[width]], [[height]], [[depth]] and [[weight]] properties may be more applicable. + + + + + + + + Organization or person who adapts a creative work to different languages, regional differences and technical requirements of a target market, or that translates during some event. + + translator + + + + + + + ReturnFeesCustomerResponsibility + Specifies that product returns must be paid for, and are the responsibility of, the customer. + + + + Indicates the first known occurence of a [[Claim]] in some [[CreativeWork]]. + + firstAppearance + + + + + + + + + + + artist + The primary artist for a work + in a medium other than pencils or digital line art--for example, if the + primary artwork is done in watercolors or digital paints. + + + + ParkingFacility + + A parking lot or other parking facility. + + + + + codeSampleType + + + What type of code sample: full (compile ready) solution, code snippet, inline code, scripts, template. + + + What type of code sample: full (compile ready) solution, code snippet, inline code, scripts, template. + + + sampleType + + + + + + + healthPlanId + The 14-character, HIOS-generated Plan ID number. (Plan IDs must be unique, even across different markets.) + + + application + An application that can complete the request. + + + + + actionApplication + + An application that can complete the request. + + + + + + partOfInvoice + The order is being paid as part of the referenced Invoice. + + + + + illustrator + + + The illustrator of the book. + + + An organization that this person is affiliated with. For example, a school/university, a club, or a team. + + + affiliation + + + An Organization (or ProgramMembership) to which this Person or Organization belongs. + memberOf + + + + + + + + + + Neck + Neck assessment with clinical examination. + + + + LaserDiscFormat. + LaserDiscFormat + + + + + + + The depth of the item. + + depth + + + + Virus + Pathogenic virus that causes viral infection. + + + + Indicates that a document has no particular or special standing (e.g. a republication of a law by a private publisher). + + + + UnofficialLegalValue + + + + Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept. + + mentions + + + + OrderStatus representing that an order has been returned. + OrderReturned + + + + trainingSalary + + + The estimated salary earned while in the program. + + + + + + sharedContent + A CreativeWork such as an image, video, or audio clip shared as part of this posting. + + + + + + + Measurement of the outside leg, for example of pants + WearableMeasurementOutsideLeg + + + + Measurement of the waist section, for example of pants + + WearableMeasurementWaist + + + A city hall. + CityHall + + + + + + Any description of pages that is not separated into pageStart and pageEnd; for example, "1-6, 9, 55" or "10-12, 46-49". + pagination + + + + + + + + + + Nonprofit501c27 + Nonprofit501c27: Non-profit type referring to State-Sponsored Workers' Compensation Reinsurance Organizations. + + + A pointer from a previous, often discontinued variant of the product to its newer variant. + + + predecessorOf + + + + numberOfFullBathrooms + + + + + Number of full bathrooms - The total number of full and ¾ bathrooms in an [[Accommodation]]. This corresponds to the [BathroomsFull field in RESO](https://ddwiki.reso.org/display/DDW17/BathroomsFull+Field). + + + + The edition of the book. + bookEdition + + + + + exifData + + + exif data for this object. + + + + ViewAction + + The act of consuming static visual content. + + + A complex mathematical calculation requiring an online calculator, used to assess prognosis. Note: use the url property of Thing to record any URLs for online calculators. + MedicalRiskCalculator + + + + + RsvpResponseNo + The invitee will not attend. + + + + Nonprofit501c24: Non-profit type referring to Section 4049 ERISA Trusts. + + Nonprofit501c24 + + + ticketNumber + + + The unique identifier for the ticket. + + + + + spouse + The person's spouse. + + + A physical examination that can identify this sign. + + + + identifyingExam + + + MixtapeAlbum. + MixtapeAlbum + + + + Event type: Children's event. + ChildrensEvent + + + + GroceryStore + + A grocery store. + + + Indicates the number of constraints (not counting [[populationType]]) defined for a particular [[StatisticalPopulation]]. This helps applications understand if they have access to a sufficiently complete description of a [[StatisticalPopulation]]. + + numConstraints + + + + + + locationCreated + + The location where the CreativeWork was created, which may not be the same as the location depicted in the CreativeWork. + + + + sportsActivityLocation + A sub property of location. The sports activity location where this action occurred. + + + + + + + + additionalProperty + + + + A property-value pair representing an additional characteristics of the entitity, e.g. a product feature or another characteristic for which there is no matching property in schema.org.\n\nNote: Publishers should be aware that applications designed to use specific schema.org properties (e.g. https://schema.org/width, https://schema.org/color, https://schema.org/gtin13, ...) will typically expect such data to be provided using those properties, rather than using the generic property/value mechanism. + + + + + programMembershipUsed + Any membership in a frequent flyer, hotel loyalty program, etc. being applied to the reservation. + + + + + + Nonprofit501c11: Non-profit type referring to Teachers' Retirement Fund Associations. + + Nonprofit501c11 + + + PreOrder + Indicates that the item is available for pre-order. + + + + The platform from which the train departs. + departurePlatform + + + + BenefitsHealthAspect + + Content about the benefits and advantages of usage or utilization of topic. + + + + + + Real or fictional location of the game (or part of game). + gameLocation + + + + + + + screenCount + The number of screens in the movie theater. + + + + + The station where the train trip ends. + + arrivalStation + + + Indicates the timezone for which the time(s) indicated in the [[Schedule]] are given. The value provided should be among those listed in the IANA Time Zone Database. + + + + scheduleTimezone + + + + AutoRental + A car rental business. + + + + + + billingDuration + + + Specifies for how long this price (or price component) will be billed. Can be used, for example, to model the contractual duration of a subscription or payment plan. Type can be either a Duration or a Number (in which case the unit of measurement, for example month, is specified by the unitCode property). + + + + + epidemiology + + + + The characteristics of associated patients, such as age, gender, race etc. + + + + + + seatingType + + The type/class of the seat. + + + Recommended intake of this supplement for a given population as defined by a specific recommending authority. + + + recommendedIntake + + + + + + + costCategory + The category of cost, such as wholesale, retail, reimbursement cap, etc. + + + + + sibling + + + A sibling of the person. + + + + A sibling of the person. + siblings + + + + + + targetName + The name of a node in an established educational framework. + + + A thumbnail image relevant to the Thing. + + thumbnailUrl + + + + HobbyShop + A store that sells materials useful or necessary for various hobbies. + + + + + BroadcastRelease + BroadcastRelease. + + + deliveryStatus + + + New entry added as the package passes through each leg of its journey (from shipment to final delivery). + + + A playground. + Playground + + + + Event type: Visual arts event. + VisualArtsEvent + + + + Categorization and other types related to a topic. + + + TypesHealthAspect + + + + Plumber + A plumbing service. + + + PET + + Positron emission tomography imaging. + + + Type of employment (e.g. full-time, part-time, contract, temporary, seasonal, internship). + + + employmentType + + + observationDate + The observationDate of an [[Observation]]. + + + + + + + Geriatric + + + A specific branch of medical science that is concerned with the diagnosis and treatment of diseases, debilities and provision of care to the aged. + + + + Nonprofit501c18 + Nonprofit501c18: Non-profit type referring to Employee Funded Pension Trust (created before 25 June 1959). + + + + ImageGallery + + Web page type: Image gallery page. + + + + + educationalUse + + + The purpose of a work in the context of education; for example, 'assignment', 'group work'. + + + MerchantReturnUnspecified + + Specifies that a product return policy is not provided. + + + + A house painting service. + + HousePainter + + + An event venue. + EventVenue + + + + + + + The URL that goes directly to the summary of benefits and coverage for the specific standard plan or plan variation. + + benefitsSummaryUrl + + + PublicSwimmingPool + + A public swimming pool. + + + itemDefectReturnShippingFeesAmount + + + + Amount of shipping costs for defect product returns. Applicable when property [[itemDefectReturnFees]] equals [[ReturnShippingFees]]. + + + + + The amount of work expected of students taking the course, often provided as a figure per week or per month, and may be broken down by type. For example, "2 hours of lectures, 1 hour of lab work and 3 hours of independent study per week". + courseWorkload + + + + + + + UserPlays + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + + A restaurant. + Restaurant + + + + + mathExpression + + + + A mathematical expression (e.g. 'x^2-3x=0') that may be solved for a specific variable, simplified, or transformed. This can take many formats, e.g. LaTeX, Ascii-Math, or math as you would write with a keyboard. + + + Whether multiple values are allowed for the property. Default is false. + + multipleValues + + + + Size group "Misses" (also known as "Missy") for wearables. + WearableSizeGroupMisses + + + + + + A sequential publication of comic stories under a + unifying title, for example "The Amazing Spider-Man" or "Groo the + Wanderer". + + ComicSeries + + + geoOverlaps + + + Represents a relationship between two geometries (or the places they represent), relating a geometry to another that geospatially overlaps it, i.e. they have some but not all points in common. As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + + + + + The TV series to which this episode or season belongs. + + + + + + + The series to which this episode or season belongs. + + partOfSeries + + + + + partOfTVSeries + + + + + Defines the energy efficiency Category (which could be either a rating out of range of values or a yes/no certification) for a product according to an international energy efficiency standard. + + + hasEnergyEfficiencyCategory + + + + + + Qualification, candidature, degree, application that Thesis supports. + inSupportOf + + + + + + + The value of an active ingredient's strength, e.g. 325. + + strengthValue + + + Represents EnergyStar certification. + + EnergyStarCertified + + + + Tuesday + The day of the week between Monday and Wednesday. + + + + An agent inspects, determines, investigates, inquires, or examines an object's accuracy, quality, condition, or state. + + CheckAction + + + + + + The date and time of giving up ownership on the product. + ownedThrough + + + + Indicates whether this content is family friendly. + isFamilyFriendly + + + + A polygon is the area enclosed by a point-to-point path for which the starting and ending points are the same. A polygon is expressed as a series of four or more space delimited points where the first and final points are identical. + + + polygon + + + + Indicates a document for which the text is conclusively what the law says and is legally binding. (e.g. The digitally signed version of an Official Journal.) + Something "Definitive" is considered to be also [[AuthoritativeLegalValue]]. + + + DefinitiveLegalValue + + + + AccountingService + + Accountancy business.\n\nAs a [[LocalBusiness]] it can be described as a [[provider]] of one or more [[Service]]\(s). + + + + + Represents a relationship between two geometries (or the places they represent), relating a geometry to one that contains it, i.e. it is inside (i.e. within) its interior. As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + geoWithin + + + + + A sporting goods store. + SportingGoodsStore + + + + A person who founded this organization. + + + + + + founder + A person who founded this organization. + + + + founders + + + EUEnergyEfficiencyCategoryA3Plus + Represents EU Energy Efficiency Class A+++ as defined in EU energy labeling regulations. + + + + + The permitted total weight of cargo and installations (e.g. a roof rack) on top of the vehicle.\n\nTypical unit code(s): KGM for kilogram, LBR for pound\n\n* Note 1: You can indicate additional information in the [[name]] of the [[QuantitativeValue]] node.\n* Note 2: You may also link to a [[QualitativeValue]] node that provides additional information using [[valueReference]]\n* Note 3: Note that you can use [[minValue]] and [[maxValue]] to indicate ranges. + roofLoad + + + + + + + + + license + + A license document that applies to this content, typically indicated by URL. + + + + + + renegotiableLoan + + Whether the terms for payment of interest can be renegotiated during the life of the loan. + + + + + + Whether or not a property is mutable. Default is false. Specifying this for a property that also has a value makes it act similar to a "hidden" input in an HTML form. + readonlyValue + + + + + Educational background needed for the position or Occupation. + + educationRequirements + + + + + + + + A museum. + + Museum + + + replyToUrl + + + The URL at which a reply may be posted to the specified UserComment. + + + + Season + A media season e.g. tv, radio, video game etc. + + + + + A credential awarded to the Person or Organization. + hasCredential + + + + + + + educationalProgramMode + Similar to courseMode, The medium or means of delivery of the program as a whole. The value may either be a text label (e.g. "online", "onsite" or "blended"; "synchronous" or "asynchronous"; "full-time" or "part-time") or a URL reference to a term from a controlled vocabulary (e.g. https://ceds.ed.gov/element/001311#Asynchronous ). + + + + + + + + + DigitalFormat + DigitalFormat. + + + suggestedMaxAge + Maximum recommended age in years for the audience or user. + + + + + + RearWheelDriveConfiguration + Real-wheel drive is a transmission layout where the engine drives the rear wheels. + + + + + + IATA identifier for an airline or airport. + iataCode + + + Nonprofit501c21 + Nonprofit501c21: Non-profit type referring to Black Lung Benefit Trusts. + + + + + + + + recipe + A sub property of instrument. The recipe/instructions used to perform the action. + + + + primaryImageOfPage + + Indicates the main image on the page. + + + The act of editing a recipient by removing one of its objects. + DeleteAction + + + + + a type of payment made in cash during the onset of the purchase of an expensive good/service. The payment typically represents only a percentage of the full purchase price. + + + + + + downPayment + + + A specific branch of medical science that deals with the evaluation and initial treatment of medical conditions caused by trauma or sudden illness. + Emergency + + + + + + + + returnLabelSource + The method (from an enumeration) by which the customer obtains a return shipping label for a product returned for any reason. + + + + A file composed primarily of text. + + TextDigitalDocument + + + + A pointer to another product (or multiple products) for which this product is a consumable. + isConsumableFor + + + + + + + + Indicates another legislation taken into account in this consolidated legislation (which is usually the product of an editorial process that revises the legislation). This property should be used multiple times to refer to both the original version or the previous consolidated version, and to the legislations making the change. + + + legislationConsolidates + + + + + + UsageOrScheduleHealthAspect + + Content about how, when, frequency and dosage of a topic. + + + + validFor + The duration of validity of a permit or similar thing. + + + + + + + + + + The expected length of time to complete the program if attending full-time. + timeToComplete + + + + Nonprofit501c15 + + Nonprofit501c15: Non-profit type referring to Mutual Insurance Companies or Associations. + + + + + The distance travelled, e.g. exercising or travelling. + distance + + + + + + Size group "Big" for wearables. + WearableSizeGroupBig + + + usesHealthPlanIdStandard + + + The standard for interpreting thePlan ID. The preferred is "HIOS". See the Centers for Medicare & Medicaid Services for more details. + + + + + + + The quality of the video. + + videoQuality + + + + Pathology + A specific branch of medical science that is concerned with the study of the cause, origin and nature of a disease state, including its consequences as a result of manifestation of the disease. In clinical care, the term is used to designate a branch of medicine using laboratory tests to diagnose and determine the prognostic significance of illness. + + + The male gender. + Male + + + + An indicator as to whether a position is available for an immediate start. + + jobImmediateStart + + + + + + followup + + + Typical or recommended followup care after the procedure is performed. + + + + + + This ordering relation for qualitative values indicates that the subject is not equal to the object. + nonEqual + + + Specifies the Person who edited the CreativeWork. + + editor + + + + scheduledTime + + The time the object is scheduled to. + + + + + + A sub property of instrument. The exercise plan used on this action. + + + exercisePlan + + + An internet cafe. + InternetCafe + + + + + Defines the week(s) of the month on which a recurring Event takes place. Specified as an Integer between 1-5. For clarity, byMonthWeek is best used in conjunction with byDay to indicate concepts like the first and third Mondays of a month. + byMonthWeek + + + + + + The class of drug this belongs to (e.g., statins). + + + drugClass + + + + typicalAgeRange + + The typical expected age range, e.g. '7-9', '11-'. + + + + + + + A police station. + PoliceStation + + + + The act of inserting at the end if an ordered collection. + AppendAction + + + Volcano + A volcano, like Fuji san. + + + + Nonprofit501q + + + Nonprofit501q: Non-profit type referring to Credit Counseling Organizations. + + + + + rangeIncludes + + Relates a property to a class that constitutes (one of) the expected type(s) for values of the property. + + + Web page type: Checkout page. + + CheckoutPage + + + + + + A [[NewsArticle]] providing historical context, definition and detail on a specific topic (aka "explainer" or "backgrounder"). For example, an in-depth article or frequently-asked-questions ([FAQ](https://en.wikipedia.org/wiki/FAQ)) document on topics such as Climate Change or the European Union. Other kinds of background material from a non-news setting are often described using [[Book]] or [[Article]], in particular [[ScholarlyArticle]]. See also [[NewsArticle]] for related vocabulary from a learning/education perspective. + + BackgroundNewsArticle + + + + grantee + + + + + The person, organization, contact point, or audience that has been granted this permission. + + + ReportedDoseSchedule + + + A patient-reported or observed dosing schedule for a drug or supplement. + + + A ticket associated with the reservation. + + + reservedTicket + + + + One of a set of signs and symptoms that can be used to distinguish this diagnosis from others in the differential diagnosis. + + + distinguishingSign + + + + + acceptedPaymentMethod + + The payment method(s) accepted by seller for this offer. + + + + + + Nonprofit501c12 + + Nonprofit501c12: Non-profit type referring to Benevolent Life Insurance Associations, Mutual Ditch or Irrigation Companies, Mutual or Cooperative Telephone Companies. + + + + SRP + Represents the suggested retail price ("SRP") of an offered product. + + + + + VideoObjectSnapshot + + A specific and exact (byte-for-byte) version of a [[VideoObject]]. Two byte-for-byte identical files, for the purposes of this type, considered identical. If they have different embedded metadata the files will differ. Different external facts about the files, e.g. creator or dateCreated that aren't represented in their actual content, do not affect this notion of identity. + + + + + DVDFormat. + DVDFormat + + + A broadcast service to which the broadcast service may belong to such as regional variations of a national channel. + + + parentService + + + + + The URL that goes directly to the plan brochure for the specific standard plan or plan variation. + + healthPlanMarketingUrl + + + + + Defines the month(s) of the year on which a recurring [[Event]] takes place. Specified as an [[Integer]] between 1-12. January is 1. + + + + byMonth + + + + The expected progression of the condition if it is not treated and allowed to progress naturally. + naturalProgression + + + + + + LiteraryEvent + Event type: Literary event. + + + + Girth of body just below the bust. Used, for example, to fit women's swimwear. + + BodyMeasurementUnderbust + + + ShoeStore + + A shoe store. + + + Skin assessment with clinical examination. + Skin + + + + Magnetic resonance imaging. + MRI + + + + HearingImpairedSupported + Uses devices to support users with hearing impairments. + + + Content about how to screen or further filter a topic. + + + ScreeningHealthAspect + + + Online + Game server status: Online. Server is available. + + + The count of total number of reviews. + reviewCount + + + + + + Nonprofit501c1 + + Nonprofit501c1: Non-profit type referring to Corporations Organized Under Act of Congress, including Federal Credit Unions and National Farm Loan Associations. + + + A Workers Union (also known as a Labor Union, Labour Union, or Trade Union) is an organization that promotes the interests of its worker members by collectively bargaining with management, organizing, and political lobbying. + WorkersUnion + + + + + + Position of the episode within an ordered group of episodes. + + + + episodeNumber + + + OrderProblem + OrderStatus representing that there is a problem with the order. + + + LaboratoryScience + A medical science pertaining to chemical, hematological, immunologic, microscopic, or bacteriological diagnostic analyses or research. + + + + The method of cooking, such as Frying, Steaming, ... + + + cookingMethod + + + Radiography + + Radiography is an imaging technique that uses electromagnetic radiation other than visible light, especially X-rays, to view the internal structure of a non-uniformly composed and opaque object such as the human body. + + + + + + + dataFeedElement + An item within in a data feed. Data feeds may have many elements. + + + + valueMaxLength + + + Specifies the allowed range for number of characters in a literal value. + + + publication + + A publication event associated with the item. + + + + + + WearableMeasurementLength + Represents the length, for example of a dress + + + Book format: Hardcover. + Hardcover + + + School + A school. + + + + + + + percentile90 + The 90th percentile value. + + + + + numc19died - DEATHS: Patients with suspected or confirmed COVID-19 who died in the hospital, ED, or any overflow location. + cvdNumC19Died + + + + + + potentialUse + + + Intended use of the BioChemEntity by humans. + + + + + EventRescheduled + The event has been rescheduled. The event's previousStartDate should be set to the old date and the startDate should be set to the event's new date. (If the event has been rescheduled multiple times, the previousStartDate property may be repeated). + + + + Information about getting tested (for a [[MedicalCondition]]), e.g. in the context of a pandemic. + + + gettingTestedInfo + + + + + httpMethod + An HTTP method that specifies the appropriate HTTP method for a request to an HTTP EntryPoint. Values are capitalized strings as used in HTTP. + + + + + + A bookstore. + BookStore + + + Physical activity that is engaged in to improve muscle and bone strength. Also referred to as resistance training. + + StrengthTraining + + + OrderDelivered + OrderStatus representing successful delivery of an order. + + + + additionalNumberOfGuests + If responding yes, the number of guests who will attend in addition to the invitee. + + + + + + A sub property of location. The specific food establishment where the action occurred. + foodEstablishment + + + + + ReturnLabelInBox + + Specifies that a return label will be provided by the seller in the shipping box. + + + + + + Date of death. + deathDate + + + + + + pageEnd + + The page on which the work ends; for example "138" or "xvi". + + + + + + + + + bestRating + The highest value allowed in this rating system. If bestRating is omitted, 5 is assumed. + + + + + + + + + suggestedAnswer + An answer (possibly one of several, possibly incorrect) to a Question, e.g. on a Question/Answer site. + + + + acceptedAnswer + + The answer(s) that has been accepted as best, typically on a Question/Answer site. Sites vary in their selection mechanisms, e.g. drawing on community opinion and/or the view of the Question author. + + + + + productID + + + The product identifier, such as ISBN. For example: ``` meta itemprop="productID" content="isbn:123-456-789" ```. + + + + MovingCompany + A moving company. + + + + The opening hour of the place or service on the given day(s) of the week. + + opens + + + + geographicArea + + + The geographic area associated with the audience. + + + Content discussing pregnancy-related aspects of a health topic. + + PregnancyHealthAspect + + + + + Nose function assessment with clinical examination. + Nose + + + + + + FundingScheme + + A FundingScheme combines organizational, project and policy aspects of grant-based funding + that sets guidelines, principles and mechanisms to support other kinds of projects and activities. + Funding is typically organized via [[Grant]] funding. Examples of funding schemes: Swiss Priority Programmes (SPPs); EU Framework 7 (FP7); Horizon 2020; the NIH-R01 Grant Program; Wellcome institutional strategic support fund. For large scale public sector funding, the management and administration of grant awards is often handled by other, dedicated, organizations - [[FundingAgency]]s such as ERC, REA, ... + + + An embassy. + Embassy + + + + The Order(s) related to this Invoice. One or more Orders may be combined into a single Invoice. + referencesOrder + + + + + + + Nursing + A health profession of a person formally educated and trained in the care of the sick or infirm person. + + + + + Nonprofit501c28 + Nonprofit501c28: Non-profit type referring to National Railroad Retirement Investment Trusts. + + + A circle is the circular region of a specified radius centered at a specified latitude and longitude. A circle is expressed as a pair followed by a radius in meters. + circle + + + + + BarOrPub + A bar or pub. + + + + + + A dentist. + Dentist + + + + + An international trial. + InternationalTrial + + + + + + legislationIdentifier + + + + An identifier for the legislation. This can be either a string-based identifier, like the CELEX at EU level or the NOR in France, or a web-based, URL/URI identifier, like an ELI (European Legislation Identifier) or an URN-Lex. + + + + + SideEffectsHealthAspect + + Side effects that can be observed from the usage of the topic. + + + + + The URL for sending a payment. + paymentUrl + + + + + yearsInOperation + The age of the business. + + + + serviceOperator + + + The operating organization, if different from the provider. This enables the representation of services that are provided by an organization, but operated by another organization like a subcontractor. + + + + A motorcycle repair shop. + MotorcycleRepair + + + Single-celled organism that causes an infection. + + Protozoa + + + + price + The offer price of a product, or of a price component when attached to PriceSpecification and its subtypes.\n\nUsage guidelines:\n\n* Use the [[priceCurrency]] property (with standard formats: [ISO 4217 currency format](http://en.wikipedia.org/wiki/ISO_4217) e.g. "USD"; [Ticker symbol](https://en.wikipedia.org/wiki/List_of_cryptocurrencies) for cryptocurrencies e.g. "BTC"; well known names for [Local Exchange Tradings Systems](https://en.wikipedia.org/wiki/Local_exchange_trading_system) (LETS) and other currency types e.g. "Ithaca HOUR") instead of including [ambiguous symbols](http://en.wikipedia.org/wiki/Dollar_sign#Currencies_that_use_the_dollar_or_peso_sign) such as '$' in the value.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator.\n* Note that both [RDFa](http://www.w3.org/TR/xhtml-rdfa-primer/#using-the-content-attribute) and Microdata syntax allow the use of a "content=" attribute for publishing simple machine-readable values alongside more human-friendly formatting.\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols. + + + + + + + + + + ticketedSeat + The seat associated with the ticket. + + + + A system of medicine focused on promoting the body's innate ability to heal itself. + Osteopathic + + + + acquiredFrom + The organization or person from which the product was acquired. + + + + + + SpreadsheetDigitalDocument + A spreadsheet file. + + + + ListenAction + + The act of consuming audio content. + + + + Represents the cleaning fee part of the total price for an offered product, for example a vacation rental. + + CleaningFee + + + shippingLabel + + Label to match an [[OfferShippingDetails]] with a [[ShippingRateSettings]] (within the context of a [[shippingSettingsLink]] cross-reference). + + + + + + + + + Indicates whether the book is an abridged edition. + abridged + + + + A unique identifier for the membership. + + membershipNumber + + + + + The special opening hours of a certain place.\n\nUse this to explicitly override general opening hours brought in scope by [[openingHoursSpecification]] or [[openingHours]]. + + specialOpeningHoursSpecification + + + + reportNumber + The number or other unique designator assigned to a Report by the publishing organization. + + + + + paymentMethodId + + + + An identifier for the method of payment used (e.g. the last 4 digits of the credit card). + + + + Nonprofit501c13 + + Nonprofit501c13: Non-profit type referring to Cemetery Companies. + + + Source of the data used to formulate the guidance, e.g. RCT, consensus opinion, etc. + evidenceOrigin + + + + + + supplyTo + + + The area to which the artery supplies blood. + + + + + + The name of the item. + + name + + + + + studySubject + A subject of the study, i.e. one of the medical conditions, therapies, devices, drugs, etc. investigated by the study. + + + + + CDFormat + + CDFormat. + + + + StadiumOrArena + A stadium. + + + + + + A hospital with which the physician or office is affiliated. + + hospitalAffiliation + + + The number to access the service by text message. + serviceSmsNumber + + + + + + Neuro + Neurological system clinical examination. + + + + dependencies + + Prerequisites needed to fulfill steps in article. + + + interactionCount + + + + + interactionStatistic + + The number of interactions for the CreativeWork using the WebSite or SoftwareApplication. The most specific child type of InteractionCounter should be used. + + + + + This property is deprecated, alongside the UserInteraction types on which it depended. + + + Eye or ophtalmological function assessment with clinical examination. + + Eye + + + + + + Of a [[Person]], and less typically of an [[Organization]], to indicate a topic that is known about - suggesting possible expertise but not implying it. We do not distinguish skill levels here, or relate this to educational content, events, objectives or [[JobPosting]] descriptions. + + knowsAbout + + + + + + + This ordering relation for qualitative values indicates that the subject is lesser than the object. + lesser + + + + + + + WearableSizeSystemFR + + French size system for wearables. + + + + + issueNumber + + + + + Identifies the issue of publication; for example, "iii" or "2". + + + firstPerformance + The date and place the work was first performed. + + + + + + confirmationNumber + + + + A number that confirms the given order or payment has been received. + + + + + + The number of attendee places for an event that remain unallocated. + remainingAttendeeCapacity + + + LiveAlbum + LiveAlbum. + + + + query + + + A sub property of instrument. The query used on this action. + + + + countriesSupported + Countries for which the application is supported. You can also provide the two-letter ISO 3166-1 alpha-2 country code. + + + + + + Thursday + The day of the week between Wednesday and Friday. + + + + + + The specific time described by a creative work, for works (e.g. articles, video objects etc.) that emphasise a particular moment within an Event. + + contentReferenceTime + + + xpath + An XPath, e.g. of a [[SpeakableSpecification]] or [[WebPageElement]]. In the latter case, multiple matches within a page can constitute a single conceptual "Web page element". + + + + + + + The date the invoice is scheduled to be paid. + scheduledPaymentDate + + + + + Researcher + Researchers. + + + + + Device required to run the application. Used in cases where a specific make/model is required to run the application. + device + + + + Device required to run the application. Used in cases where a specific make/model is required to run the application. + + + availableOnDevice + + + + + + + Photographs of this place. + + photos + + + photo + + + A photograph of this place. + + + + + + + subTest + + + + A component test of the panel. + + + StagesHealthAspect + + Stages that can be observed from a topic. + + + + catalogNumber + + The catalog number for the release. + + + + + The year during which the claimed copyright for the CreativeWork was first asserted. + + copyrightYear + + + + The status of payment; whether the invoice has been paid or not. + + + + paymentStatus + + + DemoAlbum. + DemoAlbum + + + + + + The section location of the reserved seat (e.g. Orchestra). + seatSection + + + Specifies the Person that is legally accountable for the CreativeWork. + + accountablePerson + + + + + A person that acts in a coaching role for a sports team. + coach + + + + + dateline + A [dateline](https://en.wikipedia.org/wiki/Dateline) is a brief piece of text included in news articles that describes where and when the story was written or filed though the date is often omitted. Sometimes only a placename is provided. + +Structured representations of dateline-related information can also be expressed more explicitly using [[locationCreated]] (which represents where a work was created e.g. where a news report was written). For location depicted or described in the content, use [[contentLocation]]. + +Dateline summaries are oriented more towards human readers than towards automated processing, and can vary substantially. Some examples: "BEIRUT, Lebanon, June 2.", "Paris, France", "December 19, 2017 11:43AM Reporting from Washington", "Beijing/Moscow", "QUEZON CITY, Philippines". + + + + + ParentalSupport: this is a benefit for parental support. + + + ParentalSupport + + + Measurement of the back section, for example of a jacket + WearableMeasurementBack + + + + + Scheduling future actions, events, or tasks.\n\nRelated actions:\n\n* [[ReserveAction]]: Unlike ReserveAction, ScheduleAction allocates future actions (e.g. an event, a task, etc) towards a time slot / spatial allocation. + + ScheduleAction + + + + The act of capturing sound and moving images on film, video, or digitally. + FilmAction + + + + + ResearchProject + + + A Research project. + + + + TransformedContent + + Content coded 'transformed content' in a [[MediaReview]], considered in the context of how it was published or shared. + +For a [[VideoObject]] to be 'transformed content': or all of the video has been manipulated to transform the footage itself. This category includes using tools like the Adobe Suite to change the speed of the video, add or remove visual elements or dub audio. Deepfakes are also a subset of transformation. + +For an [[ImageObject]] to be transformed content': Adding or deleting visual elements to give the image a different meaning with the intention to mislead. + +For an [[ImageObject]] with embedded text to be 'transformed content': Adding or deleting visual elements to give the image a different meaning with the intention to mislead. + +For an [[AudioObject]] to be 'transformed content': Part or all of the audio has been manipulated to alter the words or sounds, or the audio has been synthetically generated, such as to create a sound-alike voice. + + + + + AcceptAction + The act of committing to/adopting an object.\n\nRelated actions:\n\n* [[RejectAction]]: The antonym of AcceptAction. + + + The act of producing a painting, typically with paint and canvas as instruments. + + PaintAction + + + + The date after which the price is no longer available. + priceValidUntil + + + + identifyingTest + + A diagnostic test that can identify this sign. + + + + + Event type: Business event. + BusinessEvent + + + + + A page devoted to a single item, such as a particular product or hotel. + ItemPage + + + Any discount applied (to an Order). + discount + + + + + + steps + + + + A single step item (as HowToStep, text, document, video, etc.) or a HowToSection (originally misnamed 'steps'; 'step' is preferred). + + + + + + + + + businessDays + Days of the week when the merchant typically operates, indicated via opening hours markup. + + + + DaySpa + A day spa. + + + + + ingredients + A single ingredient used in the recipe, e.g. sugar, flour or garlic. + + + + + supply + + + + A sub-property of instrument. A supply consumed when performing instructions or a direction. + + + + + A single ingredient used in the recipe, e.g. sugar, flour or garlic. + + recipeIngredient + + + + + + + + + + + This ordering relation for qualitative values indicates that the subject is greater than the object. + greater + + + + Represents the installment pricing component of the total price for an offered product. + Installment + + + + <time itemprop="openingHours" datetime="Tu,Th 16:00-20:00">Tuesdays and Thursdays 4-8pm</time>.\n* If a business is open 7 days a week, then it can be specified as <time itemprop="openingHours" datetime="Mo-Su">Monday through Sunday, all day</time>.]]> + + openingHours + + + + + + Nonprofit501c17 + + Nonprofit501c17: Non-profit type referring to Supplemental Unemployment Benefit Trusts. + + + The number of tracks in this album or playlist. + numTracks + + + + + + A type of sport (e.g. Baseball). + sport + + + + + + + + + + + duns + + The Dun & Bradstreet DUNS number for identifying an organization or business person. + + + + + Information about questions that may be asked, when to see a professional, measures before seeing a doctor or content about the first consultation. + SeeDoctorHealthAspect + + + + + How often one should engage in the activity. + + + + activityFrequency + + + Toxicologic + A specific branch of medical science that is concerned with poisons, their nature, effects and detection and involved in the treatment of poisoning. + + + + + + sportsTeam + + A sub property of participant. The sports team that participated on this action. + + + + publicAccess + + A flag to signal that the [[Place]] is open to public visitors. If this property is omitted there is no assumed default boolean value + + + + + speakable + Indicates sections of a Web page that are particularly 'speakable' in the sense of being highlighted as being especially appropriate for text-to-speech conversion. Other sections of a page may also be usefully spoken in particular circumstances; the 'speakable' property serves to indicate the parts most likely to be generally useful for speech. + +The *speakable* property can be repeated an arbitrary number of times, with three kinds of possible 'content-locator' values: + +1.) *id-value* URL references - uses *id-value* of an element in the page being annotated. The simplest use of *speakable* has (potentially relative) URL values, referencing identified sections of the document concerned. + +2.) CSS Selectors - addresses content in the annotated page, eg. via class attribute. Use the [[cssSelector]] property. + +3.) XPaths - addresses content via XPaths (assuming an XML view of the content). Use the [[xpath]] property. + + +For more sophisticated markup of speakable sections beyond simple ID references, either CSS selectors or XPath expressions to pick out document section(s) as speakable. For this +we define a supporting type, [[SpeakableSpecification]] which is defined to be a possible value of the *speakable* property. + + + + + + + + + boardingPolicy + + The type of boarding policy used by the airline (e.g. zone-based or group-based). + + + hasDigitalDocumentPermission + A permission related to the access to this document (e.g. permission to read or write an electronic document). For a public document, specify a grantee with an Audience with audienceType equal to "public". + + + + + Nonprofit501f + + Nonprofit501f: Non-profit type referring to Cooperative Service Organizations. + + + + + + + Indicates that a legislation is in force. + + InForce + + + + + + A picture or diagram made with a pencil, pen, or crayon rather than paint. + Drawing + + + Represents EU Energy Efficiency Class A as defined in EU energy labeling regulations. + EUEnergyEfficiencyCategoryA + + + + + pregnancyWarning + Any precaution, guidance, contraindication, etc. related to this drug's use during pregnancy. + + + + + + answerCount + + The number of answers this question has received. + + + + The actual body of the article. + + + articleBody + + + + Content discussing ingredients-related aspects of a health topic. + + IngredientsHealthAspect + + + + + A sub property of description. A short description of the item used to disambiguate from other, similar items. Information from other properties (in particular, name) may be necessary for the description to be useful for disambiguation. + + disambiguatingDescription + + + HVACBusiness + A business that provide Heating, Ventilation and Air Conditioning services. + + + + + + FreeReturn + Specifies that product returns are free of charge for the customer. + + + + QAPage + A QAPage is a WebPage focussed on a specific Question and its Answer(s), e.g. in a question answering site or documenting Frequently Asked Questions (FAQs). + + + + contraindication + + A contraindication for this therapy. + + + + + + + + hoursAvailable + + + The hours during which this service or contact is available. + + + WearableSizeGroupRegular + + + Size group "Regular" for wearables. + + + + Nonprofit501c7: Non-profit type referring to Social and Recreational Clubs. + Nonprofit501c7 + + + + FAQPage + A [[FAQPage]] is a [[WebPage]] presenting one or more "[Frequently asked questions](https://en.wikipedia.org/wiki/FAQ)" (see also [[QAPage]]). + + + + + RadioEpisode + A radio episode which can be part of a series or season. + + + + + additionalVariable + + Any additional component of the exercise prescription that may need to be articulated to the patient. This may include the order of exercises, the number of repetitions of movement, quantitative distance, progressions over time, etc. + + + + broadcastFrequencyValue + + + + The frequency in MHz for a particular broadcast. + + + + A [[NewsArticle]] expressing an open call by a [[NewsMediaOrganization]] asking the public for input, insights, clarifications, anecdotes, documentation, etc., on an issue, for reporting purposes. + AskPublicNewsArticle + + + + + + + An alias for the item. + + alternateName + + + + productSupported + The product or service this support contact point is related to (such as product support for a particular product line). This can be a specific product or product line (e.g. "iPhone") or a general category of products or services (e.g. "smartphones"). + + + + + + + seatRow + The row location of the reserved seat (e.g., B). + + + + + + + + Information about disease prevention. + + diseasePreventionInfo + + + Organization: Non-governmental Organization. + + NGO + + + + + + + + hasPart + + + Indicates an item or CreativeWork that is part of this item, or CreativeWork (in some sense). + + + Indicates a [[HyperTocEntry]] in a [[HyperToc]]. + + tocEntry + + + + + + SoundtrackAlbum + SoundtrackAlbum. + + + Approximate or typical time it takes to work with or through this learning resource for the typical intended target audience, e.g. 'PT30M', 'PT1H25M'. + + timeRequired + + + + A self-storage facility. + SelfStorage + + + + overdosage + + + Any information related to overdose on a drug, including signs or symptoms, treatments, contact information for emergency response. + + + + + BowlingAlley + A bowling alley. + + + + Represents EU Energy Efficiency Class A++ as defined in EU energy labeling regulations. + + EUEnergyEfficiencyCategoryA2Plus + + + parents + + + + + parent + A parent of this person. + + + + A parents of the person. + + + + + + An [[Article]] whose content is primarily [[satirical]](https://en.wikipedia.org/wiki/Satire) in nature, i.e. unlikely to be literally true. A satirical article is sometimes but not necessarily also a [[NewsArticle]]. [[ScholarlyArticle]]s are also sometimes satirized. + SatiricalArticle + + + + + + BusReservation + A reservation for bus travel. \n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + + + + + occupationLocation + The region/country for which this occupational description is appropriate. Note that educational requirements and qualifications can vary between jurisdictions. + + + + The drug's cost represents the retail cost of the drug. + + Retail + + + + Nonprofit501c10 + Nonprofit501c10: Non-profit type referring to Domestic Fraternal Societies and Associations. + + + + studyDesign + + Specifics about the observational study design (enumerated). + + + + + + Description of bonus and commission compensation aspects of the job. + + + Description of bonus and commission compensation aspects of the job. + + + incentiveCompensation + + + + incentives + + + A URL pointing to a player for a specific video. In general, this is the information in the ```src``` element of an ```embed``` tag and should not be the same as the content of the ```loc``` tag. + + + embedUrl + + + + + organizer + An organizer of an Event. + + + + warrantyPromise + + + + + + warranty + + The warranty promise(s) included in the offer. + + + + + + The warranty promise(s) included in the offer. + + + TransitMap + A transit map. + + + AudiobookFormat + Book format: Audiobook. This is an enumerated value for use with the bookFormat property. There is also a type 'Audiobook' in the bib extension which includes Audiobook specific properties. + + + A short segment/part of a video game. + VideoGameClip + + + + passengerSequenceNumber + The passenger's sequence number as assigned by the airline. + + + + + The act of consuming written content. + + ReadAction + + + + applicableLocation + + + + The location in which the status applies. + + + CompleteDataFeed + A [[CompleteDataFeed]] is a [[DataFeed]] whose standard representation includes content for every item currently in the feed. + +This is the equivalent of Atom's element as defined in Feed Paging and Archiving [RFC 5005](https://tools.ietf.org/html/rfc5005), For example (and as defined for Atom), when using data from a feed that represents a collection of items that varies over time (e.g. "Top Twenty Records") there is no need to have newer entries mixed in alongside older, obsolete entries. By marking this feed as a CompleteDataFeed, old entries can be safely discarded when the feed is refreshed, since we can assume the feed has provided descriptions for all current items. + + + + + + artEdition + The number of copies when multiple copies of a piece of artwork are produced - e.g. for a limited edition of 20 prints, 'artEdition' refers to the total number of copies (in this example "20"). + + + + + + + trainNumber + The unique identifier for the train. + + + + ActiveActionStatus + An in-progress action (e.g, while watching the movie, or driving to a location). + + + + Imperial size system. + + SizeSystemImperial + + + The conventional Western system of medicine, that aims to apply the best available evidence gained from the scientific method to clinical decision making. Also known as conventional or Western medicine. + + WesternConventional + + + The biomechanical properties of the bone. + + + biomechnicalClass + + + + EmploymentAgency + + An employment agency. + + + A line is a point-to-point path consisting of two or more points. A line is expressed as a series of two or more point objects separated by space. + line + + + + + FDAnotEvaluated + A designation that the drug in question has not been assigned a pregnancy category designation by the US FDA. + + + + + broadcastTimezone + The timezone in [ISO 8601 format](http://en.wikipedia.org/wiki/ISO_8601) for which the service bases its broadcasts + + + + + encodingType + + The supported encoding type(s) for an EntryPoint request. + + + + totalTime + The total time required to perform instructions or a direction (including time to prepare the supplies), in [ISO 8601 duration format](http://en.wikipedia.org/wiki/ISO_8601). + + + + + WearableSizeSystemEN13402 + + + EN 13402 (joint European standard for size labelling of clothes). + + + + + includedInHealthInsurancePlan + The insurance plans that cover this drug. + + + + + + + WearableSizeSystemAU + Australian size system for wearables. + + + Whether the copay is before or after deductible, etc. TODO: Is this a closed set? + + healthPlanCopayOption + + + + + + Ayurvedic + + A system of medicine that originated in India over thousands of years and that focuses on integrating and balancing the body, mind, and spirit. + + + Mexican size system for wearables. + WearableSizeSystemMX + + + + + + + The geo coordinates of the place. + + geo + + + RespiratoryTherapy + The therapy that is concerned with the maintenance or improvement of respiratory function (as in patients with pulmonary disease). + + + + + + + recipeCuisine + The cuisine of the recipe (for example, French or Ethiopian). + + + EBook + Book format: Ebook. + + + HardwareStore + A hardware store. + + + + + + A sub property of recipient. The recipient who was directly sent the message. + + + + toRecipient + + + + + + A predefined value from OfferItemCondition specifying the condition of the product or service, or the products or services included in the offer. Also used for product return policies to specify the condition of products accepted for returns. + + itemCondition + + + + + NewCondition + Indicates that the item is new. + + + MultiCenterTrial + A trial that takes place at multiple centers. + + + + + Nonprofit501c9: Non-profit type referring to Voluntary Employee Beneficiary Associations. + Nonprofit501c9 + + + + PsychologicalTreatment + + A process of care relying upon counseling, dialogue and communication aimed at improving a mental health condition without use of drugs. + + + + hasCourseInstance + An offering of the course at a specific time and place or through specific media or mode of study or to a specific section of students. + + + + + + + numberOfPages + The number of pages in the book. + + + The airline boards by groups based on check-in time, priority, etc. + GroupBoardingPolicy + + + + Proprietary name given to the diet plan, typically by its originator or creator. + proprietaryName + + + + + + + + The color of the product. + + color + + + An aspect of medical practice that is considered on the page, such as 'diagnosis', 'treatment', 'causes', 'prognosis', 'etiology', 'epidemiology', etc. + + + aspect + + + Indicates if this web page element is the main subject of the page. + + + mainContentOfPage + + + + + + The volume swept by all of the pistons inside the cylinders of an internal combustion engine in a single movement. \n\nTypical unit code(s): CMQ for cubic centimeter, LTR for liters, INQ for cubic inches\n* Note 1: You can link to information about how the given value has been determined using the [[valueReference]] property.\n* Note 2: You can use [[minValue]] and [[maxValue]] to indicate ranges. + + + + engineDisplacement + + + + + The transaction volume, in a monetary unit, for which the offer or price specification is valid, e.g. for indicating a minimal purchasing volume, to express free shipping above a certain order volume, or to limit the acceptance of credit cards to purchases to a certain minimal amount. + + + eligibleTransactionVolume + + + + + + Cemetery + A graveyard. + + + The size of the business in annual revenue. + yearlyRevenue + + + + + + + The number of grams of carbohydrates. + carbohydrateContent + + + Something relating to or practicing dermatology. + + + Dermatology + + + A specific branch of medical science that pertains to diagnosis and treatment of disorders of skin. + + + Dermatologic + + + + A publication event e.g. catch-up TV or radio podcast, during which a program is available on-demand. + + OnDemandEvent + + + + + Nonprofit501c22 + Nonprofit501c22: Non-profit type referring to Withdrawal Liability Payment Funds. + + + Size group "Husky" (or "Stocky") for wearables. + + WearableSizeGroupHusky + + + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + UserBlocks + + + + shippingRate + + + + + The shipping rate is the cost of shipping to the specified destination. Typically, the maxValue and currency values (of the [[MonetaryAmount]]) are most appropriate. + + + + Indicates that the item is available on back order. + BackOrder + + + nationality + + + Nationality of the person. + + + ratingValue + The rating for the content.\n\nUsage guidelines:\n\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + + + + + + sportsEvent + + + + A sub property of location. The sports event where this action occurred. + + + + The supported content type(s) for an EntryPoint response. + contentType + + + + + FrontWheelDriveConfiguration + Front-wheel drive is a transmission layout where the engine drives the front wheels. + + + The boolean value true. + True + + + + + The number of employees in an organization e.g. business. + + numberOfEmployees + + + + connectedTo + + + Other anatomical structures to which this structure is connected. + + + alternativeHeadline + + + A secondary title of the CreativeWork. + + + Specifies that a refund can be done in the full amount the customer paid for the product + + FullRefund + + + + OneTimePayments: this is a benefit for one-time payments for individuals. + + OneTimePayments + + + + RVPark + + A place offering space for "Recreational Vehicles", Caravans, mobile homes and the like. + + + Link to the repository where the un-compiled, human readable code and related code is located (SVN, github, CodePlex). + + codeRepository + + + + + Seasonal override of a return policy. + + + + returnPolicySeasonalOverride + + + + eventStatus + + An eventStatus of an event represents its status; particularly useful when an event is cancelled or rescheduled. + + + Registry + A registry-based study design. + + + + A sea (for example, the Caspian sea). + SeaBodyOfWater + + + + + observedNode + The observedNode of an [[Observation]], often a [[StatisticalPopulation]]. + + + + + + servicePostalAddress + The address for accessing the service by mail. + + + + + + + representativeOfPage + Indicates whether this image is representative of the content of the page. + + + + Nutritional information specific to the dietary plan. May include dietary recommendations on what foods to avoid, what foods to consume, and specific alterations/deviations from the USDA or other regulatory body's approved dietary guidelines. + + dietFeatures + + + + The episode to which this clip belongs. + + partOfEpisode + + + + + The medium or means of delivery of the course instance or the mode of study, either as a text label (e.g. "online", "onsite" or "blended"; "synchronous" or "asynchronous"; "full-time" or "part-time") or as a URL reference to a term from a controlled vocabulary (e.g. https://ceds.ed.gov/element/001311#Asynchronous ). + + courseMode + + + + + Indicates whether the vehicle has been used for special purposes, like commercial rental, driving school, or as a taxi. The legislation in many countries requires this information to be revealed when offering a car for sale. + + + vehicleSpecialUsage + + + + + + + safetyConsideration + + + Any potential safety concern associated with the supplement. May include interactions with other drugs and foods, pregnancy, breastfeeding, known adverse reactions, and documented efficacy of the supplement. + + + OrderPaymentDue + OrderStatus representing that payment is due on an order. + + + + + + + handlingTime + The typical delay between the receipt of the order and the goods either leaving the warehouse or being prepared for pickup, in case the delivery method is on site pickup. Typical properties: minValue, maxValue, unitCode (d for DAY). This is by common convention assumed to mean business days (if a unitCode is used, coded as "d"), i.e. only counting days when the business normally operates. + + + + PrependAction + The act of inserting at the beginning if an ordered collection. + + + Indicates whether this game is multi-player, co-op or single-player. The game can be marked as multi-player, co-op and single-player at the same time. + + playMode + + + + + The act of notifying someone that a future event/action is going to happen as expected.\n\nRelated actions:\n\n* [[CancelAction]]: The antonym of ConfirmAction. + + ConfirmAction + + + + + Quantitative measure of the physiologic output of the exercise; also referred to as energy expenditure. + + + workload + + + + screenshot + + + A link to a screenshot image of the app. + + + + + + + + The cost per unit of the drug. + costPerUnit + + + + Longitudinal + Unlike cross-sectional studies, longitudinal studies track the same people, and therefore the differences observed in those people are less likely to be the result of cultural differences across generations. Longitudinal studies are also used in medicine to uncover predictors of certain diseases. + + + + UserReview + + A review created by an end-user (e.g. consumer, purchaser, attendee etc.), in contrast with [[CriticReview]]. + + + + + + + insertion + The place of attachment of a muscle, or what the muscle moves. + + + + Hostel +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+
+ + HighSchool + + A high school. + + + The act of expressing a difference of opinion with the object. An agent disagrees to/about an object (a proposition, topic or theme) with participants. + + DisagreeAction + + + EvidenceLevelB + Data derived from a single randomized trial, or nonrandomized studies. + + + + Date the content expires and is no longer useful or available. For example a [[VideoObject]] or [[NewsArticle]] whose availability or relevance is time-limited, or a [[ClaimReview]] fact check whose publisher wants to indicate that it may no longer be relevant (or helpful to highlight) after some date. + + + expires + + + Any physical activity engaged in for recreational purposes. Examples may include ballroom dancing, roller skating, canoeing, fishing, etc. + + LeisureTimeActivity + + + + downvoteCount + The number of downvotes this question, answer or comment has received from the community. + + + + A preschool. + + Preschool + + + + Measurement of the width, for example of shoes + + WearableMeasurementWidth + + + Balance + Physical activity that is engaged to help maintain posture and balance. + + + + The current status of the order. + + orderStatus + + + + GettingAccessHealthAspect + Content that discusses practical and policy aspects for getting access to specific kinds of healthcare (e.g. distribution mechanisms for vaccines). + + + + + + + manufacturer + The manufacturer of the product. + + + + + PotentialActionStatus + A description of an action that is supported. + + + sourcedFrom + + + The neurological pathway that originates the neurons. + + + + FDAcategoryB + A designation by the US FDA signifying that animal reproduction studies have failed to demonstrate a risk to the fetus and there are no adequate and well-controlled studies in pregnant women. + + + + + A radio channel that uses FM. + FMRadioChannel + + + + Nonprofit501c26: Non-profit type referring to State-Sponsored Organizations Providing Health Coverage for High-Risk Individuals. + Nonprofit501c26 + + + + + SizeSystemMetric + Metric size system. + + + + + IceCreamShop + An ice cream shop. + + + + + possibleComplication + + A possible unexpected and unfavorable evolution of a medical condition. Complications may include worsening of the signs or symptoms of the disease, extension of the condition to other organ systems, etc. + + + + + Nonprofit501n + + Nonprofit501n: Non-profit type referring to Charitable Risk Pools. + + + + FourWheelDriveConfiguration + Four-wheel drive is a transmission layout where the engine primarily drives two wheels with a part-time four-wheel drive capability. + + + Event type: Sales event. + + SaleEvent + + + MulticellularParasite + + Multicellular parasite that causes an infection. + + + Links to tips, tactics, etc. + + gameTip + + + + A computer store. + + ComputerStore + + + SiteNavigationElement + A navigation element of the page. + + + + A system of medicine focused on the relationship between the body's structure, mainly the spine, and its functioning. + Chiropractic + + + + LegislativeBuilding + + A legislative building&#x2014;for example, the state capitol. + + + HinduDiet + A diet conforming to Hindu dietary practices, in particular, beef-free. + + + SinglePlayer + Play mode: SinglePlayer. Which is played by a lone player. + + + A diet focused on reduced fat and cholesterol intake. + LowFatDiet + + + Specifies that the customer must pay a restocking fee when returning a product + RestockingFees + + + + + Information about how or where to find a topic. Also may contain location data that can be used for where to look for help if the topic is observed. + + + HowOrWhereHealthAspect + + + BodyMeasurementInsideLeg + + Inside leg (measured between crotch and soles of feet). Used, for example, to fit pants. + + + + RightHandDriving + The steering position is on the right side of the vehicle (viewed from the main direction of driving). + + + + + Represents a relationship between two geometries (or the places they represent), relating a covering geometry to a covered geometry. "Every point of b is a point of (the interior or boundary of) a". As defined in [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM). + + + + geoCovers + + + PaymentDue + The payment is due, but still within an acceptable time to be received. + + + + + + accessModeSufficient + A list of single or combined accessModes that are sufficient to understand all the intellectual content of a resource. Expected values include: auditory, tactile, textual, visual. + + + + + A member of a music group&#x2014;for example, John, Paul, George, or Ringo. + + + musicGroupMember + + + + The act of forming a personal connection with someone/something (object) unidirectionally/asymmetrically to get updates pushed to.\n\nRelated actions:\n\n* [[FollowAction]]: Unlike FollowAction, SubscribeAction implies that the subscriber acts as a passive agent being constantly/actively pushed for updates.\n* [[RegisterAction]]: Unlike RegisterAction, SubscribeAction implies that the agent is interested in continuing receiving updates from the object.\n* [[JoinAction]]: Unlike JoinAction, SubscribeAction implies that the agent is interested in continuing receiving updates from the object. + SubscribeAction + + + + department + A relationship between an organization and a department of that organization, also described as an organization (allowing different urls, logos, opening hours). For example: a store with a pharmacy, or a bakery with a cafe. + + + + Printed music, as opposed to performed or recorded music. + SheetMusic + + + + + + A modifiable or non-modifiable factor that increases the risk of a patient contracting this condition, e.g. age, coexisting condition. + riskFactor + + + + + + + + requiredGender + Audiences defined by a person's gender. + + + A private parcel service as the delivery mode available for a certain offer.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#DHL\n* http://purl.org/goodrelations/v1#FederalExpress\n* http://purl.org/goodrelations/v1#UPS + + ParcelService + + + + + + urlTemplate + An url template (RFC6570) that will be used to construct the target of the execution of the action. + + + + + An indication for a medical therapy that has been formally specified or approved by a regulatory body that regulates use of the therapy; for example, the US FDA approves indications for most drugs in the US. + ApprovedIndication + + + The invitee may or may not attend. + RsvpResponseMaybe + + + Contact details for further information relevant to this job posting. + + applicationContact + + + + + + Waterfall + + A waterfall, like Niagara. + + + QuoteAction + An agent quotes/estimates/appraises an object/product/service with a price at a location/store. + + + + UnRegisterAction + The act of un-registering from a service.\n\nRelated actions:\n\n* [[RegisterAction]]: antonym of UnRegisterAction.\n* [[LeaveAction]]: Unlike LeaveAction, UnRegisterAction implies that you are unregistering from a service you werer previously registered, rather than leaving a team/group of people. + + + + + + jobTitle + + The job title of the person (for example, Financial Manager). + + + + + + + educationalFramework + The framework to which the resource being described is aligned. + + + DigitalAudioTapeFormat. + DigitalAudioTapeFormat + + + + + Web page type: Profile page. + ProfilePage + + + GraphicNovel + Book format: GraphicNovel. May represent a bound collection of ComicIssue instances. + + + + MotorizedBicycle + + A motorized bicycle is a bicycle with an attached motor used to power the vehicle, or to assist with pedaling. + + + + + Size of the application / package (e.g. 18MB). In the absence of a unit (MB, KB etc.), KB will be assumed. + + fileSize + + + + The boolean value false. + False + + + + + + + yield + + The quantity that results by performing instructions. For example, a paper airplane, 10 personalized candles. + + + + The quantity produced by the recipe (for example, number of people served, number of servings, etc). + + + recipeYield + + + blogPosts + + + blogPost + A posting that is part of this blog. + + + + + + + Indicates a post that is part of a [[Blog]]. Note that historically, what we term a "Blog" was once known as a "weblog", and that what we term a "BlogPosting" is now often colloquially referred to as a "blog". + + + A wholesale store. + + WholesaleStore + + + + PetStore + A pet store. + + + warrantyScope + The scope of the warranty promise. + + + + + + + An option available on this contact point (e.g. a toll-free number or support for hearing-impaired callers). + contactOption + + + + + Indicates a target EntryPoint for an Action. + + target + + + Medical expert advice related to the plan. + + + + expertConsiderations + + + Represents the activation fee part of the total price for an offered product, for example a cellphone contract. + + + ActivationFee + + + + + dissolutionDate + The date that this organization was dissolved. + + + + + ContagiousnessHealthAspect + Content about contagion mechanisms and contagiousness information over the topic. + + + The scientific study and treatment of defects, disorders, and malfunctions of speech and voice, as stuttering, lisping, or lalling, and of language disturbances, as aphasia or delayed language acquisition. + + SpeechPathology + + + Size group "Extra Tall" for wearables. + WearableSizeGroupExtraTall + + + + + Game server status: OfflinePermanently. Server is offline and not available. + OfflinePermanently + + + + + + datePublished + Date of first broadcast/publication. + + + Saturday + The day of the week between Friday and Sunday. + + + + The date when the item is no longer valid. + + + validUntil + + + The number of grams of fat. + fatContent + + + + + + RisksOrComplicationsHealthAspect + Information about the risk factors and possible complications that may follow a topic. + + + + + PreventionIndication + An indication for preventing an underlying condition, symptom, etc. + + + + numventuse - MECHANICAL VENTILATORS IN USE: Total number of ventilators in use. + + + cvdNumVentUse + + + + + + MobilePhoneStore + A store that sells mobile phones and related accessories. + + + + AdultEntertainment + An adult entertainment establishment. + + + orderDate + + + + Date order was placed. + + + LandmarksOrHistoricalBuildings + + An historical landmark or building. + + + A randomized trial design. + RandomizedTrial + + + + Event type: Festival. + Festival + + + + VeganDiet + A diet exclusive of all animal products. + + + Appearance + + Appearance assessment with clinical examination. + + + + + + cargoVolume + The available volume for cargo or luggage. For automobiles, this is usually the trunk volume.\n\nTypical unit code(s): LTR for liters, FTQ for cubic foot/feet\n\nNote: You can use [[minValue]] and [[maxValue]] to indicate ranges. + + + UsedCondition + Indicates that the item is used. + + + + How the disease spreads, either as a route or vector, for example 'direct contact', 'Aedes aegypti', etc. + + transmissionMethod + + + + + A description of the workup, testing, and other preparations required before implanting this device. + + + preOp + + + + A reservation for train travel.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + TrainReservation + + + + trainName + + The name of the train (e.g. The Orient Express). + + + + dateReceived + The date/time the message was received if a single recipient exists. + + + + + The number of grams of saturated fat. + + saturatedFatContent + + + + + + The Occupation for the JobPosting. + relevantOccupation + + + An EndorsementRating is a rating that expresses some level of endorsement, for example inclusion in a "critic's pick" blog, a +"Like" or "+1" on a social network. It can be considered the [[result]] of an [[EndorseAction]] in which the [[object]] of the action is rated positively by +some [[agent]]. As is common elsewhere in schema.org, it is sometimes more useful to describe the results of such an action without explicitly describing the [[Action]]. + +An [[EndorsementRating]] may be part of a numeric scale or organized system, but this is not required: having an explicit type for indicating a positive, +endorsement rating is particularly useful in the absence of numeric scales as it helps consumers understand that the rating is broadly positive. + + + EndorsementRating + + + + + Size group "Girls" for wearables. + + WearableSizeGroupGirls + + + birthDate + + Date of birth. + + + + CaseSeries + A case series (also known as a clinical series) is a medical research study that tracks patients with a known exposure given similar treatment or examines their medical records for exposure and outcome. A case series can be retrospective or prospective and usually involves a smaller number of patients than the more powerful case-control studies or randomized controlled trials. Case series may be consecutive or non-consecutive, depending on whether all cases presenting to the reporting authors over a period of time were included, or only a selection. + + + + + annualPercentageRate + + + The annual rate that is charged for borrowing (or made by investing), expressed as a single percentage number that represents the actual yearly cost of funds over the term of a loan. This includes any fees or additional costs associated with the transaction. + + + + OrderStatus representing that an order is being processed. + OrderProcessing + + + Original definition: "provider of professional services."\n\nThe general [[ProfessionalService]] type for local businesses was deprecated due to confusion with [[Service]]. For reference, the types that it included were: [[Dentist]], + [[AccountingService]], [[Attorney]], [[Notary]], as well as types for several kinds of [[HomeAndConstructionBusiness]]: [[Electrician]], [[GeneralContractor]], + [[HousePainter]], [[Locksmith]], [[Plumber]], [[RoofingContractor]]. [[LegalService]] was introduced as a more inclusive supertype of [[Attorney]]. + + ProfessionalService + + + + ContactPage + Web page type: Contact page. + + + WearableMeasurementHeight + + + Measurement of the height, for example the heel height of a shoe + + + + + subEvent + + + An Event that is part of this event. For example, a conference event includes many presentations, each of which is a subEvent of the conference. + + + + Events that are a part of this event. For example, a conference event includes many presentations, each subEvents of the conference. + + subEvents + + + + reservationId + + + A unique identifier for the reservation. + + + Taxi + + A taxi. + + + + + Other prominent or relevant topics tied to the main topic. + + RelatedTopicsHealthAspect + + + Library file name e.g., mscorlib.dll, system.web.dll. + + + + Library file name e.g., mscorlib.dll, system.web.dll. + + executableLibraryName + + + + + assembly + + + ReservationConfirmed + The status of a confirmed reservation. + + + The payee received the payment, but it was declined for some reason. + PaymentDeclined + + + FoodService + + + A food service, like breakfast, lunch, or dinner. + + + + + + + The value of the dose, e.g. 500. + doseValue + + + + + + The anatomical or organ system that the vein flows into; a larger structure that the vein connects to. + tributary + + + Permission to add comments to the document. + CommentPermission + + + Mountain + A mountain, like Mount Whitney or Mount Everest. + + + + An Insurance agency. + InsuranceAgency + + + + ReservationCancelled + The status for a previously confirmed reservation that is now cancelled. + + + Aquarium + + Aquarium. + + + Canal + + A canal, like the Panama Canal. + + + CompletedActionStatus + An action that has already taken place. + + + + TouristTrip + + + + A tourist trip. A created itinerary of visits to one or more places of interest ([[TouristAttraction]]/[[TouristDestination]]) often linked by a similar theme, geographic area, or interest to a particular [[touristType]]. The [UNWTO](http://www2.unwto.org/) defines tourism trip as the Trip taken by visitors. + (See examples below). + + + + ParentAudience + + A set of characteristics describing parents, who can be interested in viewing some content. + + + DrugPregnancyCategory + + Categories that represent an assessment of the risk of fetal injury due to a drug or pharmaceutical used as directed by the mother during pregnancy. + + + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + + + UserComments + + + TouristDestination + + + A tourist destination. In principle any [[Place]] can be a [[TouristDestination]] from a [[City]], Region or [[Country]] to an [[AmusementPark]] or [[Hotel]]. This Type can be used on its own to describe a general [[TouristDestination]], or be used as an [[additionalType]] to add tourist relevant properties to any other [[Place]]. A [[TouristDestination]] is defined as a [[Place]] that contains, or is colocated with, one or more [[TouristAttraction]]s, often linked by a similar theme or interest to a particular [[touristType]]. The [UNWTO](http://www2.unwto.org/) defines Destination (main destination of a tourism trip) as the place visited that is central to the decision to take the trip. + (See examples below). + + + + + + + + Any specific branch of medical science or practice. Medical specialities include clinical specialties that pertain to particular organ systems and their respective disease states, as well as allied health specialties. Enumerated type. + MedicalSpecialty + + + + Any part of the human body, typically a component of an anatomical system. Organs, tissues, and cells are all anatomical structures. + + + AnatomicalStructure + + + + VirtualLocation + + + An online or virtual location for attending events. For example, one may attend an online seminar or educational event. While a virtual location may be used as the location of an event, virtual locations should not be confused with physical locations in the real world. + + + recordedIn + + + recordedAt + + + The Event where the CreativeWork was recorded. The CreativeWork may capture all or part of the event. + + + + + + The CreativeWork that captured all or part of this Event. + + + + http://en.wikipedia.org/wiki/Apartment).]]> + + Apartment + + + + exampleOfWork + + + + A creative work that this work is an example/instance/realization/derivation of. + + + + + A structured value representing exchange rate. + + ExchangeRateSpecification + + + + WebPage + + breadcrumb may be used. We recommend explicit declaration if these properties are specified, but if they are found outside of an itemscope, they will be assumed to be about the page.]]> + + + + + ActionAccessSpecification + A set of requirements that a must be fulfilled in order to perform an Action. + + + IndividualProduct + + + A single, identifiable product instance (e.g. a laptop with a particular serial number). + + + Represents the collection of all sports organizations, including sports teams, governing bodies, and sports associations. + SportsOrganization + + + + USNonprofitType + USNonprofitType: Non-profit organization type originating from the United States. + + + + + + + + + Indicates the kind of product that this is a variant of. In the case of [[ProductModel]], this is a pointer (from a ProductModel) to a base product from which this product is a variant. It is safe to infer that the variant inherits all product features from the base model, unless defined locally. This is not transitive. In the case of a [[ProductGroup]], the group description also serves as a template, representing a set of Products that vary on explicitly defined, specific dimensions only (so it defines both a set of variants, as well as which values distinguish amongst those variants). When used with [[ProductGroup]], this property can apply to any [[Product]] included in the group. + + + Indicates a [[Product]] that is a member of this [[ProductGroup]] (or [[ProductModel]]). + + + hasVariant + + + + + + isVariantOf + + + + + GameServerStatus + Status of a game server. + + + + MedicalObservationalStudy + + An observational study is a type of medical study that attempts to infer the possible effect of a treatment through observation of a cohort of subjects over a period of time. In an observational study, the assignment of subjects into treatment groups versus control groups is outside the control of the investigator. This is in contrast with controlled studies, such as the randomized controlled trials represented by MedicalTrial, where each subject is randomly assigned to a treatment group or a control group before the start of the treatment. + + + + A GeoCircle is a GeoShape representing a circular geographic area. As it is a GeoShape + it provides the simple textual property 'circle', but also allows the combination of postalCode alongside geoRadius. + The center of the circle can be indicated via the 'geoMidpoint' property, or more approximately using 'address', 'postalCode'. + + GeoCircle + + + + DDxElement + An alternative, closely-related condition typically considered later in the differential diagnosis process along with the signs that are used to distinguish it. + + + + + The price asked for a given offer by the respective organization or person. + + + UnitPriceSpecification + + + PriceComponentTypeEnumeration + + Enumerates different price components that together make up the total price for an offered product. + + + + + + House + http://en.wikipedia.org/wiki/House).]]> + + + + + A Role that represents a Web link e.g. as expressed via the 'url' property. Its linkRelationship property can indicate URL-based and plain textual link types e.g. those in IANA link registry or others such as 'amphtml'. This structure provides a placeholder where details from HTML's link element can be represented outside of HTML, e.g. in JSON-LD feeds. + LinkRole + + + + + A condition or factor that indicates use of a medical therapy, including signs, symptoms, risk factors, anatomical states, etc. + + + MedicalIndication + + + A series of movies. Included movies can be indicated with the hasPart property. + + MovieSeries + + + + A video game series. + VideoGameSeries + + + + + A DefinedRegion is a geographic area defined by potentially arbitrary (rather than political, administrative or natural geographical) criteria. Properties are provided for defining a region by reference to sets of postal codes. + +Examples: a delivery destination when shopping. Region where regional pricing is configured. + +Requirement 1: +Country: US +States: "NY", "CA" + +Requirement 2: +Country: US +PostalCode Set: { [94000-94585], [97000, 97999], [13000, 13599]} +{ [12345, 12345], [78945, 78945], } +Region = state, canton, prefecture, autonomous community... + + + DefinedRegion + + + PriceSpecification + + A structured value representing a price or price range. Typically, only the subclasses of this type are used for markup. It is recommended to use [[MonetaryAmount]] to describe independent amounts of money such as a salary, credit card limits, etc. + + + + DeliveryChargeSpecification + The price for the delivery of an offer using a particular delivery method. + + + + + + + Closest parent taxon of the taxon in question. + + + parentTaxon + + + + + Closest child taxa of the taxon in question. + + childTaxon + + + + + + + + + + + + + + + + + + + + + + + An item being offered (or demanded). The transactional nature of the offer or demand is documented using [[businessFunction]], e.g. sell, lease etc. While several common expected types are listed explicitly in this definition, others can be used. Using a second type, such as Product or a subtype of Product, can clarify the nature of the offer. + itemOffered + + + + + + An offer to provide this item&#x2014;for example, an offer to sell a product, rent the DVD of a movie, perform a service, or give away tickets to an event. Use [[businessFunction]] to indicate the kind of transaction offered, i.e. sell, lease, etc. This property can also be used to describe a [[Demand]]. While this property is listed as expected on a number of common types, it can be used in others. In that case, using a second type, such as Product or a subtype of Product, can clarify the nature of the offer. + + + offers + + + + + + + + + + A guideline recommendation that is regarded as efficacious and where quality of the data supporting the recommendation is sound. + + MedicalGuidelineRecommendation + + + + A type of blood vessel that specifically carries blood to the heart. + Vein + + + + + + SpecialAnnouncement + + + A SpecialAnnouncement combines a simple date-stamped textual information update + with contextualized Web links and other structured data. It represents an information update made by a + locally-oriented organization, for example schools, pharmacies, healthcare providers, community groups, police, + local government. + +For work in progress guidelines on Coronavirus-related markup see [this doc](https://docs.google.com/document/d/14ikaGCKxo50rRM7nvKSlbUpjyIk2WMQd3IkB1lItlrM/edit#). + +The motivating scenario for SpecialAnnouncement is the [Coronavirus pandemic](https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic), and the initial vocabulary is oriented to this urgent situation. Schema.org +expect to improve the markup iteratively as it is deployed and as feedback emerges from use. In addition to our +usual [Github entry](https://github.com/schemaorg/schemaorg/issues/2490), feedback comments can also be provided in [this document](https://docs.google.com/document/d/1fpdFFxk8s87CWwACs53SGkYv3aafSxz_DTtOQxMrBJQ/edit#). + + +While this schema is designed to communicate urgent crisis-related information, it is not the same as an emergency warning technology like [CAP](https://en.wikipedia.org/wiki/Common_Alerting_Protocol), although there may be overlaps. The intent is to cover +the kinds of everyday practical information being posted to existing websites during an emergency situation. + +Several kinds of information can be provided: + +We encourage the provision of "name", "text", "datePosted", "expires" (if appropriate), "category" and +"url" as a simple baseline. It is important to provide a value for "category" where possible, most ideally as a well known +URL from Wikipedia or Wikidata. In the case of the 2019-2020 Coronavirus pandemic, this should be "https://en.wikipedia.org/w/index.php?title=2019-20\_coronavirus\_pandemic" or "https://www.wikidata.org/wiki/Q81068910". + +For many of the possible properties, values can either be simple links or an inline description, depending on whether a summary is available. For a link, provide just the URL of the appropriate page as the property's value. For an inline description, use a [[WebContent]] type, and provide the url as a property of that, alongside at least a simple "[[text]]" summary of the page. It is +unlikely that a single SpecialAnnouncement will need all of the possible properties simultaneously. + +We expect that in many cases the page referenced might contain more specialized structured data, e.g. contact info, [[openingHours]], [[Event]], [[FAQPage]] etc. By linking to those pages from a [[SpecialAnnouncement]] you can help make it clearer that the events are related to the situation (e.g. Coronavirus) indicated by the [[category]] property of the [[SpecialAnnouncement]]. + +Many [[SpecialAnnouncement]]s will relate to particular regions and to identifiable local organizations. Use [[spatialCoverage]] for the region, and [[announcementLocation]] to indicate specific [[LocalBusiness]]es and [[CivicStructure]]s. If the announcement affects both a particular region and a specific location (for example, a library closure that serves an entire region), use both [[spatialCoverage]] and [[announcementLocation]]. + +The [[about]] property can be used to indicate entities that are the focus of the announcement. We now recommend using [[about]] only +for representing non-location entities (e.g. a [[Course]] or a [[RadioStation]]). For places, use [[announcementLocation]] and [[spatialCoverage]]. Consumers of this markup should be aware that the initial design encouraged the use of /about for locations too. + +The basic content of [[SpecialAnnouncement]] is similar to that of an [RSS](https://en.wikipedia.org/wiki/RSS) or [Atom](https://en.wikipedia.org/wiki/Atom_(Web_standard)) feed. For publishers without such feeds, basic feed-like information can be shared by posting +[[SpecialAnnouncement]] updates in a page, e.g. using JSON-LD. For sites with Atom/RSS functionality, you can point to a feed +with the [[webFeed]] property. This can be a simple URL, or an inline [[DataFeed]] object, with [[encodingFormat]] providing +media type information e.g. "application/rss+xml" or "application/atom+xml". + + + + The geographic coordinates of a place or event. + GeoCoordinates + + + + Size related properties of a product, typically a size code ([[name]]) and optionally a [[sizeSystem]], [[sizeGroup]], and product measurements ([[hasMeasurement]]). In addition, the intended audience can be defined through [[suggestedAge]], [[suggestedGender]], and suggested body measurements ([[suggestedMeasurement]]). + + + + SizeSpecification + + + A software application designed specifically to work well on a mobile device such as a telephone. + MobileApplication + + + + Structured values are used when the value of a property has a more complex structure than simply being a textual value or a reference to another thing. + StructuredValue + + + + EventStatusType is an enumeration type whose instances represent several states that an Event may be in. + + EventStatusType + + + + + Any physical manifestation of a person's medical condition discoverable by objective diagnostic tests or physical examination. + MedicalSign + + + A delivery service through which content is provided via broadcast over the air or online. + + BroadcastService + + + + + DrugStrength + A specific strength in which a medical drug is available in a specific country. + + + CreativeWorkSeason + + A media season e.g. tv, radio, video game etc. + + + LeaveAction + An agent leaves an event / group with participants/friends at a location.\n\nRelated actions:\n\n* [[JoinAction]]: The antonym of LeaveAction.\n* [[UnRegisterAction]]: Unlike UnRegisterAction, LeaveAction implies leaving a group/team of people rather than a service. + + + + CommunicateAction + + The act of conveying information to another person via a communication medium (instrument) such as speech, email, or telephone conversation. + + + + A monetary grant. + + MonetaryGrant + + + + + + MusicAlbumReleaseType + + The kind of release which this album is: single, EP or album. + + + + A listing that describes a job opening in a certain organization. + JobPosting + + + The act of giving money voluntarily to a beneficiary in recognition of services rendered. + + TipAction + + + + MedicalTherapy + + Any medical intervention designed to prevent, treat, and cure human diseases and medical conditions, including both curative and palliative therapies. Medical therapies are typically processes of care relying upon pharmacotherapy, behavioral therapy, supportive therapy (with fluid or nutrition for example), or detoxification (e.g. hemodialysis) aimed at improving or preventing a health condition. + + + A [[MediaReview]] is a more specialized form of Review dedicated to the evaluation of media content online, typically in the context of fact-checking and misinformation. + For more general reviews of media in the broader sense, use [[UserReview]], [[CriticReview]] or other [[Review]] types. This definition is + a work in progress. While the [[MediaManipulationRatingEnumeration]] list reflects significant community review amongst fact-checkers and others working + to combat misinformation, the specific structures for representing media objects, their versions and publication context, is still evolving. Similarly, best practices for the relationship between [[MediaReview]] and [[ClaimReview]] markup has not yet been finalized. + + + MediaReview + + + + + A single feed providing structured information about one or more entities or topics. + DataFeed + + + Properties that take Energy as values are of the form '&lt;Number&gt; &lt;Energy unit of measure&gt;'. + + Energy + + + + A US-style health insurance plan network. + + + HealthPlanNetwork + + + + BroadcastEvent + An over the air or online broadcast event. + + + + A landform or physical feature. Landform elements include mountains, plains, lakes, rivers, seascape and oceanic waterbody interface features such as bays, peninsulas, seas and so forth, including sub-aqueous terrain features such as submersed mountain ranges, volcanoes, and the great ocean basins. + Landform + + + + + ComicIssue + Individual comic issues are serially published as + part of a larger series. For the sake of consistency, even one-shot issues + belong to a series comprised of a single issue. All comic issues can be + uniquely identified by: the combination of the name and volume number of the + series to which the issue belongs; the issue number; and the variant + description of the issue (if any). + + + A medical procedure intended primarily for therapeutic purposes, aimed at improving a health condition. + TherapeuticProcedure + + + + + + + Vessel + A component of the human body circulatory system comprised of an intricate network of hollow tubes that transport blood throughout the entire body. + + + + translationOfWork + + + A work that is a translation of the content of this work. e.g. 西遊記 has an English workTranslation “Journey to the West”,a German workTranslation “Monkeys Pilgerfahrt” and a Vietnamese translation Tây du ký bình khảo. + workTranslation + + + + + + + The work that this work has been translated from. e.g. 物种起源 is a translationOf “On the Origin of Species” + + + + + + + + Hospital + A hospital. + + + + PlaceOfWorship + + Place of worship, such as a church, synagogue, or mosque. + + + An order is a confirmation of a transaction (a receipt), which can contain multiple line items, each represented by an Offer that has been accepted by the customer. + + Order + + + ConsumeAction + The act of ingesting information/resources/food. + + + + + AudioObject + + An audio file. + + + MeasurementTypeEnumeration + Enumeration of common measurement types (or dimensions), for example "chest" for a person, "inseam" for pants, "gauge" for screws, or "wheel" for bicycles. + + + + + + Season dedicated to TV broadcast and associated online delivery. + TVSeason + + + + + PaymentStatusType + + A specific payment status. For example, PaymentDue, PaymentComplete, etc. + + + A subclass of Role used to describe roles within organizations. + OrganizationRole + + + + + + + Codes for use with the [[mediaAuthenticityCategory]] property, indicating the authenticity of a media object (in the context of how it was published or shared). In general these codes are not mutually exclusive, although some combinations (such as 'original' versus 'transformed', 'edited' and 'staged') would be contradictory if applied in the same [[MediaReview]]. Note that the application of these codes is with regard to a piece of media shared or published in a particular context. + MediaManipulationRatingEnumeration + + + + + Identifies that this [[Trip]] is a subTrip of another Trip. For example Day 1, Day 2, etc. of a multi-day trip. + + partOfTrip + + + + + + + + + + Identifies a [[Trip]] that is a subTrip of this Trip. For example Day 1, Day 2, etc. of a multi-day trip. + subTrip + + + + + + + An anatomical system is a group of anatomical structures that work together to perform a certain task. Anatomical systems, such as organ systems, are one organizing principle of anatomy, and can includes circulatory, digestive, endocrine, integumentary, immune, lymphatic, muscular, nervous, reproductive, respiratory, skeletal, urinary, vestibular, and other systems. + AnatomicalSystem + + + + + PriceTypeEnumeration + + Enumerates different price types, for example list price, invoice price, and sale price. + + + + + + WebContent + WebContent is a type representing all [[WebPage]], [[WebSite]] and [[WebPageElement]] content. It is sometimes the case that detailed distinctions between Web pages, sites and their parts is not always important or obvious. The [[WebContent]] type makes it easier to describe Web-addressable content without requiring such distinctions to always be stated. (The intent is that the existing types [[WebPage]], [[WebSite]] and [[WebPageElement]] will eventually be declared as subtypes of [[WebContent]]). + + + + + A construction business.\n\nA HomeAndConstructionBusiness is a [[LocalBusiness]] that provides services around homes and buildings.\n\nAs a [[LocalBusiness]] it can be described as a [[provider]] of one or more [[Service]]\(s). + HomeAndConstructionBusiness + + + Answer + An answer offered to a question; perhaps correct, perhaps opinionated or wrong. + + + + + + A musical group, such as a band, an orchestra, or a choir. Can also be a solo musician. + MusicGroup + + + ShippingDeliveryTime + ShippingDeliveryTime provides various pieces of information about delivery times for shipping. + + + + + + + Vehicle + A vehicle is a device that is designed or used to transport people or cargo over land, water, air, or through space. + + + A medical test performed by a laboratory that typically involves examination of a tissue sample by a pathologist. + PathologyTest + + + + + + MediaObject + A media object, such as an image, video, or audio object embedded in a web page or a downloadable dataset i.e. DataDownload. Note that a creative work may have many media objects associated with it on the same web page. For example, a page about a single song (MusicRecording) may have a music video (VideoObject), and a high and low bandwidth audio stream (2 AudioObject's). + + + dataset + + A dataset contained in this catalog. + + + + + + Distance + Properties that take Distances as values are of the form '&lt;Number&gt; &lt;Length unit of measure&gt;'. E.g., '7 ft'. + + + CompoundPriceSpecification + + A compound price specification is one that bundles multiple prices that all apply in combination for different dimensions of consumption. Use the name property of the attached unit price specification for indicating the dimension of a price component (e.g. "electricity" or "final cleaning"). + + + + MusicAlbumProductionType + Classification of the album by it's type of content: soundtrack, live album, studio album, etc. + + + + + Number + + Data type: Number.\n\nUsage guidelines:\n\n* Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols.\n* Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. + + + + SizeGroupEnumeration + Enumerates common size groups for various product categories. + + + + + AggregateOffer + When a single product is associated with multiple offers (for example, the same pair of shoes is offered by different merchants), then AggregateOffer can be used.\n\nNote: AggregateOffers are normally expected to associate multiple offers that all share the same defined [[businessFunction]] value, or default to http://purl.org/goodrelations/v1#Sell if businessFunction is not explicitly defined. + + + + A short TV or radio program or a segment/part of a program. + Clip + + + + + The act of responding instinctively and emotionally to an object, expressing a sentiment. + ReactAction + + + PeopleAudience + + A set of characteristics belonging to people, e.g. who compose an item's target audience. + + + + An organization that provides flights for passengers. + Airline + + + + + SpeakableSpecification + A SpeakableSpecification indicates (typically via [[xpath]] or [[cssSelector]]) sections of a document that are highlighted as particularly [[speakable]]. Instances of this type are expected to be used primarily as values of the [[speakable]] property. + + + + MediaSubscription + + A subscription which allows a user to access media including audio, video, books, etc. + + + + Specialty + Any branch of a field in which people typically develop specific expertise, usually after significant study, time, and effort. + + + A thesis or dissertation document submitted in support of candidature for an academic degree or professional qualification. + + + + Thesis + + + + + A seasonal override of a return policy, for example used for holidays. + + MerchantReturnPolicySeasonalOverride + + + CDCPMDRecord + + + + A CDCPMDRecord is a data structure representing a record in a CDC tabular data format + used for hospital data reporting. See [documentation](/docs/cdc-covid.html) for details, and the linked CDC materials for authoritative + definitions used as the source here. + + + + A type of physical examination of a patient performed by a physician. + PhysicalExam + + + + + + CreativeWork + The most generic kind of creative work, including books, movies, photographs, software programs, etc. + + + + + NewsMediaOrganization + + A News/Media organization such as a newspaper or TV station. + + + + + + [[HealthTopicContent]] is [[WebContent]] that is about some aspect of a health topic, e.g. a condition, its symptoms or treatments. Such content may be comprised of several parts or sections and use different types of media. Multiple instances of [[WebContent]] (and hence [[HealthTopicContent]]) can be related using [[hasPart]] / [[isPartOf]] where there is some kind of content hierarchy, and their content described with [[about]] and [[mentions]] e.g. building upon the existing [[MedicalCondition]] vocabulary. + + + + HealthTopicContent + + + + MedicalEntity + + The most generic type of entity related to health and the practice of medicine. + + + + Any condition of the human body that affects the normal functioning of a person, whether physically or mentally. Includes diseases, injuries, disabilities, disorders, syndromes, etc. + MedicalCondition + + + + + A predefined value for a product characteristic, e.g. the power cord plug type 'US' or the garment sizes 'S', 'M', 'L', and 'XL'. + QualitativeValue + + + + + + + CreativeWorkSeries + A CreativeWorkSeries in schema.org is a group of related items, typically but not necessarily of the same kind. CreativeWorkSeries are usually organized into some order, often chronological. Unlike [[ItemList]] which is a general purpose data structure for lists of things, the emphasis with CreativeWorkSeries is on published materials (written e.g. books and periodicals, or media such as tv, radio and games).\n\nSpecific subtypes are available for describing [[TVSeries]], [[RadioSeries]], [[MovieSeries]], [[BookSeries]], [[Periodical]] and [[VideoGameSeries]]. In each case, the [[hasPart]] / [[isPartOf]] properties can be used to relate the CreativeWorkSeries to its parts. The general CreativeWorkSeries type serves largely just to organize these more specific and practical subtypes.\n\nIt is common for properties applicable to an item from the series to be usefully applied to the containing group. Schema.org attempts to anticipate some of these cases, but publishers should be free to apply properties of the series parts to the series as a whole wherever they seem appropriate. + + + + Artery + + A type of blood vessel that specifically carries blood away from the heart. + + + + + Intended audience for an item, i.e. the group for whom the item was created. + + Audience + + + + SocialMediaPosting + A post to a social media platform, including blog posts, tweets, Facebook posts, etc. + + + + + PodcastSeries + A podcast is an episodic series of digital audio or video files which a user can download and listen to. + + + + Gene + + + + A discrete unit of inheritance which affects one or more biological traits (Source: [https://en.wikipedia.org/wiki/Gene](https://en.wikipedia.org/wiki/Gene)). Examples include FOXP2 (Forkhead box protein P2), SCARNA21 (small Cajal body-specific RNA 21), A- (agouti genotype). + + + + PhysicalActivity + Any bodily activity that enhances or maintains physical fitness and overall health and wellness. Includes activity that is part of daily living and routine, structured exercise, and exercise prescribed as part of a medical treatment or recovery plan. + + + + + RsvpAction + The act of notifying an event organizer as to whether you expect to attend the event. + + + + Product + + Any offered product or service. For example: a pair of shoes; a concert ticket; the rental of a car; a haircut; or an episode of a TV show streamed online. + + + + One of the sections into which a book is divided. A chapter usually has a section number or a name. + Chapter + + + + FinancialProduct + + A product provided to consumers and businesses by financial institutions such as banks, insurance companies, brokerage firms, consumer finance companies, and investment companies which comprise the financial services industry. + + + + A medical trial is a type of medical study that uses scientific process used to compare the safety and efficacy of medical therapies or medical procedures. In general, medical trials are controlled and subjects are allocated at random to the different treatment and/or control groups. + + MedicalTrial + + + + + + BusinessEntityType + A business entity type is a conceptual entity representing the legal form, the size, the main line of business, the position in the value chain, or any combination thereof, of an organization or business person.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#Business\n* http://purl.org/goodrelations/v1#Enduser\n* http://purl.org/goodrelations/v1#PublicInstitution\n* http://purl.org/goodrelations/v1#Reseller + + + + + encodesBioChemEntity + + + + + isEncodedByBioChemEntity + + + + Another BioChemEntity encoding by this one. + + + + + Another BioChemEntity encoded by this one. + + + + + A bus stop. + BusStop + + + TransferAction + The act of transferring/moving (abstract or concrete) animate or inanimate objects from one place to another. + + + +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+ + Accommodation + +
+ + + 3DModel + A 3D model represents some kind of 3D content, which may have [[encoding]]s in one or more [[MediaObject]]s. Many 3D formats are available (e.g. see [Wikipedia](https://en.wikipedia.org/wiki/Category:3D_graphics_file_formats)); specific encoding formats can be represented using the [[encodingFormat]] property applied to the relevant [[MediaObject]]. For the +case of a single file published after Zip compression, the convention of appending '+zip' to the [[encodingFormat]] can be used. Geospatial, AR/VR, artistic/animation, gaming, engineering and scientific content can all be represented using [[3DModel]]. + + + + + The status of an Action. + + ActionStatusType + + + The act of producing a balanced opinion about the object for an audience. An agent reviews an object with participants resulting in a review. + ReviewAction + + + + + + Target audiences types for medical web pages. Enumerated type. + MedicalAudienceType + + + ReturnFeesEnumeration + + + Enumerates several kinds of policies for product return fees. + + + + + + Periodical + + A publication in any medium issued in successive parts bearing numerical or chronological designations and intended, such as a magazine, scholarly journal, or newspaper to continue indefinitely.\n\nSee also [blog post](http://blog.schema.org/2014/09/schemaorg-support-for-bibliographic_2.html). + + + + + + + + The subject matter of the content. + + + about + + + + + + A CreativeWork or Event about this Thing. + subjectOf + + + + + + BoatTrip + + A trip on a commercial ferry line. + + + + + An audiobook. + Audiobook + + + + + PlayAction + + The act of playing/exercising/training/performing for enjoyment, leisure, recreation, Competition or exercise.\n\nRelated actions:\n\n* [[ListenAction]]: Unlike ListenAction (which is under ConsumeAction), PlayAction refers to performing for an audience or at an event, rather than consuming music.\n* [[WatchAction]]: Unlike WatchAction (which is under ConsumeAction), PlayAction refers to showing/displaying for an audience or at an event, rather than consuming visual content. + + + + + + + + A legal document such as an act, decree, bill, etc. (enforceable or not) or a component of a legal act (like an article). + + Legislation + + + Indicates whether this game is multi-player, co-op or single-player. + GamePlayMode + + + + A code for a medical entity. + + MedicalCode + + + + + A DeliveryTimeSettings represents re-usable pieces of shipping information, relating to timing. It is designed for publication on an URL that may be referenced via the [[shippingSettingsLink]] property of a [[OfferShippingDetails]]. Several occurrences can be published, distinguished (and identified/referenced) by their different values for [[transitTimeLabel]]. + + + + DeliveryTimeSettings + + + A combination of date and time of day in the form [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] (see Chapter 5.4 of ISO 8601). + DateTime + + + + + Muscle + A muscle is an anatomical structure consisting of a contractile form of tissue that animals use to effect movement. + + + + + The act of giving money to a seller in exchange for goods or services rendered. An agent buys an object, product, or service from a seller for a price. Reciprocal of SellAction. + BuyAction + + + The frequency in MHz and the modulation used for a particular BroadcastService. + + + BroadcastFrequencySpecification + + + Report + A Report generated by governmental or non-governmental organization. + + + + The act of providing an object under an agreement that it will be returned at a later date. Reciprocal of BorrowAction.\n\nRelated actions:\n\n* [[BorrowAction]]: Reciprocal of LendAction. + + LendAction + + + TravelAction + + The act of traveling from an fromLocation to a destination by a specified mode of transport, optionally with participants. + + + recordingOf + + + + + + An audio recording of the work. + recordedAs + + + + The composition this track is a recording of. + + + + + + + A chemical or biologic substance, used as a medical therapy, that has a physiological effect on an organism. Here the term drug is used interchangeably with the term medicine although clinical knowledge make a clear difference between them. + Drug + + + + + Data type: URL. + URL + + + + BookFormatType + The publication format of the book. + + + + + A Series in schema.org is a group of related items, typically but not necessarily of the same kind. See also [[CreativeWorkSeries]], [[EventSeries]]. + Series + + + The act of giving money in return for temporary use, but not ownership, of an object such as a vehicle or property. For example, an agent rents a property from a landlord in exchange for a periodic payment. + RentAction + + + + Grant + + + + + A grant, typically financial or otherwise quantifiable, of resources. Typically a [[funder]] sponsors some [[MonetaryAmount]] to an [[Organization]] or [[Person]], + sometimes not necessarily via a dedicated or long-lived [[Project]], resulting in one or more outputs, or [[fundedItem]]s. For financial sponsorship, indicate the [[funder]] of a [[MonetaryGrant]]. For non-financial support, indicate [[sponsor]] of [[Grant]]s of resources (e.g. office space). + +Grants support activities directed towards some agreed collective goals, often but not always organized as [[Project]]s. Long-lived projects are sometimes sponsored by a variety of grants over time, but it is also common for a project to be associated with a single grant. + +The amount of a [[Grant]] is represented using [[amount]] as a [[MonetaryAmount]]. + + + + WarrantyScope + + A range of of services that will be provided to a customer free of charge in case of a defect or malfunction of a product.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#Labor-BringIn\n* http://purl.org/goodrelations/v1#PartsAndLabor-BringIn\n* http://purl.org/goodrelations/v1#PartsAndLabor-PickUp + + + + + + The act of returning to the origin that which was previously received (concrete objects) or taken (ownership). + ReturnAction + + + A car is a wheeled, self-powered motor vehicle used for transportation. + + Car + + + + The act of expressing a preference from a fixed/finite/structured set of choices/options. + + VoteAction + + + PaymentMethod + + A payment method is a standardized procedure for transferring the monetary amount for a purchase. Payment methods are characterized by the legal and technical structures used, and by the organization or group carrying out the transaction.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#ByBankTransferInAdvance\n* http://purl.org/goodrelations/v1#ByInvoice\n* http://purl.org/goodrelations/v1#Cash\n* http://purl.org/goodrelations/v1#CheckInAdvance\n* http://purl.org/goodrelations/v1#COD\n* http://purl.org/goodrelations/v1#DirectDebit\n* http://purl.org/goodrelations/v1#GoogleCheckout\n* http://purl.org/goodrelations/v1#PayPal\n* http://purl.org/goodrelations/v1#PaySwarm + + + + + A list of possible product availability options. + + ItemAvailability + + + A value indicating which roadwheels will receive torque. + + DriveWheelConfigurationValue + + + + WinAction + The act of achieving victory in a competitive activity. + + + + A BreadcrumbList is an ItemList consisting of a chain of linked Web pages, typically described using at least their URL and their name, and typically ending with the current page.\n\nThe [[position]] property is used to reconstruct the order of the items in a BreadcrumbList The convention is that a breadcrumb list has an [[itemListOrder]] of [[ItemListOrderAscending]] (lower values listed first), and that the first items in this list correspond to the "top" or beginning of the breadcrumb trail, e.g. with a site or section homepage. The specific values of 'position' are not assigned meaning for a BreadcrumbList, but they should be integers, e.g. beginning with '1' for the first item in the list. + + BreadcrumbList + + + + + EUEnergyEfficiencyEnumeration + Enumerates the EU energy efficiency classes A-G as well as A+, A++, and A+++ as defined in EU directive 2017/1369. + + + + + DoseSchedule + + + A specific dosing schedule for a drug or supplement. + + + The act of asking someone to attend an event. Reciprocal of RsvpAction. + + InviteAction + + + Class + + + A class, also often called a 'Type'; equivalent to rdfs:Class. + + + + HowToTool + A tool used (but not consumed) when performing instructions for how to achieve a result. + + + + Any object used in a medical capacity, such as to diagnose or treat a patient. + MedicalDevice + + + + + + + Enumerates several types of product return methods. + + + ReturnMethodEnumeration + + + A process of care involving exercise, changes to diet, fitness routines, and other lifestyle changes aimed at improving a health condition. + + + LifestyleModification + + + The act of physically/electronically taking delivery of an object that has been transferred from an origin to a destination. Reciprocal of SendAction.\n\nRelated actions:\n\n* [[SendAction]]: The reciprocal of ReceiveAction.\n* [[TakeAction]]: Unlike TakeAction, ReceiveAction does not imply that the ownership has been transfered (e.g. I can receive a package, but it does not mean the package is now mine). + ReceiveAction + + + + A US-style health insurance plan, including PPOs, EPOs, and HMOs. + + + HealthInsurancePlan + + + + OrganizeAction + The act of manipulating/administering/supervising/controlling one or more objects. + + + + + + Text representing a CSS selector. + CssSelectorType + + + + + + + MedicalAudience + Target audiences for medical web pages. + + + + A contact point&#x2014;for example, a Customer Complaints department. + ContactPoint + + + The geographic shape of a place. A GeoShape can be described using several properties whose values are based on latitude/longitude pairs. Either whitespace or commas can be used to separate latitude and longitude; whitespace should be used when writing a list of several such points. + GeoShape + + + + + A list of items of any sort&#x2014;for example, Top 10 Movies About Weathermen, or Top 100 Party Songs. Not to be confused with HTML lists, which are often used only for formatting. + + ItemList + + + + MusicReleaseFormatType + Format of this release (the type of recording media used, ie. compact disc, digital media, LP, etc.). + + + + Instances of the class [[Observation]] are used to specify observations about an entity (which may or may not be an instance of a [[StatisticalPopulation]]), at a particular time. The principal properties of an [[Observation]] are [[observedNode]], [[measuredProperty]], [[measuredValue]] (or [[median]], etc.) and [[observationDate]] ([[measuredProperty]] properties can, but need not always, be W3C RDF Data Cube "measure properties", as in the [lifeExpectancy example](https://www.w3.org/TR/vocab-data-cube/#dsd-example)). +See also [[StatisticalPopulation]], and the [data and datasets](/docs/data-and-datasets.html) overview for more details. + + + Observation + + + + + An list item, e.g. a step in a checklist or how-to description. + ListItem + + + + Integer + + Data type: Integer. + + + + A retail good store. + Store + + + The most generic type of item. + Thing + + + + Blog + A [blog](https://en.wikipedia.org/wiki/Blog), sometimes known as a "weblog". Note that the individual posts ([[BlogPosting]]s) in a [[Blog]] are often colloqually referred to by the same term. + + + UpdateAction + + The act of managing by changing/editing the state of the object. + + + + A word, name, acronym, phrase, etc. with a formal definition. Often used in the context of category or subject classification, glossaries or dictionaries, product or creative work types, etc. Use the name property for the term being defined, use termCode if the term has an alpha-numeric code allocated, use description to provide the definition of the term. + DefinedTerm + + + + + + An infectious disease is a clinically evident human disease resulting from the presence of pathogenic microbial agents, like pathogenic viruses, pathogenic bacteria, fungi, protozoa, multicellular parasites, and prions. To be considered an infectious disease, such pathogens are known to be able to cause this disease. + + InfectiousDisease + + + + + + + + + + hasBroadcastChannel + A broadcast channel of a broadcast service. + + + The BroadcastService offered on this channel. + + providesBroadcastService + + + A monetary value or range. This type can be used to describe an amount of money such as $50 USD, or a range as in describing a bank account being suitable for a balance between £1,000 and £1,000,000 GBP, or the value of a salary, etc. It is recommended to use [[PriceSpecification]] Types to describe the price of an Offer, Invoice, etc. + MonetaryAmount + + + + + + + MedicalTest + Any medical test, typically performed for diagnostic purposes. + + + HowToSupply + + A supply consumed when performing the instructions for how to achieve a result. + + + + Nutritional information about the recipe. + NutritionInformation + + + + Instructions that explain how to achieve a result by performing a sequence of steps. + HowTo + + + A placeholder for multiple similar products of the same kind. + + + SomeProducts + + + A medical organization (physical or not), such as hospital, institution or clinic. + + MedicalOrganization + + + subOrganization + + + A relationship between two organizations where the first includes the second, e.g., as a subsidiary. See also: the more specific 'department' property. + + + + The artwork on the outer surface of a CreativeWork. + + + CoverArt + + + + RepaymentSpecification + + + + A structured value representing repayment. + + + + MortgageLoan + + + A loan in which property or real estate is used as collateral. (A loan securitized against some real estate). + + + + Text representing an XPath (typically but not necessarily version 1.0). + + + XPathType + + + + + SearchAction + The act of searching for an object.\n\nRelated actions:\n\n* [[FindAction]]: SearchAction generally leads to a FindAction, but not necessarily. + + + The act of organizing tasks/objects/events by associating resources to it. + + AllocateAction + + + Ticket + Used to describe a ticket to an event, a flight, a bus ride, etc. + + + + + + The album this is a release of. + + + + A release of this album. + + albumRelease + + + + releaseOf + + + + RealEstateAgent + A real-estate agent. + + + + Web page type: Collection page. + CollectionPage + + + + A season that is part of the media series. + + + containsSeason + + + + + + TrainStation + + A train station. + + + + A specific object or file containing a Legislation. Note that the same Legislation can be published in multiple files. For example, a digitally signed PDF, a plain PDF and an HTML version. + + + LegislationObject + + + + + + VideoGame + A video game is an electronic game that involves human interaction with a user interface to generate visual feedback on a video device. + + + + + + AggregateRating + The average rating based on multiple ratings or reviews. + + + MedicalWebPage + A web page that provides medical information. + + + + + Demand + + + A demand entity represents the public, not necessarily binding, not necessarily exclusive, announcement by an organization or person to seek a certain type of goods or services. For describing demand using this type, the very same properties used for Offer apply. + + + Action + An action performed by a direct agent and indirect participants upon a direct object. Optionally happens at a location with the help of an inanimate instrument. The execution of the action may produce a result. Specific action sub-type documentation specifies the exact expectation of each argument/role.\n\nSee also [blog post](http://blog.schema.org/2014/04/announcing-schemaorg-actions.html) and [Actions overview document](https://schema.org/docs/actions.html). + + + + + The act of planning the execution of an event/task/action/reservation/plan to a future date. + + PlanAction + + + + A pointer to the organization or person making the offer. + + + A pointer to products or services offered by the organization or person. + makesOffer + + + + + + + + + offeredBy + + + + + + A particular physical business or branch of an organization. Examples of LocalBusiness include a restaurant, a particular branch of a restaurant chain, a branch of a bank, a medical practice, a club, a bowling alley, etc. + LocalBusiness + + + + MedicalRiskEstimator + + Any rule set or interactive tool for estimating the risk of developing a complication or condition. + + + + OwnershipInfo + A structured value providing information about when a certain organization or person owned a certain product. + + + + + + + MediaReviewItem + Represents an item or group of closely related items treated as a unit for the sake of evaluation in a [[MediaReview]]. Authorship etc. apply to the items rather than to the curation/grouping or reviewing party. + + + + A bus (also omnibus or autobus) is a road vehicle designed to carry passengers. Coaches are luxury busses, usually in service for long distance travel. + + + BusOrCoach + + + + A reservation for a rental car.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. + + RentalCarReservation + + + Residence type: Apartment complex. + + ApartmentComplex + + + + A [[RealEstateListing]] is a listing that describes one or more real-estate [[Offer]]s (whose [[businessFunction]] is typically to lease out, or to sell). + The [[RealEstateListing]] type itself represents the overall listing, as manifested in some [[WebPage]]. + + RealEstateListing + + + + + + + + Indicates a range of postalcodes, usually defined as the set of valid codes between [[postalCodeBegin]] and [[postalCodeEnd]], inclusively. + PostalCodeRangeSpecification + + + Enumerates common size systems for different categories of products, for example "EN-13402" or "UK" for wearables or "Imperial" for screws. + + + + SizeSystemEnumeration + + + + An entity holding detailed information about the available bed types, e.g. the quantity of twin beds for a hotel room. For the single case of just one bed of a certain type, you can use bed directly with a text. See also [[BedType]] (under development). + + BedDetails + + + InvestmentOrDeposit + A type of financial product that typically requires the client to transfer funds to a financial service in return for potential beneficial financial return. + + + + + + + For a given health insurance plan, the specification for costs and coverage of prescription drugs. + + HealthPlanFormulary + + + Duration + + Quantity: Duration (use [ISO 8601 duration format](http://en.wikipedia.org/wiki/ISO_8601)). + + + + VideoObject + A video file. + + + + The causative agent(s) that are responsible for the pathophysiologic process that eventually results in a medical condition, symptom or sign. In this schema, unless otherwise specified this is meant to be the proximate cause of the medical condition, symptom or sign. The proximate cause is defined as the causative agent that most directly results in the medical condition, symptom or sign. For example, the HIV virus could be considered a cause of AIDS. Or in a diagnostic context, if a patient fell and sustained a hip fracture and two days later sustained a pulmonary embolism which eventuated in a cardiac arrest, the cause of the cardiac arrest (the proximate cause) would be the pulmonary embolism and not the fall. Medical causes can include cardiovascular, chemical, dermatologic, endocrine, environmental, gastroenterologic, genetic, hematologic, gynecologic, iatrogenic, infectious, musculoskeletal, neurologic, nutritional, obstetric, oncologic, otolaryngologic, pharmacologic, psychiatric, pulmonary, renal, rheumatologic, toxic, traumatic, or urologic causes; medical conditions can be causes as well. + + MedicalCause + + + + + + A body of structured information describing some topic(s) of interest. + + + Dataset + + + + The act of taking money from a buyer in exchange for goods or services rendered. An agent sells an object, product, or service to a buyer for a price. Reciprocal of BuyAction. + + SellAction + + + Movie + A movie. + + + + A schedule defines a repeating time period used to describe a regularly occurring [[Event]]. At a minimum a schedule will specify [[repeatFrequency]] which describes the interval between occurences of the event. Additional information can be provided to specify the schedule more precisely. + This includes identifying the day(s) of the week or month when the recurring event will take place, in addition to its start and end time. Schedules may also + have start and end dates to indicate when they are active, e.g. to define a limited calendar of events. + Schedule + + + + + + + + A MusicRelease is a specific release of a music album. + MusicRelease + + + + An OfferCatalog is an ItemList that contains related Offers and/or further OfferCatalogs that are offeredBy the same provider. + OfferCatalog + + + Episode + A media episode (e.g. TV, radio, video game) which can be part of a series or season. + + + + + A DatedMoneySpecification represents monetary values with optional start and end dates. For example, this could represent an employee's salary over a specific period of time. __Note:__ This type has been superseded by [[MonetaryAmount]] use of that type is recommended + + DatedMoneySpecification + + + MedicalClinic + + + A facility, often associated with a hospital or medical school, that is devoted to the specific diagnosis and/or healthcare. Previously limited to outpatients but with evolution it may be open to inpatients as well. + + + + superEvent + An event that this event is a part of. For example, a collection of individual music performances might each have a music festival as their superEvent. + + + + + + NewsArticle + + + A NewsArticle is an article whose content reports news, or provides background context and supporting materials for understanding the news. + +A more detailed overview of [schema.org News markup](/docs/news.html) is also available. + + + + + QuantitativeValue + + A point value or interval for product characteristics and other purposes. + + + + + + + + + gameServer + The server on which it is possible to play the game. + + + + Video game which is played on this server. + game + + + + + EmployeeRole + A subclass of OrganizationRole used to describe employee relationships. + + + Enumerates common size systems specific for wearable products + WearableSizeSystemEnumeration + + + + + + DigitalDocument + + An electronic file or document. + + + A type of boarding policy used by an airline. + + BoardingPolicyType + + + Data type: Text. + Text + + + + Information about the engine of the vehicle. A vehicle can have multiple engines represented by multiple engine specification entities. + EngineSpecification + + + + + + InteractionCounter + A summary of how users have interacted with this CreativeWork. In most cases, authors will use a subtype to specify the specific type of interaction. + + + An enumeration of genders. + + GenderType + + + Indicates a BioChemEntity that (in some sense) has this BioChemEntity as a part. + + + + + + Indicates a BioChemEntity that is (in some sense) a part of this BioChemEntity. + isPartOfBioChemEntity + + + + + + + hasBioChemEntityPart + + + + + + A statistical distribution of monetary amounts. + + MonetaryAmountDistribution + + + + + Substance + Any matter of defined composition that has discrete existence, whose origin may be biological, mineral or chemical. + + + + + TradeAction + The act of participating in an exchange of goods and services for monetary compensation. An agent trades an object, product or service with a participant in exchange for a one time or periodic payment. + + + + An order item is a line of an order. It includes the quantity and shipping details of a bought offer. + OrderItem + + + LearningResource + + + + The LearningResource type can be used to indicate [[CreativeWork]]s (whether physical or digital) that have a particular and explicit orientation towards learning, education, skill acquisition, and other educational purposes. + +[[LearningResource]] is expected to be used as an addition to a primary type such as [[Book]], [[VideoObject]], [[Product]] etc. + +[[EducationEvent]] serves a similar purpose for event-like things (e.g. a [[Trip]]). A [[LearningResource]] may be created as a result of an [[EducationEvent]], for example by recording one. + + + MediaGallery + Web page type: Media gallery page. A mixed-media page that can contains media such as images, videos, and other multimedia. + + + + + A risk factor is anything that increases a person's likelihood of developing or contracting a disease, medical condition, or complication. + MedicalRiskFactor + + + + MedicalEnumeration + + + Enumerations related to health and the practice of medicine: A concept that is used to attribute a quality to another concept, as a qualifier, a collection of items or a listing of all of the elements of a set in medicine practice. + + + + Natural languages such as Spanish, Tamil, Hindi, English, etc. Formal language code tags expressed in [BCP 47](https://en.wikipedia.org/wiki/IETF_language_tag) can be used via the [[alternateName]] property. The Language type previously also covered programming languages such as Scheme and Lisp, which are now best represented using [[ComputerLanguage]]. + Language + + + + + WebAPI + An application programming interface accessible over Web/Internet technologies. + + + + + + HyperTocEntry + A HyperToEntry is an item within a [[HyperToc]], which represents a hypertext table of contents for complex media objects, such as [[VideoObject]], [[AudioObject]]. The media object itself is indicated using [[associatedMedia]]. Each section of interest within that content can be described with a [[HyperTocEntry]], with associated [[startOffset]] and [[endOffset]]. When several entries are all from the same file, [[associatedMedia]] is used on the overarching [[HyperTocEntry]]; if the content has been split into multiple files, they can be referenced using [[associatedMedia]] on each [[HyperTocEntry]]. + + + + Enumerates common types of measurement for wearables products. + + + + WearableMeasurementTypeEnumeration + + + The act of editing by adding an object to a collection. + + AddAction + + + Enumerates several kinds of product return refund types. + + RefundTypeEnumeration + + + + + ScreeningEvent + + A screening of a movie or other video. + + + + UKNonprofitType + UKNonprofitType: Non-profit organization type originating from the United Kingdom. + + + + + Airport + An airport. + + + + A sub-grouping of food or drink items in a menu. E.g. courses (such as 'Dinner', 'Breakfast', etc.), specific type of dishes (such as 'Meat', 'Vegan', 'Drinks', etc.), or some other classification made by the menu provider. + + MenuSection + + + MapCategoryType + An enumeration of several kinds of Map. + + + + A ShippingRateSettings represents re-usable pieces of shipping information. It is designed for publication on an URL that may be referenced via the [[shippingSettingsLink]] property of an [[OfferShippingDetails]]. Several occurrences can be published, distinguished and matched (i.e. identified/referenced) by their different values for [[shippingLabel]]. + ShippingRateSettings + + + + + + + InsertAction + The act of adding at a specific location in an ordered collection. + + + CategoryCodeSet + A set of Category Code values. + + + + + + + HealthAndBeautyBusiness + Health and beauty. + + + Review + A review of an item - for example, of a restaurant, movie, or store. + + + + Any collection of tests commonly ordered together. + + + MedicalTestPanel + + + + Computer programming source code. Example: Full (compile ready) solutions, code snippet samples, scripts, templates. + SoftwareSourceCode + + + + + LoanOrCredit + A financial product for the loaning of an amount of money, or line of credit, under agreed terms and charges. + + + An intangible item that describes an alignment between a learning resource and a node in an educational framework. + +Should not be used where the nature of the alignment can be described using a simple property, for example to express that a resource [[teaches]] or [[assesses]] a competency. + AlignmentObject + + + + + contentLocation + + The location depicted or described in the content. For example, the location in a photograph or painting. + + + + Quotation + + + A quotation. Often but not necessarily from some written work, attributable to a real world author and - if associated with a fictional character - to any fictional Person. Use [[isBasedOn]] to link to source/origin. The [[recordedIn]] property can be used to reference a Quotation from an [[Event]]. + + + + + + A patient is any person recipient of health care services. + + Patient + + + + Describes a reservation for travel, dining or an event. Some reservations require tickets. \n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, restaurant reservations, flights, or rental cars, use [[Offer]]. + + Reservation + + + + GovernmentOffice + A government office&#x2014;for example, an IRS or DMV office. + + + Any anatomical structure which pertains to the soft nervous tissue functioning as the coordinating center of sensation and intellectual and nervous activity. + + + BrainStructure + + + + A sub-grouping of steps in the instructions for how to achieve a result (e.g. steps for making a pie crust within a pie recipe). + + HowToSection + + + + + The basic containment relation between a place and another that it contains. + containsPlace + + + + + + DrugCostCategory + Enumerated categories of medical drug costs. + + + + + LodgingReservation + A reservation for lodging at a hotel, motel, inn, etc.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. + + + WearableSizeGroupEnumeration + Enumerates common size groups (also known as "size types") for wearable products. + + + + + + + A food-related business. + FoodEstablishment + + + An image file. + + ImageObject + + + + The act of producing/preparing food. + CookAction + + + + MaximumDoseSchedule + + The maximum dosing schedule considered safe for a drug or supplement as recommended by an authority or by the drug/supplement's manufacturer. Capture the recommending authority in the recognizingAuthority property of MedicalEntity. + + + + + Photograph + A photograph. + + + + + LegalValueLevel + A list of possible levels for the legal validity of a legislation. + + + + + + Menu + + A structured representation of food or drink items available from a FoodEstablishment. + + + + A single message from a sender to one or more organizations or people. + Message + + + NonprofitType + + + NonprofitType enumerates several kinds of official non-profit types of which a non-profit organization can be. + + + + + Guide + [[Guide]] is a page or article that recommend specific products or services, or aspects of a thing for a user to consider. A [[Guide]] may represent a Buying Guide and detail aspects of products or services for a user to consider. A [[Guide]] may represent a Product Guide and recommend specific products or services. A [[Guide]] may represent a Ranked List and recommend specific products or services with ranking. + + + + + + CreativeWorkSeries dedicated to TV broadcast and associated online delivery. + + TVSeries + + + + CriticReview + + + A [[CriticReview]] is a more specialized form of Review written or published by a source that is recognized for its reviewing activities. These can include online columns, travel and food guides, TV and radio shows, blogs and other independent Web sites. [[CriticReview]]s are typically more in-depth and professionally written. For simpler, casually written user/visitor/viewer/customer reviews, it is more appropriate to use the [[UserReview]] type. Review aggregator sites such as Metacritic already separate out the site's user reviews from selected critic reviews that originate from third-party sources. + + + ReturnLabelSourceEnumeration + + Enumerates several types of return labels for product returns. + + + + + LegalForceStatus + + + + + A list of possible statuses for the legal force of a legislation. + + + + + ExerciseAction + The act of participating in exertive activity for the purposes of improving health and fitness. + + + + A web page element, like a table or an image. + WebPageElement + + + CarUsageType + + A value indicating a special usage of a car, e.g. commercial rental, driving school, or as a taxi. + + + + + The act of editing a recipient by replacing an old object with a new object. + ReplaceAction + + + + A specific question - e.g. from a user seeking answers online, or collected in a Frequently Asked Questions (FAQ) document. + + + Question + + + Occupation + + + A profession, may involve prolonged training and/or a formal qualification. + + + + The act of being defeated in a competitive activity. + LoseAction + + + + http://en.wikipedia.org/wiki/Room). +

+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+ + Room +
+ + Protein is here used in its widest possible definition, as classes of amino acid based molecules. Amyloid-beta Protein in human (UniProt P05067), eukaryota (e.g. an OrthoDB group) or even a single molecule that one can point to are all of type schema:Protein. A protein can thus be a subclass of another protein, e.g. schema:Protein as a UniProt record can have multiple isoforms inside it which would also be schema:Protein. They can be imagined, synthetic, hypothetical or naturally occurring. + + Protein + + + + + DeliveryEvent + An event involving the delivery of an item. + + + + EnergyStarEnergyEfficiencyEnumeration + Used to indicate whether a product is EnergyStar certified. + + + + + + + MedicalProcedure + + A process of care used in either a diagnostic, therapeutic, preventive or palliative capacity that relies on invasive (surgical), non-invasive, or other techniques. + + + + BoatTerminal + + + A terminal for boats, ships, and other water vessels. + + + + A unique instance of a radio BroadcastService on a CableOrSatelliteService lineup. + + RadioChannel + + + FoodEstablishmentReservation + + A reservation to dine at a food-related business.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. + + + QuantitativeValueDistribution + + A statistical distribution of values. + + + + TouristAttraction + + + + A tourist attraction. In principle any Thing can be a [[TouristAttraction]], from a [[Mountain]] and [[LandmarksOrHistoricalBuildings]] to a [[LocalBusiness]]. This Type can be used on its own to describe a general [[TouristAttraction]], or be used as an [[additionalType]] to add tourist attraction properties to any other type. (See examples below) + + + + + + Person + A person (alive, dead, undead, or fictional). + + + The CreativeWork encoded by this media object. + + + + encodesCreativeWork + + + OfferItemCondition + + A list of possible conditions for the item. + + + + EntertainmentBusiness + A business providing entertainment. + + + +
+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+ HotelRoom + +
+ + Any feature associated or not with a medical condition. In medicine a symptom is generally subjective while a sign is objective. + + + MedicalSignOrSymptom + + + A ProductGroup represents a group of [[Product]]s that vary only in certain well-described ways, such as by [[size]], [[color]], [[material]] etc. + +While a ProductGroup itself is not directly offered for sale, the various varying products that it represents can be. The ProductGroup serves as a prototype or template, standing in for all of the products who have an [[isVariantOf]] relationship to it. As such, properties (including additional types) can be applied to the ProductGroup to represent characteristics shared by each of the (possibly very many) variants. Properties that reference a ProductGroup are not included in this mechanism; neither are the following specific properties [[variesBy]], [[hasVariant]], [[url]]. + ProductGroup + + + + + + RsvpResponseType + RsvpResponseType is an enumeration type whose instances represent responding to an RSVP request. + + + + Property + + A property, used to indicate attributes and relationships of some Thing; equivalent to rdf:Property. + + + + + A structured value representing the duration and scope of services that will be provided to a customer free of charge in case of a defect or malfunction of a product. + WarrantyPromise + + + + + A set of characteristics belonging to businesses, e.g. who compose an item's target audience. + + BusinessAudience + + + + SuperficialAnatomy + + Anatomical features that can be observed by sight (without dissection), including the form and proportions of the human body as well as surface landmarks that correspond to deeper subcutaneous structures. Superficial anatomy plays an important role in sports medicine, phlebotomy, and other medical specialties as underlying anatomical structures can be identified through surface palpation. For example, during back surgery, superficial anatomy can be used to palpate and count vertebrae to find the site of incision. Or in phlebotomy, superficial anatomy can be used to locate an underlying vein; for example, the median cubital vein can be located by palpating the borders of the cubital fossa (such as the epicondyles of the humerus) and then looking for the superficial signs of the vein, such as size, prominence, ability to refill after depression, and feel of surrounding tissue support. As another example, in a subluxation (dislocation) of the glenohumeral joint, the bony structure becomes pronounced with the deltoid muscle failing to cover the glenohumeral joint allowing the edges of the scapula to be superficially visible. Here, the superficial anatomy is the visible edges of the scapula, implying the underlying dislocation of the joint (the related anatomical structure). + + + + DataDownload + + + A dataset in downloadable form. + + + A fact-checking review of claims made (or reported) in some creative work (referenced via itemReviewed). + + + ClaimReview + + + AuthorizeAction + + The act of granting permission to an object. + + + + A bus station. + BusStation + + + ReplyAction + The act of responding to a question/message asked/sent by the object. Related to [[AskAction]]\n\nRelated actions:\n\n* [[AskAction]]: Appears generally as an origin of a ReplyAction. + + + + This is the [[Action]] of navigating to a specific [[startOffset]] timestamp within a [[VideoObject]], typically represented with a URL template structure. + + + + SeekToAction + + + + An airline flight. + Flight + + + A value indicating a steering position. + + SteeringPositionValue + + + + + LodgingBusiness + A lodging business, such as a motel, hotel, or inn. + + + + A service provided by a government organization, e.g. food stamps, veterans benefits, etc. + GovernmentService + + + A unique instance of a BroadcastService on a CableOrSatelliteService lineup. + BroadcastChannel + + + + HealthAspectEnumeration enumerates several aspects of health content online, each of which might be described using [[hasHealthAspect]] and [[HealthTopicContent]]. + + + + HealthAspectEnumeration + + + This type covers computer programming languages such as Scheme and Lisp, as well as other language-like computer representations. Natural languages are best represented with the [[Language]] type. + + ComputerLanguage + + + A FloorPlan is an explicit representation of a collection of similar accommodations, allowing the provision of common information (room counts, sizes, layout diagrams) and offers for rental or sale. In typical use, some [[ApartmentComplex]] has an [[accommodationFloorPlan]] which is a [[FloorPlan]]. A FloorPlan is always in the context of a particular place, either a larger [[ApartmentComplex]] or a single [[Apartment]]. The visual/spatial aspects of a floor plan (i.e. room layout, [see wikipedia](https://en.wikipedia.org/wiki/Floor_plan)) can be indicated using [[image]]. + + + FloorPlan + + + + + Residence + The place where a person lives. + + + A set of organisms asserted to represent a natural cohesive biological unit. + + + + Taxon + + + + BusinessFunction + + The business function specifies the type of activity or access (i.e., the bundle of rights) offered by the organization or business person through the offer. Typical are sell, rental or lease, maintenance or repair, manufacture / produce, recycle / dispose, engineering / construction, or installation. Proprietary specifications of access rights are also instances of this class.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#ConstructionInstallation\n* http://purl.org/goodrelations/v1#Dispose\n* http://purl.org/goodrelations/v1#LeaseOut\n* http://purl.org/goodrelations/v1#Maintain\n* http://purl.org/goodrelations/v1#ProvideService\n* http://purl.org/goodrelations/v1#Repair\n* http://purl.org/goodrelations/v1#Sell\n* http://purl.org/goodrelations/v1#Buy + + + + A collection of music tracks in playlist form. + MusicPlaylist + + + + + Indicates employment-related experience requirements, e.g. [[monthsOfExperience]]. + + OccupationalExperienceRequirements + + + + + WriteAction + The act of authoring written creative content. + + + + + A Category Code. + CategoryCode + + + + + EmergencyService + An emergency service, such as a fire station or ER. + + + + The act of deliberately creating/producing/generating/building a result out of the agent. + CreateAction + + + Service + + A service provided by an organization, e.g. delivery service, print services, etc. + + + + The legal availability status of a medical drug. + DrugLegalStatus + + + + An intangible type to be applied to any archive content, carrying with it a set of properties required to describe archival items and collections. + ArchiveComponent + + + + + + + Enumerates several kinds of product return policies. + + MerchantReturnEnumeration + + + + + Event type: Sports event. + SportsEvent + + + AdministrativeArea + + A geographical region, typically under the jurisdiction of a particular government. + + + LiveBlogPosting + + A [[LiveBlogPosting]] is a [[BlogPosting]] intended to provide a rolling textual coverage of an ongoing event through continuous updates. + + + PaymentChargeSpecification + The costs of settling the payment using a particular payment method. + + + + + + + A part of a successively published publication such as a periodical or multi-volume work, often numbered. It may represent a time span, such as a year.\n\nSee also [blog post](http://blog.schema.org/2014/09/schemaorg-support-for-bibliographic_2.html). + PublicationVolume + + + An agent orders an object/product/service to be delivered/sent. + + OrderAction + + + + + + + + + + Collection, [fonds](https://en.wikipedia.org/wiki/Fonds), or item held, kept or maintained by an [[ArchiveOrganization]]. + archiveHeld + + + + [[ArchiveOrganization]] that holds, keeps or maintains the [[ArchiveComponent]]. + holdingArchive + + + + + + + The act of notifying someone of information pertinent to them, with no expectation of a response. + InformAction + + + A type of bed. This is used for indicating the bed or beds available in an accommodation. + + + + BedType + + + + A product or service offered by a bank whereby one may deposit, withdraw or transfer money and in some cases be paid interest. + BankAccount + + + + Organization: Sports team. + + SportsTeam + + + + (Eventually to be defined as) a supertype of GeoShape designed to accommodate definitions from Geo-Spatial best practices. + + GeospatialGeometry + + + + Reference documentation for application programming interfaces (APIs). + APIReference + + + + Time + A point in time recurring on multiple days in the form hh:mm:ss[Z|(+|-)hh:mm] (see [XML schema for details](http://www.w3.org/TR/xmlschema-2/#time)). + + + + TechArticle + + A technical article - Example: How-to (task) topics, step-by-step, procedural troubleshooting, specifications, etc. + + + + EndorseAction + An agent approves/certifies/likes/supports/sanction an object. + + + + + Resort + http://en.wikipedia.org/wiki/Resort). +

+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. + ]]>
+
+ + + SolveMathAction + + + The action that takes in a math expression and directs users to a page potentially capable of solving/simplifying that expression. + + + An educational organization. + EducationalOrganization + + + + + BorrowAction + + The act of obtaining an object under an agreement to return it at a later date. Reciprocal of LendAction.\n\nRelated actions:\n\n* [[LendAction]]: Reciprocal of BorrowAction. + + + + MedicalStudyStatus + + The status of a medical study. Enumerated type. + + + OpeningHoursSpecification + + A structured value providing information about the opening hours of a place or a certain service inside a place.\n\n +The place is __open__ if the [[opens]] property is specified, and __closed__ otherwise.\n\nIf the value for the [[closes]] property is less than the value for the [[opens]] property then the hour range is assumed to span over the next day. + + + + + + A map. + Map + + + The term "story" is any indivisible, re-printable + unit of a comic, including the interior stories, covers, and backmatter. Most + comics have at least two stories: a cover (ComicCoverArt) and an interior story. + + + ComicStory + + + + + StatusEnumeration + Lists or enumerations dealing with status types. + + + Place + + Entities that have a somewhat fixed, physical extension. + + + The act of participating in performance arts. + PerformAction + + + + The act of forming one's opinion, reaction or sentiment. + + AssessAction + + + + + Any constitutionally or isotopically distinct atom, molecule, ion, ion pair, radical, radical ion, complex, conformer etc., identifiable as a separately distinguishable entity. + MolecularEntity + + + + + + Corporation + Organization: A business corporation. + + + A work of art that is primarily visual in character. + + + VisualArtwork + + + An educational or occupational credential. A diploma, academic degree, certification, qualification, badge, etc., that may be awarded to a person or other entity that meets the requirements defined by the credentialer. + + + EducationalOccupationalCredential + + + + + + A utility class that serves as the umbrella for a number of 'intangible' things in the medical space. + MedicalIntangible + + + + Design models for medical trials. Enumerated type. + + MedicalTrialDesign + + + + + A collection of datasets. + + + DataCatalog + + + ScholarlyArticle + + A scholarly article. + + + Fitness-related activity designed for a specific health-related purpose, including defined exercise routines as well as activity prescribed by a clinician. + + ExercisePlan + + + + + Enumerated status values for Reservation. + + ReservationStatusType + + + + PerformingGroup + A performance group, such as a band, an orchestra, or a circus. + + + + + MedicalScholarlyArticle + A scholarly article in the medical domain. + + + A body of water, such as a sea, ocean, or lake. + + BodyOfWater + + + An agent controls a device or application. + ControlAction + + + + + ProductCollection + A set of products (either [[ProductGroup]]s or specific variants) that are listed together e.g. in an [[Offer]]. + + + + + + + An article, such as a news article or piece of investigative report. Newspapers and magazines have articles of many different types and this is intended to cover them all.\n\nSee also [blog post](http://blog.schema.org/2014/09/schemaorg-support-for-bibliographic_2.html). + Article + + + + ImagingTest + Any medical imaging modality typically used for diagnostic purposes. + + + + + + + Joint + The anatomical location at which two or more bones make contact. + + + BusTrip + + A trip on a commercial bus line. + + + + DietarySupplement + + A product taken by mouth that contains a dietary ingredient intended to supplement the diet. Dietary ingredients may include vitamins, minerals, herbs or other botanicals, amino acids, and substances such as enzymes, organ tissues, glandulars and metabolites. + + + HowToItem + An item used as either a tool or supply when performing the instructions for how to to achieve a result. + + + + + + OfferShippingDetails represents information about shipping destinations. + +Multiple of these entities can be used to represent different shipping rates for different destinations: + +One entity for Alaska/Hawaii. A different one for continental US.A different one for all France. + +Multiple of these entities can be used to represent different shipping costs and delivery times. + +Two entities that are identical but differ in rate and time: + +e.g. Cheaper and slower: $5 in 5-7days +or Fast and expensive: $15 in 1-2 days. + + OfferShippingDetails + + + + + + A chemical substance is 'a portion of matter of constant composition, composed of molecular entities of the same type or of different types' (source: [ChEBI:59999](https://www.ebi.ac.uk/chebi/searchId.do?chebiId=59999)). + ChemicalSubstance + + + + The basic data types such as Integers, Strings, etc. + DataType + + + + A government building. + GovernmentBuilding + + + + A reservation for air travel.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + + FlightReservation + + + + A comment on an item - for example, a comment on a blog post. The comment's content is expressed via the [[text]] property, and its topic via [[about]], properties shared with all CreativeWorks. + Comment + + + + Brand + + A brand is a name used by an organization or business person for labeling a product, product group, or similar. + + + + + Collection + A collection of items e.g. creative works or products. + + + A program with both an educational and employment component. Typically based at a workplace and structured around work-based learning, with the aim of instilling competencies related to an occupation. WorkBasedProgram is used to distinguish programs such as apprenticeships from school, college or other classroom based educational programs. + WorkBasedProgram + + + + + + Enumerated status values for Order. + OrderStatus + + + + + + A MerchantReturnPolicy provides information about product return policies associated with an [[Organization]], [[Product]], or [[Offer]]. + + MerchantReturnPolicy + + + + The act of physically/electronically dispatching an object for transfer from an origin to a destination.Related actions:\n\n* [[ReceiveAction]]: The reciprocal of SendAction.\n* [[GiveAction]]: Unlike GiveAction, SendAction does not imply the transfer of ownership (e.g. I can send you my laptop, but I'm not necessarily giving it to you). + SendAction + + + + AskAction + The act of posing a question / favor to someone.\n\nRelated actions:\n\n* [[ReplyAction]]: Appears generally as a response to AskAction. + + + + + + + alumni + + Alumni of an organization. + + + + + + An organization that the person is an alumni of. + alumniOf + + + + + A LegalService is a business that provides legally-oriented services, advice and representation, e.g. law firms.\n\nAs a [[LocalBusiness]] it can be described as a [[provider]] of one or more [[Service]]\(s). + LegalService + + + MedicalContraindication + A condition or factor that serves as a reason to withhold a certain medical therapy. Contraindications can be absolute (there are no reasonable circumstances for undertaking a course of action) or relative (the patient is at higher risk of complications, but that these risks may be outweighed by other considerations or mitigated by other measures). + + + + + WebApplication + + Web applications. + + + + MedicalEvidenceLevel + Level of evidence for a medical guideline. Enumerated type. + + + + A PublicationEvent corresponds indifferently to the event of publication for a CreativeWork of any type e.g. a broadcast event, an on-demand event, a book/journal publication via a variety of delivery media. + PublicationEvent + + + + PublicationIssue + + + + A part of a successively published publication such as a periodical or publication volume, often numbered, usually containing a grouping of works such as articles.\n\nSee also [blog post](http://blog.schema.org/2014/09/schemaorg-support-for-bibliographic_2.html). + + + HyperToc + A HyperToc represents a hypertext table of contents for complex media objects, such as [[VideoObject]], [[AudioObject]]. Items in the table of contents are indicated using the [[tocEntry]] property, and typed [[HyperTocEntry]]. For cases where the same larger work is split into multiple files, [[associatedMedia]] can be used on individual [[HyperTocEntry]] items. + + + + + + + + A delivery method is a standardized procedure for transferring the product or service to the destination of fulfillment chosen by the customer. Delivery methods are characterized by the means of transportation used, and by the organization or group that is the contracting party for the sending organization or person.\n\nCommonly used values:\n\n* http://purl.org/goodrelations/v1#DeliveryModeDirectDownload\n* http://purl.org/goodrelations/v1#DeliveryModeFreight\n* http://purl.org/goodrelations/v1#DeliveryModeMail\n* http://purl.org/goodrelations/v1#DeliveryModeOwnFleet\n* http://purl.org/goodrelations/v1#DeliveryModePickUp\n* http://purl.org/goodrelations/v1#DHL\n* http://purl.org/goodrelations/v1#FederalExpress\n* http://purl.org/goodrelations/v1#UPS + + DeliveryMethod + + + Design models for observational medical studies. Enumerated type. + + MedicalObservationalStudyDesign + + + + MedicalBusiness + + + A particular physical or virtual business of an organization for medical purposes. Examples of MedicalBusiness include differents business run by health professionals. + + + Claim + + + A [[Claim]] in Schema.org represents a specific, factually-oriented claim that could be the [[itemReviewed]] in a [[ClaimReview]]. The content of a claim can be summarized with the [[text]] property. Variations on well known claims can have their common identity indicated via [[sameAs]] links, and summarized with a [[name]]. Ideally, a [[Claim]] description includes enough contextual information to minimize the risk of ambiguity or inclarity. In practice, many claims are better understood in the context in which they appear or the interpretations provided by claim reviews. + + Beyond [[ClaimReview]], the Claim type can be associated with related creative works - for example a [[ScholarlyArticle]] or [[Question]] might be [[about]] some [[Claim]]. + + At this time, Schema.org does not define any types of relationship between claims. This is a natural area for future exploration. + + + + + PerformanceRole + A PerformanceRole is a Role that some entity places with regard to a theatrical performance, e.g. in a Movie, TVSeries etc. + + + + + A software application. + SoftwareApplication + + + PayAction + + An agent pays a price to a participant. + + + + HowToDirection + + A direction indicating a single action to do in the instructions for how to achieve a result. + + + + + DiagnosticLab + A medical laboratory that offers on-site or off-site diagnostic services. + + + A book. + + Book + + + + HowToStep + A step in the instructions for how to achieve a result. It is an ordered list with HowToDirection and/or HowToTip items. + + + + + GiveAction + The act of transferring ownership of an object to a destination. Reciprocal of TakeAction.\n\nRelated actions:\n\n* [[TakeAction]]: Reciprocal of GiveAction.\n* [[SendAction]]: Unlike SendAction, GiveAction implies that ownership is being transferred (e.g. I may send my laptop to you, but that doesn't mean I'm giving it to you). + + + + Invoice + + A statement of the money due for goods or services; a bill. + + + A country. + Country + + + + ItemListOrderType + Enumerated for values for itemListOrder for indicating how an ordered ItemList is organized. + + + + A doctor's office. + + Physician + + + + + A diet restricted to certain foods or preparations for cultural, religious, health or lifestyle reasons. + RestrictedDiet + + + Car repair, sales, or parts. + + AutomotiveBusiness + + + + HealthPlanCostSharingSpecification + + + A description of costs to the patient under a given network or formulary. + + + PronounceableText + Data type: PronounceableText. + + + + + + The act of an agent relocating to a place.\n\nRelated actions:\n\n* [[TransferAction]]: Unlike TransferAction, the subject of the move is a living Person or Organization rather than an inanimate object. + MoveAction + + + + + + MedicineSystem + Systems of medical practice. + + + A movie theater. + MovieTheater + + + + + + A payment method using a credit, debit, store or other card to associate the payment with an account. + PaymentCard + + + + + + CreativeWorkSeries dedicated to radio broadcast and associated online delivery. + RadioSeries + + + Categories of physical activity, organized by physiologic classification. + PhysicalActivityCategory + + + + + An entry point, within some Web-based protocol. + + + EntryPoint + + + + WebSite + A WebSite is a set of related web pages and other items typically served from a single web domain and accessible via URLs. + + + + A means for accessing a service, e.g. a government office location, web site, or phone number. + ServiceChannel + + + The act of expressing a preference from a set of options or a large or unbounded set of choices/options. + + ChooseAction + + + A sports location, such as a playing field. + SportsActivityLocation + + + + A type of blood vessel that specifically carries lymph fluid unidirectionally toward the heart. + LymphaticVessel + + + + + + + An offer to transfer some rights to an item or to provide a service — for example, an offer to sell tickets to an event, to rent the DVD of a movie, to stream a TV show over the internet, to repair a motorcycle, or to loan a book.\n\nNote: As the [[businessFunction]] property, which identifies the form of offer (e.g. sell, lease, repair, dispose), defaults to http://purl.org/goodrelations/v1#Sell; an Offer without a defined businessFunction value can be assumed to be an offer to sell.\n\nFor [GTIN](http://www.gs1.org/barcodes/technical/idkeys/gtin)-related fields, see [Check Digit calculator](http://www.gs1.org/barcodes/support/check_digit_calculator) and [validation guide](http://www.gs1us.org/resources/standards/gtin-validation-guide) from [GS1](http://www.gs1.org/). + Offer + + + A date value in [ISO 8601 date format](http://en.wikipedia.org/wiki/ISO_8601). + + Date + + + An agent tracks an object for updates.\n\nRelated actions:\n\n* [[FollowAction]]: Unlike FollowAction, TrackAction refers to the interest on the location of innanimates objects.\n* [[SubscribeAction]]: Unlike SubscribeAction, TrackAction refers to the interest on the location of innanimate objects. + + TrackAction + + + + Web page type: About page. + AboutPage + + + ArchiveOrganization + + An organization with archival holdings. An organization which keeps and preserves archival material and typically makes it accessible to the public. + + + + + + DigitalDocumentPermissionType + A type of permission which can be granted for accessing a digital document. + + + + + The act of transferring money from one place to another place. This may occur electronically or physically. + MoneyTransfer + + + + + CommentAction + The act of generating a comment about a subject. + + + + Classes of agents or pathogens that transmit infectious diseases. Enumerated type. + + + InfectiousAgentClass + + + Enumerates energy efficiency levels (also known as "classes" or "ratings") and certifications that are part of several international energy efficiency standards. + EnergyEfficiencyEnumeration + + + + + + + + StatisticalPopulation + A StatisticalPopulation is a set of instances of a certain given type that satisfy some set of constraints. The property [[populationType]] is used to specify the type. Any property that can be used on instances of that type can appear on the statistical population. For example, a [[StatisticalPopulation]] representing all [[Person]]s with a [[homeLocation]] of East Podunk California, would be described by applying the appropriate [[homeLocation]] and [[populationType]] properties to a [[StatisticalPopulation]] item that stands for that set of people. +The properties [[numConstraints]] and [[constrainingProperty]] are used to specify which of the populations properties are used to specify the population. Note that the sense of "population" used here is the general sense of a statistical +population, and does not imply that the population consists of people. For example, a [[populationType]] of [[Event]] or [[NewsArticle]] could be used. See also [[Observation]], and the [data and datasets](/docs/data-and-datasets.html) overview for more details. + + + + + + Rating + A rating is an evaluation on a numeric scale, such as 1 to 5 stars. + + + + TaxiService + A service for a vehicle for hire with a driver for local travel. Fares are usually calculated based on distance traveled. + + + + MedicalGuideline + + Any recommendation made by a standard society (e.g. ACC/AHA) or consensus statement that denotes how to diagnose and treat a particular condition. Note: this type should be used to tag the actual guideline recommendation; if the guideline recommendation occurs in a larger scholarly article, use MedicalScholarlyArticle to tag the overall article, not this type. Note also: the organization making the recommendation should be captured in the recognizingAuthority base property of MedicalEntity. + + + Financial services business. + + FinancialService + + + A single item within a larger data feed. + DataFeedItem + + + + + + A recommended dosing schedule for a drug or supplement as prescribed or recommended by an authority or by the drug/supplement's manufacturer. Capture the recommending authority in the recognizingAuthority property of MedicalEntity. + RecommendedDoseSchedule + + + + + EnergyConsumptionDetails represents information related to the energy efficiency of a product that consumes energy. The information that can be provided is based on international regulations such as for example [EU directive 2017/1369](https://eur-lex.europa.eu/eli/reg/2017/1369/oj) for energy labeling and the [Energy labeling rule](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/energy-water-use-labeling-consumer) under the Energy Policy and Conservation Act (EPCA) in the US. + EnergyConsumptionDetails + + + + + Indicates whether this drug is available by prescription or over-the-counter. + DrugPrescriptionStatus + + + + + FoodEvent + Event type: Food event. + + + + mainEntity + + + + + + + + mainEntityOfPage + + Indicates a page (or other CreativeWork) for which this thing is the main entity being described. See [background notes](/docs/datamodel.html#mainEntityBackground) for details. + + + Indicates the primary entity described in some page or other CreativeWork. + + + An enumeration that describes different types of medical procedures. + + + MedicalProcedureType + + + The Game type represents things which are games. These are typically rule-governed recreational activities, e.g. role-playing games in which players assume the role of characters in a fictional setting. + + Game + + + Any biological, chemical, or biochemical thing. For example: a protein; a gene; a chemical; a synthetic chemical. + + + BioChemEntity + + + + + Used to describe membership in a loyalty programs (e.g. "StarAliance"), traveler clubs (e.g. "AAA"), purchase clubs ("Safeway Club"), etc. + ProgramMembership + + + + EducationalAudience + + An EducationalAudience. + + + Properties that take Mass as values are of the form '&lt;Number&gt; &lt;Mass unit of measure&gt;'. E.g., '7 kg'. + Mass + + + + + Intangible + A utility class that serves as the umbrella for a number of 'intangible' things such as quantities, structured values, etc. + + + + A blog post. + BlogPosting + + + DayOfWeek + The day of the week, e.g. used to specify to which day the opening hours of an OpeningHoursSpecification refer. + +Originally, URLs from [GoodRelations](http://purl.org/goodrelations/v1) were used (for [[Monday]], [[Tuesday]], [[Wednesday]], [[Thursday]], [[Friday]], [[Saturday]], [[Sunday]] plus a special entry for [[PublicHolidays]]); these have now been integrated directly into schema.org. + + + + + + + + PropertyValueSpecification + A Property value specification. + + + + DefinedTermSet + + + A set of defined terms for example a set of categories or a classification scheme, a glossary, dictionary or enumeration. + + + A [[comment]] that corrects [[CreativeWork]]. + + CorrectionComment + + + + + + InteractAction + The act of interacting with another person or organization. + + + Used to describe a seat, such as a reserved seat in an event reservation. + + Seat + + + Event + + + An event happening at a certain time and location, such as a concert, lecture, or festival. Ticketing information may be added via the [[offers]] property. Repeated events may be structured as separate Event objects. + + + NLNonprofitType + NLNonprofitType: Non-profit organization type originating from the Netherlands. + + + + + + + Nerve + A common pathway for the electrochemical nerve impulses that are transmitted along each of the axons. + + + + Residence type: Single-family home. + SingleFamilyResidence + + + + DrugClass + + + A class of medical drugs, e.g., statins. Classes can represent general pharmacological class, common mechanisms of action, common physiological effects, etc. + + + A TV episode which can be part of a series or season. + TVEpisode + + + + + + GovernmentBenefitsType enumerates several kinds of government benefits to support the COVID-19 situation. Note that this structure may not capture all benefits offered. + GovernmentBenefitsType + + + + + + + Enumerates types (or dimensions) of a person's body measurements, for example for fitting of clothes. + BodyMeasurementTypeEnumeration + + + Trip + + A trip or journey. An itinerary of visits to one or more places. + + + + + + [[Recommendation]] is a type of [[Review]] that suggests or proposes something as the best option or best course of action. Recommendations may be for products or services, or other concrete things, as in the case of a ranked list or product guide. A [[Guide]] may list multiple recommendations for different categories. For example, in a [[Guide]] about which TVs to buy, the author may have several [[Recommendation]]s. + Recommendation + + + + + TrainTrip + A trip on a commercial train line. + + + TVClip + A short TV program or a segment/part of a TV program. + + + + Suite + + + http://en.wikipedia.org/wiki/Suite_(hotel)). +

+See also the dedicated document on the use of schema.org for marking up hotels and other forms of accommodations. +]]>
+
+ + Bank or credit union. + + BankOrCreditUnion + + + The mailing address. + PostalAddress + + + + ReservationPackage + + A group of multiple reservations with common values for all sub-reservations. + + + + Any medical imaging modality typically used for diagnostic purposes. Enumerated type. + MedicalImagingTechnique + + + + + EducationEvent + Event type: Education event. + + + + DrugCost + + The cost per unit of a medical drug. Note that this type is not meant to represent the price in an offer of a drug for sale; see the Offer type for that. This type will typically be used to tag wholesale or average retail cost of a drug, or maximum reimbursable cost. Costs of medical drugs vary widely depending on how and where they are paid for, so while this type captures some of the variables, costs should be used with caution by consumers of this schema's markup. + + + Server that provides game interaction in a multiplayer game. + GameServer + + + + The delivery of a parcel either via the postal service or a commercial service. + ParcelDelivery + + + + Boolean + Boolean: True or False. + + + + Categories of medical devices, organized by the purpose or intended use of the device. + MedicalDevicePurpose + + + + + MathSolver + + + + A math solver which is capable of solving a subset of mathematical problems. + + + A reservation for a taxi.\n\nNote: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use [[Offer]]. + + TaxiReservation + + + + + + An enterprise (potentially individual but typically collaborative), planned to achieve a particular aim. +Use properties from [[Organization]], [[subOrganization]]/[[parentOrganization]] to indicate project sub-structures. + + Project + + + + + A simple system that adds up the number of risk factors to yield a score that is associated with prognosis, e.g. CHAD score, TIMI risk score. + + MedicalRiskScore + + + + A church. + Church + + + TypeAndQuantityNode + A structured value indicating the quantity, unit of measurement, and business function of goods included in a bundle offer. + + + + + The act of finding an object.\n\nRelated actions:\n\n* [[SearchAction]]: FindAction is generally lead by a SearchAction, but not necessarily. + + FindAction + + + + An EventAttendanceModeEnumeration value is one of potentially several modes of organising an event, relating to whether it is online or offline. + + EventAttendanceModeEnumeration + + + + MedicalStudy + + A medical study is an umbrella type covering all kinds of research studies relating to human medicine or health, including observational studies and interventional trials and registries, randomized, controlled or not. When the specific type of study is known, use one of the extensions of this type, such as MedicalTrial or MedicalObservationalStudy. Also, note that this type should be used to mark up data that describes the study itself; to tag an article that publishes the results of a study, use MedicalScholarlyArticle. Note: use the code property of MedicalEntity to store study IDs, e.g. clinicaltrials.gov ID. + + + + + + A program offered by an institution which determines the learning progress to achieve an outcome, usually a credential like a degree or certificate. This would define a discrete set of opportunities (e.g., job, courses) that together constitute a program with a clear start, end, set of requirements, and transition to a new occupational opportunity (e.g., a job), or sometimes a higher educational opportunity (e.g., an advanced degree). + EducationalOccupationalProgram + + + + + + A property-value pair, e.g. representing a feature of a product or place. Use the 'name' property for the name of the property. If there is an additional human-readable version of the value, put that into the 'description' property.\n\n Always use specific schema.org properties when a) they exist and b) you can populate them. Using PropertyValue as a substitute will typically not trigger the same effect as using the original, specific property. + + PropertyValue + + + A description of an educational course which may be offered as distinct instances at which take place at different times or take place at different locations, or be offered through different media or modes of study. An educational course is a sequence of one or more educational events and/or creative works which aims to build knowledge, competence or ability of learners. + + Course + + + + An instance of a [[Course]] which is distinct from other instances because it is offered at a different time or location or through different media or modes of study or to a specific section of students. + CourseInstance + + + + A public structure, such as a town hall or concert hall. + + CivicStructure + + + A collection of music tracks. + MusicAlbum + + + + Quantity + + Quantities such as distance, time, mass, weight, etc. Particular instances of say Mass are entities like '3 Kg' or '4 milligrams'. + + + + Represents additional information about a relationship or property. For example a Role can be used to say that a 'member' role linking some SportsTeam to a player occurred during a particular time period. Or that a Person's 'actor' role in a Movie was for some particular characterName. Such properties can be attached to a Role entity, which is then associated with the main entities using ordinary properties like 'member' or 'actor'.\n\nSee also [blog post](http://blog.schema.org/2014/06/introducing-role.html). + Role + + + + ProductModel + A datasheet or vendor specification of a product (in the sense of a prototypical description). + + + + + The act of providing goods, services, or money without compensation, often for philanthropic reasons. + DonateAction + + + Permit + A permit issued by an organization, e.g. a parking pass. + + + + + + LocationFeatureSpecification + Specifies a location feature by providing a structured value representing a feature of an accommodation as a property-value pair of varying degrees of formality. + + + Organization + + An organization such as a school, NGO, corporation, club, etc. + + + MedicalConditionStage + + + A stage of a medical condition, such as 'Stage IIIa'. + + + + A permission for a particular person or group to access a particular file. + DigitalDocumentPermission + + + + Recipe + A recipe. For dietary restrictions covered by the recipe, a few common restrictions are enumerated via [[suitableForDiet]]. The [[keywords]] property can also be used to add more detail. + + + + MusicComposition + + A musical composition. + + + + MusicRecording + A music recording (track), usually a single song. + + + + MenuItem + A food or drink item listed in a menu or menu section. + + + + The act of applying an object to its intended purpose. + UseAction + + + + JoinAction + An agent joins an event/group with participants/friends at a location.\n\nRelated actions:\n\n* [[RegisterAction]]: Unlike RegisterAction, JoinAction refers to joining a group/team of people.\n* [[SubscribeAction]]: Unlike SubscribeAction, JoinAction does not imply that you'll be receiving updates.\n* [[FollowAction]]: Unlike FollowAction, JoinAction does not imply that you'll be polling for updates. + + + A service which provides access to media programming like TV or radio. Access may be via cable or satellite. + + CableOrSatelliteService + + + The act of accomplishing something via previous efforts. It is an instantaneous action rather than an ongoing process. + AchieveAction + + + + Lists or enumerations—for example, a list of cuisines or music genres, etc. + + Enumeration + + + Enumerated options related to a ContactPoint. + + ContactPointOption + + + + + UserInteraction and its subtypes is an old way of talking about users interacting with pages. It is generally better to use [[Action]]-based vocabulary, alongside types such as [[Comment]]. + UserInteraction + + + + Diet + A strategy of regulating the intake of food to achieve or maintain a specific health-related goal. + + + + + + The act of forming a personal connection with someone/something (object) unidirectionally/asymmetrically to get updates polled from.\n\nRelated actions:\n\n* [[BefriendAction]]: Unlike BefriendAction, FollowAction implies that the connection is *not* necessarily reciprocal.\n* [[SubscribeAction]]: Unlike SubscribeAction, FollowAction implies that the follower acts as an active agent constantly/actively polling for updates.\n* [[RegisterAction]]: Unlike RegisterAction, FollowAction implies that the agent is interested in continuing receiving updates from the object.\n* [[JoinAction]]: Unlike JoinAction, FollowAction implies that the agent is interested in getting updates from the object.\n* [[TrackAction]]: Unlike TrackAction, FollowAction refers to the polling of updates of all aspects of animate objects rather than the location of inanimate objects (e.g. you track a package, but you don't follow it). + FollowAction + +
diff --git a/tests/data/schema.rdfa b/tests/data/schema.rdfa deleted file mode 100644 index ee5d749c..00000000 --- a/tests/data/schema.rdfa +++ /dev/null @@ -1,10325 +0,0 @@ - - - - RDFa Lite Reflection - - - - - -

Schema.org core schema

- -

This is the RDFa representation of the schema.org schema, the underlying representation of the schema.org vocabulary.

- -

It is represented in a form based on W3C RDF/RDFS. We encourage proposals for schema.org improvements to be expressed - in this same style. For Discussion please use the W3C Web schemas group.

-

- See datamodel for more details. -

-

- Note: the style of RDFa used here may change in the future. To see the substantive content of the schema, view the - HTML source markup. We use a simple subset of RDFa for syntax, including prefixes that are declared in the - RDFa initial context. -

- -
- -
- Thing - The most generic type of item. -
- -
- CreativeWork - The most generic kind of creative work, including books, movies, photographs, software programs, etc. - Subclass of: Thing - Source: rNews
- -
- WebPage - A web page. Every web page is implicitly assumed to be declared to be of type WebPage, so the various properties about that webpage, such as <code>breadcrumb</code> may be used. We recommend explicit declaration if these properties are specified, but if they are found outside of an itemscope, they will be assumed to be about the page - Subclass of: CreativeWork -
- -
- AboutPage - Web page type: About page. - Subclass of: WebPage -
- -
- Organization - An organization such as a school, NGO, corporation, club, etc. - Subclass of: Thing -
- -
- Place - Entities that have a somewhat fixed, physical extension. - Subclass of: Thing -
- -
- LocalBusiness - A particular physical business or branch of an organization. Examples of LocalBusiness include a restaurant, a particular branch of a restaurant chain, a branch of a bank, a medical practice, a club, a bowling alley, etc. - Subclass of: Organization - Subclass of: Place -
- -
- FinancialService - Financial services business. - Subclass of: LocalBusiness -
- -
- ProfessionalService - Provider of professional services. - Subclass of: LocalBusiness -
- -
- AccountingService - Accountancy business. - Subclass of: FinancialService - Subclass of: ProfessionalService -
- -
- AdministrativeArea - A geographical region under the jurisdiction of a particular government. - Subclass of: Place -
- -
- EntertainmentBusiness - A business providing entertainment. - Subclass of: LocalBusiness -
- -
- AdultEntertainment - An adult entertainment establishment. - Subclass of: EntertainmentBusiness -
- -
- Intangible - A utility class that serves as the umbrella for a number of 'intangible' things such as quantities, structured values, etc. - Subclass of: Thing -
- -
- Offer - An offer to transfer some rights to an item or to provide a service&#x2014;for example, an offer to sell tickets to an event, to rent the DVD of a movie, to stream a TV show over the internet, to repair a motorcycle, or to loan a book. - <br/><br/> - For <a href="http://www.gs1.org/barcodes/technical/idkeys/gtin">GTIN</a>-related fields, see - <a href="http://www.gs1.org/barcodes/support/check_digit_calculator">Check Digit calculator</a> - and <a href="http://www.gs1us.org/resources/standards/gtin-validation-guide">validation guide</a> - from <a href="http://www.gs1.org/">GS1</a>. - - Subclass of: Intangible - Source: GoodRelationsProperties
- -
- AggregateOffer - When a single product is associated with multiple offers (for example, the same pair of shoes is offered by different merchants), then AggregateOffer can be used. - Subclass of: Offer -
- -
- Rating - The rating of the video. - Subclass of: Intangible -
- -
- AggregateRating - The average rating based on multiple ratings or reviews. - Subclass of: Rating -
- -
- CivicStructure - A public structure, such as a town hall or concert hall. - Subclass of: Place -
- -
- Airport - An airport. - Subclass of: CivicStructure -
- -
- AmusementPark - An amusement park. - Subclass of: EntertainmentBusiness -
- -
- MedicalEntity - The most generic type of entity related to health and the practice of medicine. - Subclass of: Thing - Source: WikiDoc
- -
- AnatomicalStructure - Any part of the human body, typically a component of an anatomical system. Organs, tissues, and cells are all anatomical structures. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- AnatomicalSystem - An anatomical system is a group of anatomical structures that work together to perform a certain task. Anatomical systems, such as organ systems, are one organizing principle of anatomy, and can includes circulatory, digestive, endocrine, integumentary, immune, lymphatic, muscular, nervous, reproductive, respiratory, skeletal, urinary, vestibular, and other systems. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- AnimalShelter - Animal shelter. - Subclass of: LocalBusiness -
- -
- Residence - The place where a person lives. - Subclass of: Place -
- -
- ApartmentComplex - Residence type: Apartment complex. - Subclass of: Residence -
- -
- MedicalIndication - A condition or factor that indicates use of a medical therapy, including signs, symptoms, risk factors, anatomical states, etc. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- ApprovedIndication - An indication for a medical therapy that has been formally specified or approved by a regulatory body that regulates use of the therapy; for example, the US FDA approves indications for most drugs in the US. - Subclass of: MedicalIndication - Source: WikiDoc
- -
- Aquarium - Aquarium. - Subclass of: CivicStructure -
- -
- ArtGallery - An art gallery. - Subclass of: EntertainmentBusiness -
- -
- Vessel - A component of the human body circulatory system comprised of an intricate network of hollow tubes that transport blood throughout the entire body. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- Artery - A type of blood vessel that specifically carries blood away from the heart. - Subclass of: Vessel - Source: WikiDoc
- -
- Article - An article, such as a news article or piece of investigative report. Newspapers and magazines have articles of many different types and this is intended to cover them all. - Subclass of: CreativeWork - Source: rNews
- -
- Attorney - Professional service: Attorney. - Subclass of: ProfessionalService -
- -
- Audience - Intended audience for an item, i.e. the group for whom the item was created. - Subclass of: Intangible -
- -
- Researcher - Researchers. -
- -
- MediaObject - An image, video, or audio object embedded in a web page. Note that a creative work may have many media objects associated with it on the same web page. For example, a page about a single song (MusicRecording) may have a music video (VideoObject), and a high and low bandwidth audio stream (2 AudioObject's). - Subclass of: CreativeWork -
- -
- AudioObject - An audio file. - Subclass of: MediaObject - Source: rNews -
- -
- AutomotiveBusiness - Car repair, sales, or parts. - Subclass of: LocalBusiness -
- -
- AutoBodyShop - Auto body shop. - Subclass of: AutomotiveBusiness -
- -
- AutoDealer - An car dealership. - Subclass of: AutomotiveBusiness -
- -
- Store - A retail good store. - Subclass of: LocalBusiness -
- -
- AutoPartsStore - An auto parts store. - Subclass of: AutomotiveBusiness - Subclass of: Store -
- -
- AutoRental - A car rental business. - Subclass of: AutomotiveBusiness -
- -
- AutoRepair - Car repair business. - Subclass of: AutomotiveBusiness -
- -
- AutoWash - A car wash business. - Subclass of: AutomotiveBusiness -
- -
- AutomatedTeller - ATM/cash machine. - Subclass of: FinancialService -
- -
- FoodEstablishment - A food-related business. - Subclass of: LocalBusiness -
- -
- Bakery - A bakery. - Subclass of: FoodEstablishment -
- -
- BankOrCreditUnion - Bank or credit union. - Subclass of: FinancialService -
- -
- BarOrPub - A bar or pub. - Subclass of: FoodEstablishment -
- -
- Beach - Beach. - Subclass of: CivicStructure -
- -
- HealthAndBeautyBusiness - Health and beauty. - Subclass of: LocalBusiness -
- -
- BeautySalon - Beauty salon. - Subclass of: HealthAndBeautyBusiness -
- -
- LodgingBusiness - A lodging business, such as a motel, hotel, or inn. - Subclass of: LocalBusiness -
- -
- BedAndBreakfast - Bed and breakfast. - Subclass of: LodgingBusiness -
- -
- BikeStore - A bike store. - Subclass of: Store -
- -
- Blog - A blog - Subclass of: CreativeWork -
- -
- BlogPosting - A blog post. - Subclass of: Article -
- -
- MedicalTest - Any medical test, typically performed for diagnostic purposes. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- BloodTest - A medical test performed on a sample of a patient's blood. - Subclass of: MedicalTest - Source: WikiDoc
- -
- Landform - A landform or physical feature. Landform elements include mountains, plains, lakes, rivers, seascape and oceanic waterbody interface features such as bays, peninsulas, seas and so forth, including sub-aqueous terrain features such as submersed mountain ranges, volcanoes, and the great ocean basins. - Subclass of: Place -
- -
- BodyOfWater - A body of water, such as a sea, ocean, or lake. - Subclass of: Landform -
- -
- Bone - Rigid connective tissue that comprises up the skeletal structure of the human body. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- Book - A book. - Subclass of: CreativeWork -
- -
- Enumeration - Lists or enumerations&#x2014;for example, a list of cuisines or music genres, etc. - Subclass of: Intangible -
- -
- BookFormatType - The publication format of the book. - Subclass of: Enumeration -
- -
- EBook - Book format: Ebook. -
- -
- Hardcover - Book format: Hardcover. -
- -
- Paperback - Book format: Paperback. -
- -
- BookStore - A bookstore. - Subclass of: Store -
- -
- DataType - The basic data types such as Integers, Strings, etc. -
- -
- Boolean - Boolean: True or False. - Subclass of: DataType -
- -
- False - The boolean value false - Subclass of: Boolean -
- -
- True - The boolean value true - Subclass of: Boolean -
- -
- SportsActivityLocation - A sports location, such as a playing field. - Subclass of: LocalBusiness -
- -
- BowlingAlley - A bowling alley. - Subclass of: SportsActivityLocation -
- -
- BrainStructure - Any anatomical structure which pertains to the soft nervous tissue functioning as the coordinating center of sensation and intellectual and nervous activity. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- Brewery - Brewery. - Subclass of: FoodEstablishment -
- -
- PlaceOfWorship - Place of worship, such as a church, synagogue, or mosque. - Subclass of: CivicStructure -
- -
- BuddhistTemple - A Buddhist temple. - Subclass of: PlaceOfWorship -
- -
- BusStation - A bus station. - Subclass of: CivicStructure -
- -
- BusStop - A bus stop. - Subclass of: CivicStructure -
- -
- Event - An event happening at a certain time and location, such as a concert, lecture, or festival. Ticketing information may be added via the 'offers' property. Repeated events may be structured as separate Event objects. - Subclass of: Thing - -
- -
- BusinessEvent - Event type: Business event. - Subclass of: Event -
- -
- CafeOrCoffeeShop - A cafe or coffee shop. - Subclass of: FoodEstablishment -
- -
- Campground - A campground. - Subclass of: CivicStructure -
- -
- Canal - A canal, like the Panama Canal - Subclass of: BodyOfWater -
- -
- Casino - A casino. - Subclass of: EntertainmentBusiness -
- -
- CatholicChurch - A Catholic church. - Subclass of: PlaceOfWorship -
- -
- Cemetery - A graveyard. - Subclass of: CivicStructure -
- -
- CheckoutPage - Web page type: Checkout page. - Subclass of: WebPage -
- -
- ChildCare - A Childcare center. - Subclass of: LocalBusiness -
- -
- ChildrensEvent - Event type: Children's event. - Subclass of: Event -
- -
- Church - A church. - Subclass of: PlaceOfWorship -
- -
- City - A city or town. - Subclass of: AdministrativeArea -
- -
- GovernmentBuilding - A government building. - Subclass of: CivicStructure -
- -
- CityHall - A city hall. - Subclass of: GovernmentBuilding -
- -
- ClothingStore - A clothing store. - Subclass of: Store -
- -
- CollectionPage - Web page type: Collection page. - Subclass of: WebPage -
- -
- EducationalOrganization - An educational organization. - Subclass of: Organization -
- -
- CollegeOrUniversity - A college, university, or other third-level educational institution. - Subclass of: EducationalOrganization -
- -
- ComedyClub - A comedy club. - Subclass of: EntertainmentBusiness -
- -
- ComedyEvent - Event type: Comedy event. - Subclass of: Event -
- -
- Comment - A comment on an item - for example, a comment on a blog post. The comment's content is expressed via the "text" property, and its topic via "about", properties shared with all CreativeWorks. - Subclass of: CreativeWork -
- -
- ComputerStore - A computer store. - Subclass of: Store -
- -
- ContactPage - Web page type: Contact page. - Subclass of: WebPage -
- -
- StructuredValue - Structured values are strings&#x2014;for example, addresses&#x2014;that have certain constraints on their structure. - Subclass of: Intangible -
- -
- ContactPoint - A contact point&#x2014;for example, a Customer Complaints department. - Subclass of: StructuredValue -
- -
- Continent - One of the continents (for example, Europe or Africa). - Subclass of: Landform -
- -
- ConvenienceStore - A convenience store. - Subclass of: Store -
- -
- Corporation - Organization: A business corporation. - Subclass of: Organization - Source: rNews
- -
- Country - A country. - Subclass of: AdministrativeArea -
- -
- Courthouse - A courthouse. - Subclass of: GovernmentBuilding -
- -
- Crematorium - A crematorium. - Subclass of: CivicStructure -
- -
- MedicalIntangible - A utility class that serves as the umbrella for a number of 'intangible' things in the medical space. - Subclass of: MedicalEntity -
- -
- DDxElement - An alternative, closely-related condition typically considered later in the differential diagnosis process along with the signs that are used to distinguish it. - Subclass of: MedicalIntangible - Source: WikiDoc
- -
- DanceEvent - Event type: A social dance. - Subclass of: Event -
- -
- PerformingGroup - A performance group, such as a band, an orchestra, or a circus. - Subclass of: Organization -
- -
- DanceGroup - A dance group&#x2014;for example, the Alvin Ailey Dance Theater or Riverdance. - Subclass of: PerformingGroup -
- -
- Date - A date value in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 date format</a>. - Subclass of: DataType -
- -
- DateTime - A combination of date and time of day in the form [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] (see Chapter 5.4 of ISO 8601). - Subclass of: DataType -
- -
- DaySpa - A day spa. - Subclass of: HealthAndBeautyBusiness -
- -
- DefenceEstablishment - A defence establishment, such as an army or navy base. - Subclass of: GovernmentBuilding -
- -
- MedicalOrganization - A medical organization, such as a doctor's office or clinic. - Subclass of: LocalBusiness -
- -
- Dentist - A dentist. - Subclass of: MedicalOrganization - Subclass of: ProfessionalService -
- -
- DepartmentStore - A department store. - Subclass of: Store -
- -
- DiagnosticLab - A medical laboratory that offers on-site or off-site diagnostic services. - Subclass of: MedicalOrganization -
- -
- MedicalProcedure - A process of care used in either a diagnostic, therapeutic, or palliative capacity that relies on invasive (surgical), non-invasive, or percutaneous techniques. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- DiagnosticProcedure - A medical procedure intended primarily for diagnostic, as opposed to therapeutic, purposes. - Subclass of: MedicalProcedure - Subclass of: MedicalTest - Source: WikiDoc
- -
- MedicalTherapy - Any medical intervention designed to prevent, treat, and cure human diseases and medical conditions, including both curative and palliative therapies. Medical therapies are typically processes of care relying upon pharmacotherapy, behavioral therapy, supportive therapy (with fluid or nutrition for example), or detoxification (e.g. hemodialysis) aimed at improving or preventing a health condition. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- LifestyleModification - A process of care involving exercise, changes to diet, fitness routines, and other lifestyle changes aimed at improving a health condition. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- Diet - A strategy of regulating the intake of food to achieve or maintain a specific health-related goal. - Subclass of: CreativeWork - Subclass of: LifestyleModification - Source: WikiDoc
- -
- DietarySupplement - A product taken by mouth that contains a dietary ingredient intended to supplement the diet. Dietary ingredients may include vitamins, minerals, herbs or other botanicals, amino acids, and substances such as enzymes, organ tissues, glandulars and metabolites. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- Quantity - Quantities such as distance, time, mass, weight, etc. Particular instances of say Mass are entities like '3 Kg' or '4 milligrams'. - Subclass of: Intangible -
- -
- Distance - Properties that take Distances as values are of the form '&lt;Number&gt; &lt;Length unit of measure&gt;'. E.g., '7 ft' - Subclass of: Quantity -
- -
- DoseSchedule - A specific dosing schedule for a drug or supplement. - Subclass of: MedicalIntangible -
- -
- Drug - A chemical or biologic substance, used as a medical therapy, that has a physiological effect on an organism. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- DrugClass - A class of medical drugs, e.g., statins. Classes can represent general pharmacological class, common mechanisms of action, common physiological effects, etc. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- DrugCost - The cost per unit of a medical drug. Note that this type is not meant to represent the price in an offer of a drug for sale; see the Offer type for that. This type will typically be used to tag wholesale or average retail cost of a drug, or maximum reimbursable cost. Costs of medical drugs vary widely depending on how and where they are paid for, so while this type captures some of the variables, costs should be used with caution by consumers of this schema's markup. - Subclass of: MedicalIntangible -
- -
- MedicalEnumeration - Enumerations related to health and the practice of medicine. - Subclass of: MedicalIntangible - Subclass of: Enumeration -
- -
- DrugCostCategory - Enumerated categories of medical drug costs. - Subclass of: MedicalEnumeration - Subclass of: Enumeration -
- -
- ReimbursementCap - The drug's cost represents the maximum reimbursement paid by an insurer for the drug. -
- -
- Retail - The drug's cost represents the retail cost of the drug. -
- -
- Wholesale - The drug's cost represents the wholesale acquisition cost of the drug. -
- -
- DrugLegalStatus - The legal availability status of a medical drug. - Subclass of: MedicalIntangible - Source: WikiDoc
- -
- DrugPregnancyCategory - Categories that represent an assessment of the risk of fetal injury due to a drug or pharmaceutical used as directed by the mother during pregnancy. - Subclass of: MedicalEnumeration - Subclass of: Enumeration -
- -
- FDAcategoryA - A designation by the US FDA signifying that adequate and well-controlled studies have failed to demonstrate a risk to the fetus in the first trimester of pregnancy (and there is no evidence of risk in later trimesters). -
- -
- FDAcategoryB - A designation by the US FDA signifying that animal reproduction studies have failed to demonstrate a risk to the fetus and there are no adequate and well-controlled studies in pregnant women. -
- -
- FDAcategoryC - A designation by the US FDA signifying that animal reproduction studies have shown an adverse effect on the fetus and there are no adequate and well-controlled studies in humans, but potential benefits may warrant use of the drug in pregnant women despite potential risks. -
- -
- FDAcategoryD - A designation by the US FDA signifying that there is positive evidence of human fetal risk based on adverse reaction data from investigational or marketing experience or studies in humans, but potential benefits may warrant use of the drug in pregnant women despite potential risks. -
- -
- FDAcategoryX - A designation by the US FDA signifying that studies in animals or humans have demonstrated fetal abnormalities and/or there is positive evidence of human fetal risk based on adverse reaction data from investigational or marketing experience, and the risks involved in use of the drug in pregnant women clearly outweigh potential benefits. -
- -
- FDAnotEvaluated - A designation that the drug in question has not been assigned a pregnancy category designation by the US FDA. -
- -
- DrugPrescriptionStatus - Indicates whether this drug is available by prescription or over-the-counter. - Subclass of: MedicalEnumeration - Subclass of: Enumeration -
- -
- OTC - Available over the counter. -
- -
- PrescriptionOnly - Available by prescription only. -
- -
- DrugStrength - A specific strength in which a medical drug is available in a specific country. - Subclass of: MedicalIntangible - Source: WikiDoc
- -
- DryCleaningOrLaundry - A dry-cleaning business. - Subclass of: LocalBusiness -
- -
- Duration - Quantity: Duration (use <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 duration format</a>). - Subclass of: Quantity -
- -
- EducationEvent - Event type: Education event. - Subclass of: Event -
- -
- HomeAndConstructionBusiness - A construction business. - Subclass of: LocalBusiness -
- -
- Electrician - An electrician. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- ElectronicsStore - An electronics store. - Subclass of: Store -
- -
- ElementarySchool - An elementary school. - Subclass of: EducationalOrganization -
- -
- Embassy - An embassy. - Subclass of: GovernmentBuilding -
- -
- EmergencyService - An emergency service, such as a fire station or ER. - Subclass of: LocalBusiness -
- -
- EmploymentAgency - An employment agency. - Subclass of: LocalBusiness -
- -
- Energy - Properties that take Energy as values are of the form '&lt;Number&gt; &lt;Energy unit of measure&gt;' - Subclass of: Quantity -
- -
- EventVenue - An event venue. - Subclass of: CivicStructure -
- -
- ExerciseGym - A gym. - Subclass of: SportsActivityLocation -
- -
- PhysicalActivity - Any bodily activity that enhances or maintains physical fitness and overall health and wellness. Includes activity that is part of daily living and routine, structured exercise, and exercise prescribed as part of a medical treatment or recovery plan. - Subclass of: LifestyleModification - Source: WikiDoc
- -
- ExercisePlan - Fitness-related activity designed for a specific health-related purpose, including defined exercise routines as well as activity prescribed by a clinician. - Subclass of: CreativeWork - Subclass of: PhysicalActivity - Source: WikiDoc
- -
- FastFoodRestaurant - A fast-food restaurant. - Subclass of: FoodEstablishment -
- -
- Festival - Event type: Festival. - Subclass of: Event -
- -
- FireStation - A fire station. With firemen. - Subclass of: CivicStructure - Subclass of: EmergencyService -
- -
- Number - Data type: Number. - Subclass of: DataType -
- -
- Float - Data type: Floating number. - Subclass of: Number -
- -
- Florist - A florist. - Subclass of: Store -
- -
- FoodEvent - Event type: Food event. - Subclass of: Event -
- -
- FurnitureStore - A furniture store. - Subclass of: Store -
- -
- GardenStore - A garden store. - Subclass of: Store -
- -
- GasStation - A gas station. - Subclass of: AutomotiveBusiness -
- -
- GatedResidenceCommunity - Residence type: Gated community. - Subclass of: Residence -
- -
- GeneralContractor - A general contractor. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- GeoCoordinates - The geographic coordinates of a place or event. - Subclass of: StructuredValue -
- -
- GeoShape - The geographic shape of a place. - Subclass of: StructuredValue - Source: rNews
- -
- GolfCourse - A golf course. - Subclass of: SportsActivityLocation -
- -
- GovernmentOffice - A government office&#x2014;for example, an IRS or DMV office. - Subclass of: LocalBusiness -
- -
- GovernmentOrganization - A governmental organization or agency. - Subclass of: Organization -
- -
- GroceryStore - A grocery store. - Subclass of: Store -
- -
- HVACBusiness - A business that provide Heating, Ventilation and Air Conditioning services. - Subclass of: HomeAndConstructionBusiness -
- -
- HairSalon - A hair salon. - Subclass of: HealthAndBeautyBusiness -
- -
- HardwareStore - A hardware store. - Subclass of: Store -
- -
- HealthClub - A health club. - Subclass of: HealthAndBeautyBusiness - Subclass of: SportsActivityLocation -
- -
- HighSchool - A high school. - Subclass of: EducationalOrganization -
- -
- HinduTemple - A Hindu temple. - Subclass of: PlaceOfWorship -
- -
- HobbyShop - A store that sells materials useful or necessary for various hobbies. - Subclass of: Store -
- -
- HomeGoodsStore - A home goods store. - Subclass of: Store -
- -
- Hospital - A hospital. - Subclass of: CivicStructure - Subclass of: EmergencyService - Subclass of: MedicalOrganization -
- -
- Hostel - A hostel - cheap accommodation, often in shared dormitories. - Subclass of: LodgingBusiness -
- -
- Hotel - A hotel. - Subclass of: LodgingBusiness -
- -
- HousePainter - A house painting service. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- IceCreamShop - An ice cream shop - Subclass of: FoodEstablishment -
- -
- ImageGallery - Web page type: Image gallery page. - Subclass of: CollectionPage -
- -
- ImageObject - An image file. - Subclass of: MediaObject - -
- -
- ImagingTest - Any medical imaging modality typically used for diagnostic purposes. - Subclass of: MedicalTest - Source: WikiDoc
- -
- InfectiousAgentClass - Classes of agents or pathogens that transmit infectious diseases. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc -
- -
- Bacteria - Pathogenic bacteria that cause bacterial infection. -
- -
- Fungus - Pathogenic fungus. -
- -
- MulticellularParasite - Multicellular parasite that causes an infection. -
- -
- Prion - A prion is an infectious agent composed of protein in a misfolded form. -
- -
- Protozoa - Single-celled organism that causes an infection. -
- -
- Virus - Pathogenic virus that causes viral infection. -
- -
- MedicalCondition - Any condition of the human body that affects the normal functioning of a person, whether physically or mentally. Includes diseases, injuries, disabilities, disorders, syndromes, etc. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- InfectiousDisease - An infectious disease is a clinically evident human disease resulting from the presence of pathogenic microbial agents, like pathogenic viruses, pathogenic bacteria, fungi, protozoa, multicellular parasites, and prions. To be considered an infectious disease, such pathogens are known to be able to cause this disease. - Subclass of: MedicalCondition - Source: WikiDoc
- -
- InsuranceAgency - An Insurance agency. - Subclass of: FinancialService -
- -
- Integer - Data type: Integer. - Subclass of: Number -
- -
- InternetCafe - An internet cafe. - Subclass of: LocalBusiness -
- -
- ItemAvailability - A list of possible product availability options. - Subclass of: Enumeration -
- -
- Discontinued - Indicates that the item has been discontinued. -
- -
- InStock - Indicates that the item is in stock. -
- -
- InStoreOnly - Indicates that the item is available only at physical locations. -
- -
- LimitedAvailability - Indicates that the item has limited availability. -
- -
- OnlineOnly - Indicates that the item is available only online. -
- -
- OutOfStock - Indicates that the item is out of stock. -
- -
- PreOrder - Indicates that the item is available for pre-order. -
- -
- SoldOut - Indicates that the item has sold out. -
- -
- ItemList - A list of items of any sort&#x2014;for example, Top 10 Movies About Weathermen, or Top 100 Party Songs. Not to be confused with HTML lists, which are often used only for formatting. - Subclass of: Intangible -
- -
- ItemPage - A page devoted to a single item, such as a particular product or hotel. - Subclass of: WebPage -
- -
- JewelryStore - A jewelry store. - Subclass of: Store -
- -
- JobPosting - A listing that describes a job opening in a certain organization. - Subclass of: Intangible -
- -
- Joint - The anatomical location at which two or more bones make contact. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- LakeBodyOfWater - A lake (for example, Lake Pontrachain). - Subclass of: BodyOfWater -
- -
- LandmarksOrHistoricalBuildings - An historical landmark or building. - Subclass of: Place -
- -
- Language - Natural languages such as Spanish, Tamil, Hindi, English, etc. and programming languages such as Scheme and Lisp. - Subclass of: Intangible -
- -
- LegislativeBuilding - A legislative building&#x2014;for example, the state capitol. - Subclass of: GovernmentBuilding -
- -
- Library - A library. - Subclass of: LocalBusiness -
- -
- Ligament - A short band of tough, flexible, fibrous connective tissue that functions to connect multiple bones, cartilages, and structurally support joints. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- LiquorStore - A shop that sells alcoholic drinks such as wine, beer, whisky and other spirits. - Subclass of: Store -
- -
- LiteraryEvent - Event type: Literary event. - Subclass of: Event -
- -
- Locksmith - A locksmith. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- LymphaticVessel - A type of blood vessel that specifically carries lymph fluid unidirectionally toward the heart. - Subclass of: Vessel - Source: WikiDoc
- -
- Map - A map. - Subclass of: CreativeWork -
- -
- MapCategoryType - An enumeration of several kinds of Map. - Subclass of: Enumeration -
- -
- ParkingMap - A parking map. -
-
- SeatingMap - A seating map. -
-
- VenueMap - A venue map (e.g. for malls, auditoriums, museums, etc.). -
-
- TransitMap - A transit map. -
- -
- mapType - Indicates the kind of Map, from the MapCategoryType Enumeration. - Domain: Map - Range: MapCategoryType -
- -
- Mass - Properties that take Mass as values are of the form '&lt;Number&gt; &lt;Mass unit of measure&gt;'. E.g., '7 kg' - Subclass of: Quantity -
- -
- MaximumDoseSchedule - The maximum dosing schedule considered safe for a drug or supplement as recommended by an authority or by the drug/supplement's manufacturer. Capture the recommending authority in the recognizingAuthority property of MedicalEntity. - Subclass of: DoseSchedule -
- -
- PeopleAudience - A set of characteristics belonging to people, e.g. who compose an item's target audience. - Subclass of: Audience -
- -
- MedicalAudience - Target audiences for medical web pages. Enumerated type. - Subclass of: Audience - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Subclass of: PeopleAudience - Source: WikiDoc
- -
- Clinician - Medical clinicians, including practicing physicians and other medical professionals involved in clinical practice. -
- -
- MedicalResearcher - Medical researchers. -
- -
- Patient - Patients. -
- -
- MedicalCause - The causative agent(s) that are responsible for the pathophysiologic process that eventually results in a medical condition, symptom or sign. In this schema, unless otherwise specified this is meant to be the proximate cause of the medical condition, symptom or sign. The proximate cause is defined as the causative agent that most directly results in the medical condition, symptom or sign. For example, the HIV virus could be considered a cause of AIDS. Or in a diagnostic context, if a patient fell and sustained a hip fracture and two days later sustained a pulmonary embolism which eventuated in a cardiac arrest, the cause of the cardiac arrest (the proximate cause) would be the pulmonary embolism and not the fall. <p>Medical causes can include cardiovascular, chemical, dermatologic, endocrine, environmental, gastroenterologic, genetic, hematologic, gynecologic, iatrogenic, infectious, musculoskeletal, neurologic, nutritional, obstetric, oncologic, otolaryngologic, pharmacologic, psychiatric, pulmonary, renal, rheumatologic, toxic, traumatic, or urologic causes; medical conditions can be causes as well. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalClinic - A medical clinic. - Subclass of: MedicalOrganization -
- -
- MedicalCode - A code for a medical entity. - Subclass of: MedicalIntangible - Source: WikiDoc
- -
- MedicalConditionStage - A stage of a medical condition, such as 'Stage IIIa'. - Subclass of: MedicalIntangible - Source: WikiDoc
- -
- MedicalContraindication - A condition or factor that serves as a reason to withhold a certain medical therapy. Contraindications can be absolute (there are no reasonable circumstances for undertaking a course of action) or relative (the patient is at higher risk of complications, but that these risks may be outweighed by other considerations or mitigated by other measures). - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalDevice - Any object used in a medical capacity, such as to diagnose or treat a patient. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalDevicePurpose - Categories of medical devices, organized by the purpose or intended use of the device. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- Diagnostic - A medical device used for diagnostic purposes. -
- -
- Therapeutic - A medical device used for therapeutic purposes. -
- -
- MedicalEvidenceLevel - Level of evidence for a medical guideline. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- EvidenceLevelA - Data derived from multiple randomized clinical trials or meta-analyses. -
- -
- EvidenceLevelB - Data derived from a single randomized trial, or nonrandomized studies. -
- -
- EvidenceLevelC - Only consensus opinion of experts, case studies, or standard-of-care. -
- -
- MedicalGuideline - Any recommendation made by a standard society (e.g. ACC/AHA) or consensus statement that denotes how to diagnose and treat a particular condition. Note: this type should be used to tag the actual guideline recommendation; if the guideline recommendation occurs in a larger scholarly article, use MedicalScholarlyArticle to tag the overall article, not this type. Note also: the organization making the recommendation should be captured in the recognizingAuthority base property of MedicalEntity. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalGuidelineContraindication - A guideline contraindication that designates a process as harmful and where quality of the data supporting the contraindication is sound. - Subclass of: MedicalGuideline - Source: WikiDoc
- -
- MedicalGuidelineRecommendation - A guideline recommendation that is regarded as efficacious and where quality of the data supporting the recommendation is sound. - Subclass of: MedicalGuideline - Source: WikiDoc
- -
- MedicalImagingTechnique - Any medical imaging modality typically used for diagnostic purposes. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- CT - X-ray computed tomography imaging. -
- -
- MRI - Magnetic resonance imaging. -
- -
- PET - Positron emission tomography imaging. -
- -
- Ultrasound - Ultrasound imaging. -
- -
- XRay - X-ray imaging. -
- -
- MedicalStudy - A medical study is an umbrella type covering all kinds of research studies relating to human medicine or health, including observational studies and interventional trials and registries, randomized, controlled or not. When the specific type of study is known, use one of the extensions of this type, such as MedicalTrial or MedicalObservationalStudy. Also, note that this type should be used to mark up data that describes the study itself; to tag an article that publishes the results of a study, use MedicalScholarlyArticle. Note: use the code property of MedicalEntity to store study IDs, e.g. clinicaltrials.gov ID. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalObservationalStudy - An observational study is a type of medical study that attempts to infer the possible effect of a treatment through observation of a cohort of subjects over a period of time. In an observational study, the assignment of subjects into treatment groups versus control groups is outside the control of the investigator. This is in contrast with controlled studies, such as the randomized controlled trials represented by MedicalTrial, where each subject is randomly assigned to a treatment group or a control group before the start of the treatment. - Subclass of: MedicalStudy - Source: WikiDoc
- -
- MedicalObservationalStudyDesign - Design models for observational medical studies. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- CaseSeries - A case series (also known as a clinical series) is a medical research study that tracks patients with a known exposure given similar treatment or examines their medical records for exposure and outcome. A case series can be retrospective or prospective and usually involves a smaller number of patients than the more powerful case-control studies or randomized controlled trials. Case series may be consecutive or non-consecutive, depending on whether all cases presenting to the reporting authors over a period of time were included, or only a selection. -
- -
- CohortStudy - Also known as a panel study. A cohort study is a form of longitudinal study used in medicine and social science. It is one type of study design and should be compared with a cross-sectional study. A cohort is a group of people who share a common characteristic or experience within a defined period (e.g., are born, leave school, lose their job, are exposed to a drug or a vaccine, etc.). The comparison group may be the general population from which the cohort is drawn, or it may be another cohort of persons thought to have had little or no exposure to the substance under investigation, but otherwise similar. Alternatively, subgroups within the cohort may be compared with each other. -
- -
- CrossSectional - Studies carried out on pre-existing data (usually from 'snapshot' surveys), such as that collected by the Census Bureau. Sometimes called Prevalence Studies. -
- -
- Longitudinal - Unlike cross-sectional studies, longitudinal studies track the same people, and therefore the differences observed in those people are less likely to be the result of cultural differences across generations. Longitudinal studies are also used in medicine to uncover predictors of certain diseases. -
- -
- Observational - An observational study design. -
- -
- Registry - A registry-based study design. -
- -
- MedicalProcedureType - An enumeration that describes different types of medical procedures. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- NoninvasiveProcedure - A type of medical procedure that involves noninvasive techniques. -
- -
- PercutaneousProcedure - A type of medical procedure that involves percutaneous techniques, where access to organs or tissue is achieved via needle-puncture of the skin. For example, catheter-based procedures like stent delivery. -
- -
- SurgicalProcedure - A type of medical procedure that involves invasive surgical techniques. -
- -
- MedicalRiskEstimator - Any rule set or interactive tool for estimating the risk of developing a complication or condition. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalRiskCalculator - A complex mathematical calculation requiring an online calculator, used to assess prognosis. Note: use the url property of Thing to record any URLs for online calculators. - Subclass of: MedicalRiskEstimator - Source: WikiDoc
- -
- MedicalRiskFactor - A risk factor is anything that increases a person's likelihood of developing or contracting a disease, medical condition, or complication. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalRiskScore - A simple system that adds up the number of risk factors to yield a score that is associated with prognosis, e.g. CHAD score, TIMI risk score. - Subclass of: MedicalRiskEstimator - Source: WikiDoc
- -
- ScholarlyArticle - A scholarly article. - Subclass of: Article -
- -
- MedicalScholarlyArticle - A scholarly article in the medical domain. - Subclass of: ScholarlyArticle -
- -
- MedicalSignOrSymptom - Any indication of the existence of a medical condition or disease. - Subclass of: MedicalEntity - Source: WikiDoc
- -
- MedicalSign - Any physical manifestation of a person's medical condition discoverable by objective diagnostic tests or physical examination. - Subclass of: MedicalSignOrSymptom - Source: WikiDoc
- -
- Specialty - Any branch of a field in which people typically develop specific expertise, usually after significant study, time, and effort. - Subclass of: Enumeration -
- -
- MedicalSpecialty - Any specific branch of medical science or practice. Medical specialities include clinical specialties that pertain to particular organ systems and their respective disease states, as well as allied health specialties. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Subclass of: Specialty - Source: WikiDoc
- -
- Anesthesia - A specific branch of medical science that pertains to study of anesthetics and their application. -
- -
- Cardiovascular - A specific branch of medical science that pertains to diagnosis and treatment of disorders of heart and vasculature. -
- -
- CommunityHealth - Community health. -
- -
- Dentistry - Dentistry. -
- -
- Dermatologic - A specific branch of medical science that pertains to diagnosis and treatment of disorders of skin. -
- -
- DietNutrition - Diet and nutrition. -
- -
- Emergency - A specific branch of medical science that is deals with the evaluation and initial treatment of medical conditions caused by trauma or sudden illness. -
- -
- Endocrine - A specific branch of medical science that pertains to diagnosis and treatment of disorders of endocrine glands and their secretions. -
- -
- Gastroenterologic - A specific branch of medical science that pertains to diagnosis and treatment of disorders of digestive system. -
- -
- Genetic - A specific branch of medical science that pertains to hereditary transmission and the variation of inherited characteristics and disorders. -
- -
- Geriatric - A specific branch of medical science that is concerned with the diagnosis and treatment of diseases, debilities and provision of care to the aged. -
- -
- Gynecologic - A specific branch of medical science that pertains to the health care of women, particularly in the diagnosis and treatment of disorders affecting the female reproductive system. -
- -
- Hematologic - A specific branch of medical science that pertains to diagnosis and treatment of disorders of blood and blood producing organs. -
- -
- Infectious - A specific branch of medical science that pertains to diagnosis and treatment of bacterial, viral, fungal and parasitic infections. -
- -
- LaboratoryScience - Laboratory science. -
- -
- Midwifery - Midwifery. -
- -
- Musculoskeletal - A specific branch of medical science that pertains to diagnosis and treatment of disorders of muscles, ligaments and skeletal system. -
- -
- Neurologic - A specific branch of medical science that studies the nerves and nervous system and its respective disease states. -
- -
- Nursing - Nursing. -
- -
- Obstetric - A specific branch of medical science that specializes in the care of women during the prenatal and postnatal care and with the delivery of the child. -
- -
- OccupationalTherapy - Occupational therapy. -
- -
- Oncologic - A specific branch of medical science that deals with benign and malignant tumors, including the study of their development, diagnosis, treatment and prevention. -
- -
- Optometic - Optometry. -
- -
- Otolaryngologic - A specific branch of medical science that is concerned with the ear, nose and throat and their respective disease states. -
- -
- Pathology - A specific branch of medical science that is concerned with the study of the cause, origin and nature of a disease state, including its consequences as a result of manifestation of the disease. In clinical care, the term is used to designate a branch of medicine using laboratory tests to diagnose and determine the prognostic significance of illness. -
- -
- Pediatric - A specific branch of medical science that specializes in the care of infants, children and adolescents. -
- -
- PharmacySpecialty - Pharmacy. -
- -
- Physiotherapy - Physiotherapy. -
- -
- PlasticSurgery - A specific branch of medical science that pertains to therapeutic or cosmetic repair or re-formation of missing, injured or malformed tissues or body parts by manual and instrumental means. -
- -
- Podiatric - Podiatry. -
- -
- PrimaryCare - Primary care. -
- -
- Psychiatric - A specific branch of medical science that is concerned with the study, treatment, and prevention of mental illness, using both medical and psychological therapies. -
- -
- PublicHealth - Environment and public health. -
- -
- Pulmonary - A specific branch of medical science that pertains to the study of the respiratory system and its respective disease states. -
- -
- Radiograpy - Radiography. -
- -
- Renal - A specific branch of medical science that pertains to the study of the kidneys and its respective disease states. -
- -
- RespiratoryTherapy - Respiratory therapy. -
- -
- Rheumatologic - A specific branch of medical science that deals with the study and treatment of rheumatic, autoimmune or joint diseases. -
- -
- SpeechPathology - Speech pathology. -
- -
- Surgical - A specific branch of medical science that pertains to treating diseases, injuries and deformities by manual and instrumental means. -
- -
- Toxicologic - A specific branch of medical science that is concerned with poisons, their nature, effects and detection and involved in the treatment of poisoning. -
- -
- Urologic - A specific branch of medical science that is concerned with the diagnosis and treatment of diseases pertaining to the urinary tract and the urogenital system. -
- -
- MedicalStudyStatus - The status of a medical study. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- ActiveNotRecruiting - Active, but not recruiting new participants. -
- -
- Completed - Completed. -
- -
- EnrollingByInvitation - Enrolling participants by invitation only. -
- -
- NotYetRecruiting - Not yet recruiting. -
- -
- Recruiting - Recruiting participants. -
- -
- ResultsAvailable - Results are available. -
- -
- ResultsNotAvailable - Results are not available. -
- -
- Suspended - Suspended. -
- -
- Terminated - Terminated. -
- -
- Withdrawn - Withdrawn. -
- -
- MedicalSymptom - Any indication of the existence of a medical condition or disease that is apparent to the patient. - Subclass of: MedicalSignOrSymptom - Source: WikiDoc
- -
- MedicalTestPanel - Any collection of tests commonly ordered together. - Subclass of: MedicalTest - Source: WikiDoc
- -
- MedicalTrial - A medical trial is a type of medical study that uses scientific process used to compare the safety and efficacy of medical therapies or medical procedures. In general, medical trials are controlled and subjects are allocated at random to the different treatment and/or control groups. - Subclass of: MedicalStudy - Source: WikiDoc
- -
- MedicalTrialDesign - Design models for medical trials. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- DoubleBlindedTrial - A trial design in which neither the researcher nor the patient knows the details of the treatment the patient was randomly assigned to. -
- -
- InternationalTrial - An international trial. -
- -
- MultiCenterTrial - A trial that takes place at multiple centers. -
- -
- OpenTrial - A trial design in which the researcher knows the full details of the treatment, and so does the patient. -
- -
- PlaceboControlledTrial - A placebo-controlled trial design. -
- -
- RandomizedTrial - A randomized trial design. -
- -
- SingleBlindedTrial - A trial design in which the researcher knows which treatment the patient was randomly assigned to but the patient does not. -
- -
- SingleCenterTrial - A trial that takes place at a single center. -
- -
- TripleBlindedTrial - A trial design in which neither the researcher, the person administering the therapy nor the patient knows the details of the treatment the patient was randomly assigned to. -
- -
- MedicalWebPage - A web page that provides medical information. - Subclass of: WebPage -
- -
- MedicineSystem - Systems of medical practice. - Subclass of: MedicalEnumeration - Subclass of: Enumeration -
- -
- Ayurvedic - A system of medicine that originated in India over thousands of years and that focuses on integrating and balancing the body, mind, and spirit. -
- -
- Chiropractic - A system of medicine focused on the relationship between the body's structure, mainly the spine, and its functioning. -
- -
- Homeopathic - A system of medicine based on the principle that a disease can be cured by a substance that produces similar symptoms in healthy people. -
- -
- Osteopathic - A system of medicine focused on promoting the body's innate ability to heal itself. -
- -
- TraditionalChinese - A system of medicine based on common theoretical concepts that originated in China and evolved over thousands of years, that uses herbs, acupuncture, exercise, massage, dietary therapy, and other methods to treat a wide range of conditions. -
- -
- WesternConventional - The conventional Western system of medicine, that aims to apply the best available evidence gained from the scientific method to clinical decision making. Also known as conventional or Western medicine. -
- -
- MensClothingStore - A men's clothing store. - Subclass of: Store -
- -
- MiddleSchool - A middle school (typically for children aged around 11-14, although this varies somewhat). - Subclass of: EducationalOrganization -
- -
- SoftwareApplication - A software application. - Subclass of: CreativeWork -
- -
- MobileApplication - A software application designed specifically to work well on a mobile device such as a telephone. - Subclass of: SoftwareApplication -
- -
- MobilePhoneStore - A store that sells mobile phones and related accessories. - Subclass of: Store -
- -
- Mosque - A mosque. - Subclass of: PlaceOfWorship -
- -
- Motel - A motel. - Subclass of: LodgingBusiness -
- -
- MotorcycleDealer - A motorcycle dealer. - Subclass of: AutomotiveBusiness -
- -
- MotorcycleRepair - A motorcycle repair shop. - Subclass of: AutomotiveBusiness -
- -
- Mountain - A mountain, like Mount Whitney or Mount Everest - Subclass of: Landform -
- -
- Movie - A movie. - Subclass of: CreativeWork -
- -
- MovieRentalStore - A movie rental store. - Subclass of: Store -
- -
- MovieTheater - A movie theater. - Subclass of: CivicStructure - Subclass of: EntertainmentBusiness -
- -
- MovingCompany - A moving company. - Subclass of: HomeAndConstructionBusiness -
- -
- Muscle - A muscle is an anatomical structure consisting of a contractile form of tissue that animals use to effect movement. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- Museum - A museum. - Subclass of: CivicStructure -
- -
- MusicPlaylist - A collection of music tracks in playlist form. - Subclass of: CreativeWork -
- -
- MusicAlbum - A collection of music tracks. - Subclass of: MusicPlaylist -
- -
- MusicEvent - Event type: Music event. - Subclass of: Event -
- -
- MusicGroup - A musical group, such as a band, an orchestra, or a choir. Can also be a solo musician. - Subclass of: PerformingGroup -
- -
- MusicRecording - A music recording (track), usually a single song. - Subclass of: CreativeWork -
- -
- MusicStore - A music store. - Subclass of: Store -
- -
- MusicVenue - A music venue. - Subclass of: CivicStructure -
- -
- MusicVideoObject - A music video file. - Subclass of: MediaObject -
- -
- NGO - Organization: Non-governmental Organization. - Subclass of: Organization -
- -
- NailSalon - A nail salon. - Subclass of: HealthAndBeautyBusiness -
- -
- Nerve - A common pathway for the electrochemical nerve impulses that are transmitted along each of the axons. - Subclass of: AnatomicalStructure - Source: WikiDoc
- -
- NewsArticle - A news article - Subclass of: Article - Source: rNews
- -
- NightClub - A nightclub or discotheque. - Subclass of: EntertainmentBusiness -
- -
- Notary - A notary. - Subclass of: ProfessionalService -
- -
- NutritionInformation - Nutritional information about the recipe. - Subclass of: StructuredValue -
- -
- OceanBodyOfWater - An ocean (for example, the Pacific). - Subclass of: BodyOfWater -
- -
- OfferItemCondition - A list of possible conditions for the item. - Subclass of: Enumeration -
- -
- DamagedCondition - Indicates that the item is damaged. -
- -
- NewCondition - Indicates that the item is new. -
- -
- RefurbishedCondition - Indicates that the item is refurbished. -
- -
- UsedCondition - Indicates that the item is used. -
- -
- OfficeEquipmentStore - An office equipment store. - Subclass of: Store -
- -
- Optician - A store that sells reading glasses and similar devices for improving vision. - Subclass of: MedicalOrganization -
- -
- OutletStore - An outlet store. - Subclass of: Store -
- -
- Painting - A painting. - Subclass of: CreativeWork -
- -
- PalliativeProcedure - A medical procedure intended primarily for palliative purposes, aimed at relieving the symptoms of an underlying health condition. - Subclass of: MedicalProcedure - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- Park - A park. - Subclass of: CivicStructure -
- -
- ParkingFacility - A parking lot or other parking facility. - Subclass of: CivicStructure -
- -
- PathologyTest - A medical test performed by a laboratory that typically involves examination of a tissue sample by a pathologist. - Subclass of: MedicalTest - Source: WikiDoc
- -
- PawnShop - A shop that will buy, or lend money against the security of, personal possessions. - Subclass of: Store -
- -
- PerformingArtsTheater - A theater or other performing art center. - Subclass of: CivicStructure -
- -
- Person - A person (alive, dead, undead, or fictional). - Subclass of: Thing - - Source: rNews
- -
- PetStore - A pet store. - Subclass of: Store -
- -
- Pharmacy - A pharmacy or drugstore. - Subclass of: MedicalOrganization -
- -
- Photograph - A photograph. - Subclass of: CreativeWork -
- -
- PhysicalActivityCategory - Categories of physical activity, organized by physiologic classification. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - - Source: WikiDoc
- -
- AerobicActivity - Physical activity of relatively low intensity that depends primarily on the aerobic energy-generating process; during activity, the aerobic metabolism uses oxygen to adequately meet energy demands during exercise. -
- -
- AnaerobicActivity - Physical activity that is of high-intensity which utilizes the anaerobic metabolism of the body. -
- -
- Balance - Physical activity that is engaged to help maintain posture and balance. -
- -
- Flexibility - Physical activity that is engaged in to improve joint and muscle flexibility. -
- -
- LeisureTimeActivity - Any physical activity engaged in for recreational purposes. Examples may include ballroom dancing, roller skating, canoeing, fishing, etc. -
- -
- OccupationalActivity - Any physical activity engaged in for job-related purposes. Examples may include waiting tables, maid service, carrying a mailbag, picking fruits or vegetables, construction work, etc. -
- -
- StrengthTraining - Physical activity that is engaged in to improve muscle and bone strength. Also referred to as resistance training. -
- -
- PhysicalExam - A type of physical examination of a patient performed by a physician. Enumerated type. - Subclass of: MedicalEnumeration - Subclass of: Enumeration - Source: WikiDoc
- -
- Abdomen - Abdomen -
- -
- Appearance - Appearance -
- -
- CardiovascularExam - Cardiovascular -
- -
- Ear - Ear -
- -
- Eye - Eye -
- -
- Genitourinary - Genitourinary -
- -
- Head - Head -
- -
- Lung - Lung -
- -
- MusculoskeletalExam - Musculoskeletal -
- -
- Neck - Neck -
- -
- Neuro - Neuro -
- -
- Nose - Nose -
- -
- Skin - Skin -
- -
- Throat - Throat -
- -
- VitalSign - VitalSign -
- -
- PhysicalTherapy - A process of progressive physical care and rehabilitation aimed at improving a health condition. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- Physician - A doctor's office. - Subclass of: MedicalOrganization -
- -
- Playground - A playground. - Subclass of: CivicStructure -
- -
- Plumber - A plumbing service. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- PoliceStation - A police station. - Subclass of: CivicStructure - Subclass of: EmergencyService -
- -
- Pond - A pond - Subclass of: BodyOfWater -
- -
- PostOffice - A post office. - Subclass of: GovernmentOffice -
- -
- PostalAddress - The mailing address. - Subclass of: ContactPoint -
- -
- Preschool - A preschool. - Subclass of: EducationalOrganization -
- -
- PreventionIndication - An indication for preventing an underlying condition, symptom, etc. - Subclass of: MedicalIndication - Source: WikiDoc
- -
- Product - Any offered product or service. For example: a pair of shoes; a concert ticket; the rental of a car; a haircut; or an episode of a TV show streamed online. - Subclass of: Thing - Source: GoodRelationsProperties
- -
- ProfilePage - Web page type: Profile page. - Subclass of: WebPage -
- -
- PsychologicalTreatment - A process of care relying upon counseling, dialogue, communication, verbalization aimed at improving a mental health condition. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- PublicSwimmingPool - A public swimming pool. - Subclass of: SportsActivityLocation -
- -
- RVPark - A place offering space for "Recreational Vehicles", Caravans, mobile homes and the like. - Subclass of: CivicStructure -
- -
- RadiationTherapy - A process of care using radiation aimed at improving a health condition. - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- RadioStation - A radio station. - Subclass of: LocalBusiness -
- -
- RealEstateAgent - A real-estate agent. - Subclass of: LocalBusiness -
- -
- Recipe - A recipe. - Subclass of: CreativeWork -
- -
- RecommendedDoseSchedule - A recommended dosing schedule for a drug or supplement as prescribed or recommended by an authority or by the drug/supplement's manufacturer. Capture the recommending authority in the recognizingAuthority property of MedicalEntity. - Subclass of: DoseSchedule -
- -
- RecyclingCenter - A recycling center. - Subclass of: LocalBusiness -
- -
- ReportedDoseSchedule - A patient-reported or observed dosing schedule for a drug or supplement. - Subclass of: DoseSchedule -
- -
- Reservoir - A reservoir of water, typically an artificially created lake, like the Lake Kariba reservoir. - Subclass of: BodyOfWater -
- -
- Restaurant - A restaurant. - Subclass of: FoodEstablishment -
- -
- Review - A review of an item - for example, of a restaurant, movie, or store. - Subclass of: CreativeWork -
- -
- RiverBodyOfWater - A river (for example, the broad majestic Shannon). - Subclass of: BodyOfWater -
- -
- RoofingContractor - A roofing contractor. - Subclass of: HomeAndConstructionBusiness - Subclass of: ProfessionalService -
- -
- SaleEvent - Event type: Sales event. - Subclass of: Event -
- -
- School - A school. - Subclass of: EducationalOrganization -
- -
- Sculpture - A piece of sculpture. - Subclass of: CreativeWork -
- -
- SeaBodyOfWater - A sea (for example, the Caspian sea). - Subclass of: BodyOfWater -
- -
- SearchResultsPage - Web page type: Search results page. - Subclass of: WebPage -
- -
- SelfStorage - A self-storage facility. - Subclass of: LocalBusiness -
- -
- ShoeStore - A shoe store. - Subclass of: Store -
- -
- ShoppingCenter - A shopping center or mall. - Subclass of: LocalBusiness -
- -
- SingleFamilyResidence - Residence type: Single-family home. - Subclass of: Residence -
- -
- WebPageElement - A web page element, like a table or an image - Subclass of: CreativeWork -
- -
- SiteNavigationElement - A navigation element of the page. - Subclass of: WebPageElement -
- -
- SkiResort - A ski resort. - Subclass of: SportsActivityLocation -
- -
- SocialEvent - Event type: Social event. - Subclass of: Event -
- -
- SportingGoodsStore - A sporting goods store. - Subclass of: Store -
- -
- SportsClub - A sports club. - Subclass of: SportsActivityLocation -
- -
- SportsEvent - Event type: Sports event. - Subclass of: Event -
- -
- SportsTeam - Organization: Sports team. - Subclass of: Organization -
- -
- StadiumOrArena - A stadium. - Subclass of: CivicStructure - Subclass of: SportsActivityLocation -
- -
- State - A state or province of a country. - Subclass of: AdministrativeArea -
- -
- SubwayStation - A subway station. - Subclass of: CivicStructure -
- -
- SuperficialAnatomy - Anatomical features that can be observed by sight (without dissection), including the form and proportions of the human body as well as surface landmarks that correspond to deeper subcutaneous structures. Superficial anatomy plays an important role in sports medicine, phlebotomy, and other medical specialties as underlying anatomical structures can be identified through surface palpation. For example, during back surgery, superficial anatomy can be used to palpate and count vertebrae to find the site of incision. Or in phlebotomy, superficial anatomy can be used to locate an underlying vein; for example, the median cubital vein can be located by palpating the borders of the cubital fossa (such as the epicondyles of the humerus) and then looking for the superficial signs of the vein, such as size, prominence, ability to refill after depression, and feel of surrounding tissue support. As another example, in a subluxation (dislocation) of the glenohumeral joint, the bony structure becomes pronounced with the deltoid muscle failing to cover the glenohumeral joint allowing the edges of the scapula to be superficially visible. Here, the superficial anatomy is the visible edges of the scapula, implying the underlying dislocation of the joint (the related anatomical structure). - Subclass of: MedicalEntity - Source: WikiDoc
- -
- Synagogue - A synagogue. - Subclass of: PlaceOfWorship -
- -
- Episode - A TV or radio episode which can be part of a series or season. - Subclass of: CreativeWork -
- -
- TVEpisode - A TV episode which can be part of a series or season. - Subclass of: Episode -
- -
- Season - A TV or radio season. - Subclass of: CreativeWork -
- -
- TVSeason - Season dedicated to TV broadcast and associated online delivery. - Subclass of: CreativeWork - Subclass of: Season -
- -
- Series - A TV or radio series. - Subclass of: CreativeWork -
- -
- TVSeries - Series dedicated to TV broadcast and associated online delivery. - Subclass of: CreativeWork - Subclass of: Series -
- -
- Table - A table on a Web page. - Subclass of: WebPageElement -
- -
- TattooParlor - A tattoo parlor. - Subclass of: HealthAndBeautyBusiness -
- -
- TaxiStand - A taxi stand. - Subclass of: CivicStructure -
- -
- TelevisionStation - A television station. - Subclass of: LocalBusiness -
- -
- TennisComplex - A tennis complex. - Subclass of: SportsActivityLocation -
- -
- Text - Data type: Text. - Subclass of: DataType -
- -
- TheaterEvent - Event type: Theater performance. - Subclass of: Event -
- -
- TheaterGroup - A theater group or company, for example, the Royal Shakespeare Company or Druid Theatre. - Subclass of: PerformingGroup -
- -
- TherapeuticProcedure - A medical procedure intended primarily for therapeutic purposes, aimed at improving a health condition. - Subclass of: MedicalProcedure - Subclass of: MedicalTherapy - Source: WikiDoc
- -
- Time - A point in time recurring on multiple days in the form hh:mm:ss[Z|(+|-)hh:mm] (see <a href="http://www.w3.org/TR/xmlschema-2/#time">XML schema for details</a>). - Subclass of: DataType -
- -
- TireShop - A tire shop. - Subclass of: Store -
- -
- TouristAttraction - A tourist attraction. - Subclass of: Place -
- -
- TouristInformationCenter - A tourist information center. - Subclass of: LocalBusiness -
- -
- ToyStore - A toy store. - Subclass of: Store -
- -
- TrainStation - A train station. - Subclass of: CivicStructure -
- -
- TravelAgency - A travel agency. - Subclass of: LocalBusiness -
- -
- TreatmentIndication - An indication for treating an underlying condition, symptom, etc. - Subclass of: MedicalIndication - Source: WikiDoc
- -
- URL - Data type: URL. - Subclass of: Text -
- -
- UserInteraction - A user interacting with a page - Subclass of: Event -
- -
- UserBlocks - User interaction: Block this content. - Subclass of: UserInteraction -
- -
- UserCheckins - User interaction: Check-in at a place. - Subclass of: UserInteraction -
- -
- UserComments - The UserInteraction event in which a user comments on an item. - Subclass of: UserInteraction - Source: rNews
- -
- UserDownloads - User interaction: Download of an item. - Subclass of: UserInteraction -
- -
- UserLikes - User interaction: Like an item. - Subclass of: UserInteraction -
- -
- UserPageVisits - User interaction: Visit to a web page. - Subclass of: UserInteraction -
- -
- UserPlays - User interaction: Play count of an item, for example a video or a song. - Subclass of: UserInteraction -
- -
- UserPlusOnes - User interaction: +1. - Subclass of: UserInteraction -
- -
- UserTweets - User interaction: Tweets. - Subclass of: UserInteraction -
- -
- Vein - A type of blood vessel that specifically carries blood to the heart. - Subclass of: Vessel - Source: WikiDoc
- -
- VeterinaryCare - A vet's office. - Subclass of: MedicalOrganization -
- -
- VideoGallery - Web page type: Video gallery page. - Subclass of: CollectionPage -
- -
- VideoObject - A video file. - Subclass of: MediaObject - Source: rNews
- -
- VisualArtsEvent - Event type: Visual arts event. - Subclass of: Event -
- -
- Volcano - A volcano, like Fuji san. - Subclass of: Landform -
- -
- WPAdBlock - An advertising section of the page. - Subclass of: WebPageElement -
- -
- WPFooter - The footer section of the page. - Subclass of: WebPageElement -
- -
- WPHeader - The header section of the page. - Subclass of: WebPageElement -
- -
- WPSideBar - A sidebar section of the page. - Subclass of: WebPageElement -
- -
- Waterfall - A waterfall, like Niagara - Subclass of: BodyOfWater -
- -
- WebApplication - Web applications. - Subclass of: SoftwareApplication -
- -
- WholesaleStore - A wholesale store. - Subclass of: Store -
- -
- Winery - A winery. - Subclass of: FoodEstablishment -
- -
- Zoo - A zoo. - Subclass of: CivicStructure -
- -
- Brand - A brand is a name used by an organization or business person for labeling a product, product group, or similar. - Subclass of: Intangible - Source: GoodRelationsClass
- -
- BusinessEntityType - A business entity type is a conceptual entity representing the legal form, the size, the main line of business, the position in the value chain, or any combination thereof, of an organization or business person. - - Commonly used values: - - http://purl.org/goodrelations/v1#Business - http://purl.org/goodrelations/v1#Enduser - http://purl.org/goodrelations/v1#PublicInstitution - http://purl.org/goodrelations/v1#Reseller - - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- BusinessFunction - The business function specifies the type of activity or access (i.e., the bundle of rights) offered by the organization or business person through the offer. Typical are sell, rental or lease, maintenance or repair, manufacture / produce, recycle / dispose, engineering / construction, or installation. Proprietary specifications of access rights are also instances of this class. - - Commonly used values: - - http://purl.org/goodrelations/v1#ConstructionInstallation - http://purl.org/goodrelations/v1#Dispose - http://purl.org/goodrelations/v1#LeaseOut - http://purl.org/goodrelations/v1#Maintain - http://purl.org/goodrelations/v1#ProvideService - http://purl.org/goodrelations/v1#Repair - http://purl.org/goodrelations/v1#Sell - http://purl.org/goodrelations/v1#Buy - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- PaymentMethod - A payment method is a standardized procedure for transferring the monetary amount for a purchase. Payment methods are characterized by the legal and technical structures used, and by the organization or group carrying out the transaction. - - Commonly used values: - - http://purl.org/goodrelations/v1#ByBankTransferInAdvance - http://purl.org/goodrelations/v1#ByInvoice - http://purl.org/goodrelations/v1#Cash - http://purl.org/goodrelations/v1#CheckInAdvance - http://purl.org/goodrelations/v1#COD - http://purl.org/goodrelations/v1#DirectDebit - http://purl.org/goodrelations/v1#GoogleCheckout - http://purl.org/goodrelations/v1#PayPal - http://purl.org/goodrelations/v1#PaySwarm - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- CreditCard - A credit or debit card type as a standardized procedure for transferring the monetary amount for a purchase. - - Commonly used values: - - http://purl.org/goodrelations/v1#AmericanExpress - http://purl.org/goodrelations/v1#DinersClub - http://purl.org/goodrelations/v1#Discover - http://purl.org/goodrelations/v1#JCB - http://purl.org/goodrelations/v1#MasterCard - http://purl.org/goodrelations/v1#VISA - - Subclass of: PaymentMethod - Source: GoodRelationsClass
- -
- DayOfWeek - The day of the week, e.g. used to specify to which day the opening hours of an OpeningHoursSpecification refer. - - Commonly used values: - - http://purl.org/goodrelations/v1#Monday - http://purl.org/goodrelations/v1#Tuesday - http://purl.org/goodrelations/v1#Wednesday - http://purl.org/goodrelations/v1#Thursday - http://purl.org/goodrelations/v1#Friday - http://purl.org/goodrelations/v1#Saturday - http://purl.org/goodrelations/v1#Sunday - http://purl.org/goodrelations/v1#PublicHolidays - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- PriceSpecification - A structured value representing a monetary amount. Typically, only the subclasses of this type are used for markup. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- DeliveryChargeSpecification - The price for the delivery of an offer using a particular delivery method. - Subclass of: PriceSpecification - Source: GoodRelationsClass
- -
- DeliveryMethod - A delivery method is a standardized procedure for transferring the product or service to the destination of fulfillment chosen by the customer. Delivery methods are characterized by the means of transportation used, and by the organization or group that is the contracting party for the sending organization or person. - - Commonly used values: - - http://purl.org/goodrelations/v1#DeliveryModeDirectDownload - http://purl.org/goodrelations/v1#DeliveryModeFreight - http://purl.org/goodrelations/v1#DeliveryModeMail - http://purl.org/goodrelations/v1#DeliveryModeOwnFleet - http://purl.org/goodrelations/v1#DeliveryModePickUp - http://purl.org/goodrelations/v1#DHL - http://purl.org/goodrelations/v1#FederalExpress - http://purl.org/goodrelations/v1#UPS - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- Demand - A demand entity represents the public, not necessarily binding, not necessarily exclusive, announcement by an organization or person to seek a certain type of goods or services. For describing demand using this type, the very same properties used for Offer apply. - Subclass of: Intangible - Source: GoodRelationsClass
- -
- IndividualProduct - A single, identifiable product instance (e.g. a laptop with a particular serial number). - Subclass of: Product - Source: GoodRelationsClass
- -
- OpeningHoursSpecification - A structured value providing information about the opening hours of a place or a certain service inside a place. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- OwnershipInfo - A structured value providing information about when a certain organization or person owned a certain product. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- ParcelService - A private parcel service as the delivery mode available for a certain offer. - - Commonly used values: - - http://purl.org/goodrelations/v1#DHL - http://purl.org/goodrelations/v1#FederalExpress - http://purl.org/goodrelations/v1#UPS - - Subclass of: DeliveryMethod - Source: GoodRelationsClass
- -
- PaymentChargeSpecification - The costs of settling the payment using a particular payment method. - Subclass of: PriceSpecification - Source: GoodRelationsClass
- -
- ProductModel - A datasheet or vendor specification of a product (in the sense of a prototypical description). - Subclass of: Product - Source: GoodRelationsClass
- -
- QualitativeValue - A predefined value for a product characteristic, e.g. the the power cord plug type "US" or the garment sizes "S", "M", "L", and "XL" - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- QuantitativeValue - A point value or interval for product characteristics and other purposes. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- SomeProducts - A placeholder for multiple similar products of the same kind. - Subclass of: Product - Source: GoodRelationsClass
- -
- TypeAndQuantityNode - A structured value indicating the quantity, unit of measurement, and business function of goods included in a bundle offer. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- UnitPriceSpecification - The price asked for a given offer by the respective organization or person. - Subclass of: PriceSpecification - Source: GoodRelationsClass
- -
- WarrantyPromise - A structured value representing the duration and scope of services that will be provided to a customer free of charge in case of a defect or malfunction of a product. - Subclass of: StructuredValue - Source: GoodRelationsClass
- -
- WarrantyScope - A range of of services that will be provided to a customer free of charge in case of a defect or malfunction of a product. - - Commonly used values: - - http://purl.org/goodrelations/v1#Labor-BringIn - http://purl.org/goodrelations/v1#PartsAndLabor-BringIn - http://purl.org/goodrelations/v1#PartsAndLabor-PickUp - - Subclass of: Enumeration - Source: GoodRelationsClass
- -
- TechArticle - A technical article - Example: How-to (task) topics, step-by-step, procedural troubleshooting, specifications, etc. - Subclass of: Article -
- -
- APIReference - Reference documentation for application programming interfaces (APIs). - Subclass of: TechArticle -
- -
- Code - Computer programming source code. Example: Full (compile ready) solutions, code snippet samples, scripts, templates. - Subclass of: CreativeWork -
- -
- ParentAudience - A set of characteristics describing parents, who can be interested in viewing some content - Subclass of: PeopleAudience -
- -
- AlignmentObject - An intangible item that describes an alignment between a learning resource and a node in an educational framework. - Subclass of: Intangible - Source: LRMIClass
- -
- EducationalAudience - An EducationalAudience - Subclass of: Audience - Source: LRMIClass
- -
- DataCatalog - A collection of datasets. - Subclass of: CreativeWork - Source: DatasetClass - -
- -
- DataDownload - A dataset in downloadable form. - Subclass of: MediaObject - Source: DatasetClass - -
- -
- Dataset - A body of structured information describing some topic(s) of interest. - Subclass of: CreativeWork - Source: DatasetClass - - - -
- -
- Class - A class, also often called a 'Type'; equivalent to rdfs:Class. - Subclass of: Intangible -
- -
- Property - A property, used to indicate attributes and relationships of some Thing; equivalent to rdf:Property. - Subclass of: Intangible -
- -
- PublicationEvent - A PublicationEvent corresponds indifferently to the event of publication for a CreativeWork of any type e.g. a broadcast event, an on-demand event, a book/journal publication via a variety of delivery media. - Subclass of: Event -
- -
- BroadcastEvent - An over the air or online broadcast event. - Subclass of: PublicationEvent -
- -
- BroadcastService - A delivery service through which content is provided via broadcast over the air or online. - Subclass of: Thing -
- -
- Clip - A short TV or radio program or a segment/part of a program. - Subclass of: CreativeWork -
- -
- OnDemandEvent - A publication event e.g. catch-up TV or radio podcast, during which a program is available on-demand. - Subclass of: PublicationEvent -
- -
- RadioClip - A short radio program or a segment/part of a radio program. - Subclass of: Clip -
- -
- RadioEpisode - A radio episode which can be part of a series or season. - Subclass of: Episode -
- -
- RadioSeason - Season dedicated to radio broadcast and associated online delivery. - Subclass of: Season -
- -
- RadioSeries - Series dedicated to radio broadcast and associated online delivery. - Subclass of: Series -
- -
- TVClip - A short TV program or a segment/part of a TV program. - Subclass of: Clip -
- -
- BusinessAudience - A set of characteristics belonging to businesses, e.g. who compose an item's target audience. - Subclass of: Audience -
- -
- ContactPointOption - Enumerated options related to a ContactPoint - Subclass of: Enumeration -
- -
- HearingImpairedSupported - Uses devices to support users with hearing impairments. -
- -
- TollFree - The associated telephone number is toll free. -
- -
- Permit - A permit issued by an organization, e.g. a parking pass. - Subclass of: Intangible -
- -
- GovernmentPermit - A permit issued by a government agency. - Subclass of: Permit -
- -
- Service - A service provided by an organization, e.g. delivery service, print services, etc. - Subclass of: Intangible -
- -
- GovernmentService - A service provided by a government organization, e.g. food stamps, veterans benefits, etc. - Subclass of: Service -
- -
- ServiceChannel - A means for accessing a service, e.g. a government office location, web site, or phone number. - Subclass of: Intangible -
- -
- EventStatusType - EventStatusType is an enumeration type whose instances represent several states that an Event may be in. - Subclass of: Enumeration -
- -
- EventCancelled - The event has been cancelled. If the event has multiple startDate values, all are assumed to be cancelled. Either startDate or previousStartDate may be used to specify the event's cancelled date(s). -
- -
- EventPostponed - The event has been postponed and no new date has been set. The event's previousStartDate should be set. -
- -
- EventRescheduled - The event has been rescheduled. The event's previousStartDate should be set to the old date and the startDate should be set to the event's new date. (If the event has been rescheduled multiple times, the previousStartDate property may be repeated.) -
- -
- EventScheduled - The event is taking place or has taken place on the startDate as scheduled. Use of this value is optional, as it is assumed by default. -
- -
- DeliveryEvent - An event involving the delivery of an item. - Subclass of: Event -
- -
- LockerDelivery - A DeliveryMethod in which an item is made available via locker. - Subclass of: DeliveryMethod -
- -
- OnSitePickup - A DeliveryMethod in which an item is collected on site, e.g. in a store or at a box office. - -
- -
- Order - An order is a confirmation of a transaction (a receipt), which can contain multiple line items, each represented by an Offer that has been accepted by the customer. - Subclass of: Intangible -
- -
- OrderStatus - Enumerated status values for Order. - Subclass of: Enumeration -
- -
- OrderCancelled - OrderStatus representing cancellation of an order. -
- -
- OrderDelivered - OrderStatus representing successful delivery of an order. -
- -
- OrderInTransit - OrderStatus representing that an order is in transit. -
- -
- OrderPaymentDue - OrderStatus representing that payment is due on an order. -
- -
- OrderPickupAvailable - OrderStatus representing availability of an order for pickup. -
- -
- OrderProblem - OrderStatus representing that there is a problem with the order. -
- -
- OrderProcessing - OrderStatus representing that an order is being processed. -
- -
- OrderReturned - OrderStatus representing that an order has been returned. -
- -
- ParcelDelivery - The delivery of a parcel either via the postal service or a commercial service. - Subclass of: Intangible -
- -
- Action - An action performed by a direct agent and indirect participants upon a direct object. Optionally happens at a location with the help of an inanimate instrument. The execution of the action may produce a result. Specific action sub-type documentation specifies the exact expectation of each argument/role. - Subclass of: Thing - Source: Action collaborations -
- -
- OrganizeAction - The act of manipulating/administering/supervising/controlling one or more objects. - Subclass of: Action -
- -
- AllocateAction - The act of organizing tasks/objects/events by associating resources to it. - Subclass of: OrganizeAction -
- -
- AcceptAction - The act of committing to/adopting an object.<p>Related actions:</p><ul><li><a href="http://schema.org/RejectAction">RejectAction</a>: The antagonym of AcceptAction.</li></ul> - Subclass of: AllocateAction -
- -
- AchieveAction - The act of accomplishing something via previous efforts. It is an instantaneous action rather than an ongoing process. - Subclass of: Action -
- -
- UpdateAction - The act of managing by changing/editing the state of the object. - Subclass of: Action -
- -
- AddAction - The act of editing by adding an object to a collection. - Subclass of: UpdateAction -
- -
- AssessAction - The act of forming one's opinion, reaction or sentiment. - Subclass of: Action -
- -
- ReactAction - The act of responding instinctively and emotionally to an object, expressing a sentiment. - Subclass of: AssessAction -
- -
- AgreeAction - The act of expressing a consistency of opinion with the object. An agent agrees to/about an object (a proposition, topic or theme) with participants. - Subclass of: ReactAction -
- -
- InsertAction - The act of adding at a specific location in an ordered collection. - Subclass of: AddAction -
- -
- AppendAction - The act of inserting at the end if an ordered collection. - Subclass of: InsertAction -
- -
- ApplyAction - The act of registering to an organization/service without the guarantee to receive it. NOTE(goto): should this be under InteractAction instead?<p>Related actions:</p><ul><li><a href="http://schema.org/RegisterAction">RegisterAction</a>: Unlike RegisterAction, ApplyAction has no guarantees that the application will be accepted.</li></ul> - Subclass of: OrganizeAction -
- -
- MoveAction - The act of an agent relocating to a place.<p>Related actions:</p><ul><li><a href="http://schema.org/TransferAction">TransferAction</a>: Unlike TransferAction, the subject of the move is a living Person or Organization rather than an inanimate object.</li></ul> - Subclass of: Action -
- -
- ArriveAction - The act of arriving at a place. An agent arrives at a destination from an fromLocation, optionally with participants. - Subclass of: MoveAction -
- -
- InteractAction - The act of interacting with another person or organization. - Subclass of: Action -
- -
- CommunicateAction - The act of conveying information to another person via a communication medium (instrument) such as speech, email, or telephone conversation. - Subclass of: InteractAction -
- -
- AskAction - The act of posing a question / favor to someone.<p>Related actions:</p><ul><li><a href="http://schema.org/ReplyAction">ReplyAction</a>: Appears generally as a response to AskAction.</li></ul> - Subclass of: CommunicateAction -
- -
- AssignAction - The act of allocating an action/event/task to some destination (someone or something). - Subclass of: AllocateAction -
- -
- AuthorizeAction - The act of granting permission to an object. - Subclass of: AllocateAction -
- -
- BefriendAction - The act of forming a personal connection with someone (object) mutually/bidirectionally/symmetrically.<p>Related actions:</p><ul><li><a href="http://schema.org/FollowAction">FollowAction</a>: Unlike FollowAction, BefriendAction implies that the connection is reciprocal.</li></ul> - Subclass of: InteractAction -
- -
- BookmarkAction - An agent bookmarks/flags/labels/tags/marks an object. - Subclass of: OrganizeAction -
- -
- TransferAction - The act of transferring/moving (abstract or concrete) animate or inanimate objects from one place to another. - Subclass of: Action -
- -
- BorrowAction - The act of obtaining an object under an agreement to return it at a later date. Reciprocal of LendAction.<p>Related actions:</p><ul><li><a href="http://schema.org/LendAction">LendAction</a>: Reciprocal of BorrowAction.</li></ul> - Subclass of: TransferAction -
- -
- TradeAction - The act of participating in an exchange of goods and services for monetary compensation. An agent trades an object, product or service with a participant in exchange for a one time or periodic payment. - Subclass of: Action -
- -
- BuyAction - The act of giving money to a seller in exchange for goods or services rendered. An agent buys an object, product, or service from a seller for a price. Reciprocal of SellAction. - Subclass of: TradeAction -
- -
- PlanAction - The act of planning the execution of an event/task/action/reservation/plan to a future date. - Subclass of: OrganizeAction -
- -
- CancelAction - The act of asserting that a future event/action is no longer going to happen.<p>Related actions:</p><ul><li><a href="http://schema.org/ConfirmAction">ConfirmAction</a>: The antagonym of CancelAction.</li></ul> - Subclass of: PlanAction -
- -
- FindAction - The act of finding an object.<p>Related actions:</p><ul><li><a href="http://schema.org/SearchAction">SearchAction</a>: FindAction is generally lead by a SearchAction, but not necessarily.</li></ul> - Subclass of: Action -
- -
- CheckAction - An agent inspects/determines/investigates/inquire or examine an object's accuracy/quality/condition or state. - Subclass of: FindAction -
- -
- CheckInAction - The act of an agent communicating (service provider, social media, etc) their arrival by registering/confirming for a previously reserved service (e.g. flight check in) or at a place (e.g. hotel), possibly resulting in a result (boarding pass, etc).<p>Related actions:</p><ul><li><a href="http://schema.org/CheckOutAction">CheckOutAction</a>: The antagonym of CheckInAction.</li><li><a href="http://schema.org/ArriveAction">ArriveAction</a>: Unlike ArriveAction, CheckInAction implies that the agent is informing/confirming the start of a previously reserved service.</li><li><a href="http://schema.org/ConfirmAction">ConfirmAction</a>: Unlike ConfirmAction, CheckInAction implies that the agent is informing/confirming the *start* of a previously reserved service rather than its validity/existence.</li></ul> - Subclass of: CommunicateAction -
- -
- CheckOutAction - The act of an agent communicating (service provider, social media, etc) their departure of a previously reserved service (e.g. flight check in) or place (e.g. hotel).<p>Related actions:</p><ul><li><a href="http://schema.org/CheckInAction">CheckInAction</a>: The antagonym of CheckOutAction.</li><li><a href="http://schema.org/DepartAction">DepartAction</a>: Unlike DepartAction, CheckOutAction implies that the agent is informing/confirming the end of a previously reserved service.</li><li><a href="http://schema.org/CancelAction">CancelAction</a>: Unlike CancelAction, CheckOutAction implies that the agent is informing/confirming the end of a previously reserved service.</li></ul> - Subclass of: CommunicateAction -
- -
- ChooseAction - The act of expressing a preference from a set of options or a large or unbounded set of choices/options. - Subclass of: AssessAction -
- -
- CommentAction - The act of generating a comment about a subject. - Subclass of: CommunicateAction -
- -
- InformAction - The act of notifying someone of information pertinent to them, with no expectation of a response. - Subclass of: CommunicateAction -
- -
- ConfirmAction - The act of notifying someone that a future event/action is going to happen as expected.<p>Related actions:</p><ul><li><a href="http://schema.org/CancelAction">CancelAction</a>: The antagonym of ConfirmAction.</li></ul> - Subclass of: InformAction -
- -
- ConsumeAction - The act of ingesting information/resources/food. - Subclass of: Action -
- -
- CreateAction - The act of deliberately creating/producing/generating/building a result out of the agent. - Subclass of: Action -
- -
- CookAction - The act of producing/preparing food. - Subclass of: CreateAction -
- -
- DeleteAction - The act of editing a recipient by removing one of its objects. - Subclass of: UpdateAction -
- -
- DepartAction - The act of departing from a place. An agent departs from an fromLocation for a destination, optionally with participants. - Subclass of: MoveAction -
- -
- DisagreeAction - The act of expressing a difference of opinion with the object. An agent disagrees to/about an object (a proposition, topic or theme) with participants. - Subclass of: ReactAction -
- -
- DiscoverAction - The act of discovering/finding an object. - Subclass of: FindAction -
- -
- DislikeAction - The act of expressing a negative sentiment about the object. An agent dislikes an object (a proposition, topic or theme) with participants. - Subclass of: ReactAction -
- -
- DonateAction - The act of providing goods, services, or money without compensation, often for philanthropic reasons. - Subclass of: TradeAction -
- -
- DownloadAction - The act of downloading an object. - Subclass of: TransferAction -
- -
- DrawAction - The act of producing a visual/graphical representation of an object, typically with a pen/pencil and paper as instruments. - Subclass of: CreateAction -
- -
- DrinkAction - The act of swallowing liquids. - Subclass of: ConsumeAction -
- -
- EatAction - The act of swallowing solid objects. - Subclass of: ConsumeAction -
- -
- EndorseAction - An agent approves/certifies/likes/supports/sanction an object. - Subclass of: ReactAction -
- -
- PlayAction - The act of playing/exercising/training/performing for enjoyment, leisure, recreation, Competition or exercise.<p>Related actions:</p><ul><li><a href="http://schema.org/ListenAction">ListenAction</a>: Unlike ListenAction (which is under ConsumeAction), PlayAction refers to performing for an audience or at an event, rather than consuming music.</li><li><a href="http://schema.org/WatchAction">WatchAction</a>: Unlike WatchAction (which is under ConsumeAction), PlayAction refers to showing/displaying for an audience or at an event, rather than consuming visual content.</li></ul> - Subclass of: Action -
- -
- ExerciseAction - The act of participating in exertive activity for the purposes of improving health and fitness - Subclass of: PlayAction -
- -
- FilmAction - The act of capturing sound and moving images on film, video, or digitally. - Subclass of: CreateAction -
- -
- FollowAction - The act of forming a personal connection with someone/something (object) unidirectionally/asymmetrically to get updates polled from.<p>Related actions:</p><ul><li><a href="http://schema.org/BefriendAction">BefriendAction</a>: Unlike BefriendAction, FollowAction implies that the connection is *not* necessarily reciprocal.</li><li><a href="http://schema.org/SubscribeAction">SubscribeAction</a>: Unlike SubscribeAction, FollowAction implies that the follower acts as an active agent constantly/actively polling for updates.</li><li><a href="http://schema.org/RegisterAction">RegisterAction</a>: Unlike RegisterAction, FollowAction implies that the agent is interested in continuing receiving updates from the object.</li><li><a href="http://schema.org/JoinAction">JoinAction</a>: Unlike JoinAction, FollowAction implies that the agent is interested in getting updates from the object.</li><li><a href="http://schema.org/TrackAction">TrackAction</a>: Unlike TrackAction, FollowAction refers to the polling of updates of all aspects of animate objects rather than the location of inanimate objects (e.g. you track a package, but you don't follow it).</li></ul> - Subclass of: InteractAction -
- -
- GiveAction - The act of transferring ownership of an object to a destination. Reciprocal of TakeAction.<p>Related actions:</p><ul><li><a href="http://schema.org/TakeAction">TakeAction</a>: Reciprocal of GiveAction.</li><li><a href="http://schema.org/SendAction">SendAction</a>: Unlike SendAction, GiveAction implies that ownership is being transferred (e.g. I may send my laptop to you, but that doesn't mean I'm giving it to you).</li></ul> - Subclass of: TransferAction -
- -
- IgnoreAction - The act of intentionally disregarding the object. An agent ignores an object. - Subclass of: AssessAction -
- -
- InstallAction - The act of installing an application. - Subclass of: ConsumeAction -
- -
- InviteAction - The act of asking someone to attend an event. Reciprocal of RsvpAction. - Subclass of: CommunicateAction -
- -
- JoinAction - An agent joins an event/group with participants/friends at a location.<p>Related actions:</p><ul><li><a href="http://schema.org/RegisterAction">RegisterAction</a>: Unlike RegisterAction, JoinAction refers to joining a group/team of people.</li><li><a href="http://schema.org/SubscribeAction">SubscribeAction</a>: Unlike SubscribeAction, JoinAction does not imply that you'll be receiving updates.</li><li><a href="http://schema.org/FollowAction">FollowAction</a>: Unlike FollowAction, JoinAction does not imply that you'll be polling for updates.</li></ul> - Subclass of: InteractAction -
- -
- LeaveAction - An agent leaves an event / group with participants/friends at a location.<p>Related actions:</p><ul><li><a href="http://schema.org/JoinAction">JoinAction</a>: The antagonym of LeaveAction.</li><li><a href="http://schema.org/UnRegisterAction">UnRegisterAction</a>: Unlike UnRegisterAction, LeaveAction implies leaving a group/team of people rather than a service.</li></ul> - Subclass of: InteractAction -
- -
- LendAction - The act of providing an object under an agreement that it will be returned at a later date. Reciprocal of BorrowAction.<p>Related actions:</p><ul><li><a href="http://schema.org/BorrowAction">BorrowAction</a>: Reciprocal of LendAction.</li></ul> - Subclass of: TransferAction -
- -
- LikeAction - The act of expressing a positive sentiment about the object. An agent likes an object (a proposition, topic or theme) with participants. - Subclass of: ReactAction -
- -
- ListenAction - The act of consuming audio content. - Subclass of: ConsumeAction -
- -
- LoseAction - The act of being defeated in a competitive activity. - Subclass of: AchieveAction -
- -
- MarryAction - The act of marrying a person. - Subclass of: InteractAction -
- -
- OrderAction - An agent orders an object/product/service to be delivered/sent. - Subclass of: TradeAction -
- -
- PaintAction - The act of producing a painting, typically with paint and canvas as instruments. - Subclass of: CreateAction -
- -
- PayAction - An agent pays a price to a participant. - Subclass of: TradeAction -
- -
- PerformAction - The act of participating in performance arts. - Subclass of: PlayAction -
- -
- PhotographAction - The act of capturing still images of objects using a camera. - Subclass of: CreateAction -
- -
- PrependAction - The act of inserting at the beginning if an ordered collection. - Subclass of: InsertAction -
- -
- QuoteAction - An agent quotes/estimates/appraises an object/product/service with a price at a location/store. - Subclass of: TradeAction -
- -
- ReadAction - The act of consuming written content. - Subclass of: ConsumeAction -
- -
- ReceiveAction - The act of physically/electronically taking delivery of an object thathas been transferred from an origin to a destination. Reciprocal of SendAction.<p>Related actions:</p><ul><li><a href="http://schema.org/SendAction">SendAction</a>: The reciprocal of ReceiveAction.</li><li><a href="http://schema.org/TakeAction">TakeAction</a>: Unlike TakeAction, ReceiveAction does not imply that the ownership has been transfered (e.g. I can receive a package, but it does not mean the package is now mine).</li></ul> - Subclass of: TransferAction -
- -
- RegisterAction - The act of registering to be a user of a service, product or web page.<p>Related actions:</p><ul><li><a href="http://schema.org/JoinAction">JoinAction</a>: Unlike JoinAction, RegisterAction implies you are registering to be a user of a service, *not* a group/team of people.</li><li><a href="http://schema.org/FollowAction">FollowAction</a>: Unlike FollowAction, RegisterAction doesn't imply that the agent is expecting to poll for updates from the object.</li><li><a href="http://schema.org/SubscribeAction">SubscribeAction</a>: Unlike SubscribeAction, RegisterAction doesn't imply that the agent is expecting updates from the object.</li></ul> - Subclass of: InteractAction -
- -
- RejectAction - The act of rejecting to/adopting an object.<p>Related actions:</p><ul><li><a href="http://schema.org/AcceptAction">AcceptAction</a>: The antagonym of RejectAction.</li></ul> - Subclass of: AllocateAction -
- -
- RentAction - The act of giving money in return for temporary use, but not ownership, of an object such as a vehicle or property. For example, an agent rents a property from a landlord in exchange for a periodic payment. - Subclass of: TradeAction -
- -
- ReplaceAction - The act of editing a recipient by replacing an old object with a new object. - Subclass of: UpdateAction -
- -
- ReplyAction - The act of responding to a question/message asked/sent by the object. Related to <a href="AskAction">AskAction</a>.<p>Related actions:</p><ul><li><a href="http://schema.org/AskAction">AskAction</a>: Appears generally as an origin of a ReplyAction.</li></ul> - Subclass of: CommunicateAction -
- -
- ReserveAction - Reserving a concrete object.<p>Related actions:</p><ul><li><a href="http://schema.org/ScheduleAction">ScheduleAction</a>: Unlike ScheduleAction, ReserveAction reserves concrete objects (e.g. a table, a hotel) towards a time slot / spatial allocation.</li></ul> - Subclass of: PlanAction -
- -
- ReturnAction - The act of returning to the origin that which was previously received (concrete objects) or taken (ownership). - Subclass of: TransferAction -
- -
- ReviewAction - The act of producing a balanced opinion about the object for an audience. An agent reviews an object with participants resulting in a review. - Subclass of: AssessAction -
- -
- RsvpAction - The act of notifying an event organizer as to whether you expect to attend the event. - Subclass of: InformAction -
- -
- ScheduleAction - Scheduling future actions, events, or tasks.<p>Related actions:</p><ul><li><a href="http://schema.org/ReserveAction">ReserveAction</a>: Unlike ReserveAction, ScheduleAction allocates future actions (e.g. an event, a task, etc) towards a time slot / spatial allocation.</li></ul> - Subclass of: PlanAction -
- -
- SearchAction - The act of searching for an object.<p>Related actions:</p><ul><li><a href="http://schema.org/FindAction">FindAction</a>: SearchAction generally leads to a FindAction, but not necessarily.</li></ul> - Subclass of: Action -
- -
- SellAction - The act of taking money from a buyer in exchange for goods or services rendered. An agent sells an object, product, or service to a buyer for a price. Reciprocal of BuyAction. - Subclass of: TradeAction -
- -
- SendAction - The act of physically/electronically dispatching an object for transfer from an origin to a destination.<p>Related actions:</p><ul><li><a href="http://schema.org/ReceiveAction">ReceiveAction</a>: The reciprocal of SendAction.</li><li><a href="http://schema.org/GiveAction">GiveAction</a>: Unlike GiveAction, SendAction does not imply the transfer of ownership (e.g. I can send you my laptop, but I'm not necessarily giving it to you).</li></ul> - Subclass of: TransferAction -
- -
- ShareAction - The act of distributing content to people for their amusement or edification. - Subclass of: CommunicateAction -
- -
- SubscribeAction - The act of forming a personal connection with someone/something (object) unidirectionally/asymmetrically to get updates pushed to.<p>Related actions:</p><ul><li><a href="http://schema.org/FollowAction">FollowAction</a>: Unlike FollowAction, SubscribeAction implies that the subscriber acts as a passive agent being constantly/actively pushed for updates.</li><li><a href="http://schema.org/RegisterAction">RegisterAction</a>: Unlike RegisterAction, SubscribeAction implies that the agent is interested in continuing receiving updates from the object.</li><li><a href="http://schema.org/JoinAction">JoinAction</a>: Unlike JoinAction, SubscribeAction implies that the agent is interested in continuing receiving updates from the object.</li></ul> - Subclass of: InteractAction -
- -
- TakeAction - The act of gaining ownership of an object from an origin. Reciprocal of GiveAction.<p>Related actions:</p><ul><li><a href="http://schema.org/GiveAction">GiveAction</a>: The reciprocal of TakeAction.</li><li><a href="http://schema.org/ReceiveAction">ReceiveAction</a>: Unlike ReceiveAction, TakeAction implies that ownership has been transfered.</li></ul> - Subclass of: TransferAction -
- -
- TieAction - The act of reaching a draw in a competitive activity. - Subclass of: AchieveAction -
- -
- TipAction - The act of giving money voluntarily to a beneficiary in recognition of services rendered. - Subclass of: TradeAction -
- -
- TrackAction - An agent tracks an object for updates.<p>Related actions:</p><ul><li><a href="http://schema.org/FollowAction">FollowAction</a>: Unlike FollowAction, TrackAction refers to the interest on the location of innanimates objects.</li><li><a href="http://schema.org/SubscribeAction">SubscribeAction</a>: Unlike SubscribeAction, TrackAction refers to the interest on the location of innanimate objects.</li></ul> - Subclass of: FindAction -
- -
- TravelAction - The act of traveling from an fromLocation to a destination by a specified mode of transport, optionally with participants. - Subclass of: MoveAction -
- -
- UnRegisterAction - The act of un-registering from a service.<p>Related actions:</p><ul><li><a href="http://schema.org/RegisterAction">RegisterAction</a>: Antagonym of UnRegisterAction.</li><li><a href="http://schema.org/Leave">Leave</a>: Unlike LeaveAction, UnRegisterAction implies that you are unregistering from a service you werer previously registered, rather than leaving a team/group of people.</li></ul> - Subclass of: InteractAction -
- -
- UseAction - The act of applying an object to its intended purpose. - Subclass of: ConsumeAction -
- -
- ViewAction - The act of consuming static visual content. - Subclass of: ConsumeAction -
- -
- VoteAction - The act of expressing a preference from a fixed/finite/structured set of choices/options. - Subclass of: ChooseAction -
- -
- WantAction - The act of expressing a desire about the object. An agent wants an object. - Subclass of: ReactAction -
- -
- WatchAction - The act of consuming dynamic/moving visual content. - Subclass of: ConsumeAction -
- -
- WearAction - The act of dressing oneself in clothing. - Subclass of: UseAction -
- -
- WinAction - The act of achieving victory in a competitive activity. - Subclass of: AchieveAction -
- -
- WriteAction - The act of authoring written creative content. - Subclass of: CreateAction -
- -
- about - The subject matter of the content. - Domain: CreativeWork - Domain: CommunicateAction - Range: Thing -
-
- acceptedOffer - The offer(s) -- e.g., product, quantity and price combinations -- included in the order. - Domain: Order - Range: Offer -
-
- acceptedPaymentMethod - The payment method(s) accepted by seller for this offer. - Domain: Offer - Domain: Demand - Range: PaymentMethod -
-
- acceptsReservations - Indicates whether a FoodEstablishment accepts reservations. Values can be Boolean, an URL at which reservations can be made or (for backwards compatibility) the strings <code>Yes</code> or <code>No</code>. - Domain: FoodEstablishment - Range: Text - Range: URL - Range: Boolean -
-
- accessCode - Password, PIN, or access code needed for delivery (e.g. from a locker). - Domain: DeliveryEvent - Range: Text -
-
- accessibilityAPI - Indicates that the resource is compatible with the referenced accessibility API (<a href="http://www.w3.org/wiki/WebSchemas/Accessibility">WebSchemas wiki lists possible values</a>). - - Domain: CreativeWork - Range: Text -
-
- accessibilityControl - Identifies input methods that are sufficient to fully control the described resource (<a href="http://www.w3.org/wiki/WebSchemas/Accessibility">WebSchemas wiki lists possible values</a>). - Domain: CreativeWork - Range: Text -
-
- accessibilityFeature - Content features of the resource, such as accessible media, alternatives and supported enhancements for accessibility (<a href="http://www.w3.org/wiki/WebSchemas/Accessibility">WebSchemas wiki lists possible values</a>). - Domain: CreativeWork - Range: Text -
-
- accessibilityHazard - A characteristic of the described resource that is physiologically dangerous to some users. Related to WCAG 2.0 guideline 2.3. (<a href="http://www.w3.org/wiki/WebSchemas/Accessibility">WebSchemas wiki lists possible values</a>) - Domain: CreativeWork - Range: Text -
-
- accountablePerson - Specifies the Person that is legally accountable for the CreativeWork. - Domain: CreativeWork - Range: Person -
-
- acquiredFrom - The organization or person from which the product was acquired. - Domain: OwnershipInfo - Range: Organization - Range: Person -
-
- action - The movement the muscle generates. - - Domain: Muscle - Range: Text -
- -
- muscleAction - The movement the muscle generates. - Domain: Muscle - Range: Text -
- -
- activeIngredient - An active ingredient, typically chemical compounds and/or biologic substances. - Domain: DietarySupplement - Domain: Drug - Domain: DrugStrength - Range: Text -
-
- activityDuration - Length of time to engage in the activity. - Domain: ExercisePlan - Range: Duration -
-
- activityFrequency - How often one should engage in the activity. - Domain: ExercisePlan - Range: Text -
-
- actor - A cast member of the movie, tv/radio series, season, episode, or video. - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: Person -
-
- actors - - A cast member of the movie, tv/radio series, season, episode, or video. (legacy spelling; see singular form, actor) - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: Person -
-
- additionalName - An additional name for a Person, can be used for a middle name. - Domain: Person - Range: Text -
-
- additionalType - An additional type for the item, typically used for adding more specific types from external vocabularies in microdata syntax. This is a relationship between something and a class that the thing is in. In RDFa syntax, it is better to use the native RDFa syntax - the 'typeof' attribute - for multiple types. Schema.org tools may have only weaker understanding of extra types, in particular those defined externally. - Domain: Thing - Range: URL -
-
- additionalVariable - Any additional component of the exercise prescription that may need to be articulated to the patient. This may include the order of exercises, the number of repetitions of movement, quantitative distance, progressions over time, etc. - Domain: ExercisePlan - Range: Text -
-
- addOn - An additional offer that can only be obtained in combination with the first base offer (e.g. supplements and extensions that are available for a surcharge). - Domain: Offer - Range: Offer -
-
- address - Physical address of the item. - Domain: Organization - Domain: Place - Domain: Person - Range: PostalAddress -
-
- addressCountry - The country. For example, USA. You can also provide the two-letter <a href='http://en.wikipedia.org/wiki/ISO_3166-1'>ISO 3166-1 alpha-2 country code</a>. - Domain: PostalAddress - Range: Country -
-
- addressLocality - The locality. For example, Mountain View. - Domain: PostalAddress - Range: Text -
-
- addressRegion - The region. For example, CA. - Domain: PostalAddress - Range: Text -
-
- administrationRoute - A route by which this drug may be administered, e.g. 'oral'. - Domain: Drug - Range: Text -
-
- advanceBookingRequirement - The amount of time that is required between accepting the offer and the actual usage of the resource or service. - Domain: Offer - Domain: Demand - Range: QuantitativeValue -
-
- adverseOutcome - A possible complication and/or side effect of this therapy. If it is known that an adverse outcome is serious (resulting in death, disability, or permanent damage; requiring hospitalization; or is otherwise life-threatening or requires immediate medical attention), tag it as a seriouseAdverseOutcome instead. - Domain: MedicalTherapy - Domain: MedicalDevice - Range: MedicalEntity -
-
- affectedBy - Drugs that affect the test's results. - Domain: MedicalTest - Range: Drug -
-
- affiliation - An organization that this person is affiliated with. For example, a school/university, a club, or a team. - Domain: Person - Range: Organization -
-
- agent - The direct performer or driver of the action (animate or inanimate). e.g. *John* wrote a book. - Domain: Action - Range: Organization - Range: Person -
-
- aggregateRating - The overall rating, based on a collection of reviews or ratings, of the item. - Domain: CreativeWork - Domain: Organization - Domain: Place - Domain: Offer - Domain: Product - Range: AggregateRating -
-
- album - A music album. - Domain: MusicGroup - Range: MusicAlbum -
-
- albums - - A collection of music albums (legacy spelling; see singular form, album). - Domain: MusicGroup - Range: MusicAlbum -
-
- alcoholWarning - Any precaution, guidance, contraindication, etc. related to consumption of alcohol while taking this drug. - Domain: Drug - Range: Text -
-
- algorithm - The algorithm or rules to follow to compute the score. - Domain: MedicalRiskScore - Range: Text -
-
- alignmentType - A category of alignment between the learning resource and the framework node. Recommended values include: 'assesses', 'teaches', 'requires', 'textComplexity', 'readingLevel', 'educationalSubject', and 'educationLevel'. - Domain: AlignmentObject - Range: Text -
-
- alternateName - An alias for the item. - Domain: Thing - Domain: MedicalEntity - Range: Text -
-
- alternativeHeadline - A secondary title of the CreativeWork. - Domain: CreativeWork - Range: Text -
-
- alumni - Alumni of educational organization. - Domain: EducationalOrganization - Range: Person - -
-
- alumniOf - An educational organizations that the person is an alumni of. - Domain: Person - Range: EducationalOrganization - -
-
- amountOfThisGood - The quantity of the goods included in the offer. - Domain: TypeAndQuantityNode - Range: Number -
-
- antagonist - The muscle whose action counteracts the specified muscle. - Domain: Muscle - Range: Muscle -
-
- applicableLocation - The location in which the status applies. - Domain: DrugCost - Domain: DrugLegalStatus - Range: AdministrativeArea -
-
- applicationCategory - Type of software application, e.g. "Game, Multimedia". - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- applicationSubCategory - Subcategory of the application, e.g. "Arcade Game". - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- applicationSuite - The name of the application suite to which the application belongs (e.g. Excel belongs to Office) - Domain: SoftwareApplication - Range: Text -
-
- appliesToDeliveryMethod - The delivery method(s) to which the delivery charge or payment charge specification applies. - Domain: DeliveryChargeSpecification - Domain: PaymentChargeSpecification - Range: DeliveryMethod -
-
- appliesToPaymentMethod - The payment method(s) to which the payment charge specification applies. - Domain: PaymentChargeSpecification - Range: PaymentMethod -
-
- area - The area within which users can expect to reach the broadcast service. - Domain: BroadcastService - Range: Place -
-
- areaServed - The location served by this contact point (e.g., a phone number intended for Europeans vs. North Americans or only within the United States.) - Domain: ContactPoint - Range: AdministrativeArea -
-
- arterialBranch - The branches that comprise the arterial structure. - Domain: Artery - Range: AnatomicalStructure -
-
- articleBody - The actual body of the article. - Domain: Article - Range: Text -
-
- articleSection - Articles may belong to one or more 'sections' in a magazine or newspaper, such as Sports, Lifestyle, etc. - Domain: Article - Range: Text -
-
- aspect - An aspect of medical practice that is considered on the page, such as 'diagnosis', 'treatment', 'causes', 'prognosis', 'etiology', 'epidemiology', etc. - Domain: MedicalWebPage - Range: Text -
-
- assembly - Library file name e.g., mscorlib.dll, system.web.dll - Domain: APIReference - Range: Text -
-
- assemblyVersion - Associated product/technology version. e.g., .NET Framework 4.5 - Domain: APIReference - Range: Text -
-
- associatedAnatomy - The anatomy of the underlying organ system or structures associated with this entity. - Domain: PhysicalActivity - Domain: MedicalCondition - Range: AnatomicalStructure - Range: AnatomicalSystem - Range: SuperficialAnatomy -
-
- associatedArticle - A NewsArticle associated with the Media Object. - Domain: MediaObject - Range: NewsArticle -
-
- associatedMedia - A media object that encodes this CreativeWork. This property is a synonym for encoding. - Domain: CreativeWork - Range: MediaObject -
-
- associatedPathophysiology - If applicable, a description of the pathophysiology associated with the anatomical system, including potential abnormal changes in the mechanical, physical, and biochemical functions of the system. - Domain: AnatomicalStructure - Domain: AnatomicalSystem - Domain: SuperficialAnatomy - Range: Text -
-
- organizer - An organizer of an Event. - Domain: Event - Range: Person - Range: Organization -
-
- attendee - A person or organization attending the event. - Domain: Event - Range: Organization - Range: Person -
-
- attendees - - A person attending the event (legacy spelling; see singular form, attendee). - Domain: Event - Range: Organization - Range: Person -
-
- audience - The intended audience of the item, i.e. the group for whom the item was created. - Domain: CreativeWork - Domain: Product - Domain: PlayAction - Range: Audience -
-
- audienceType - The target group associated with a given audience (e.g. veterans, car owners, musicians, etc.) - domain: Audience - Range: Text - - Domain: Audience - Range: Text -
-
- audio - An embedded audio object. - Domain: CreativeWork - Range: AudioObject -
-
- author - The author of this content. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. - Domain: CreativeWork - Range: Organization - Range: Person -
-
- availability - The availability of this item&#x2014;for example In stock, Out of stock, Pre-order, etc. - Domain: Offer - Domain: Demand - Range: ItemAvailability -
-
- availabilityEnds - The end of the availability of the product or service included in the offer. - Domain: Offer - Domain: Demand - Range: DateTime -
-
- availabilityStarts - The beginning of the availability of the product or service included in the offer. - Domain: Offer - Domain: Demand - Range: DateTime -
-
- availableAtOrFrom - The place(s) from which the offer can be obtained (e.g. store locations). - Domain: Offer - Domain: Demand - Range: Place -
-
- availableChannel - A means of accessing the service (e.g. a phone bank, a web site, a location, etc.) - Domain: Service - Range: ServiceChannel -
-
- availableDeliveryMethod - The delivery method(s) available for this offer. - Domain: Offer - Domain: Demand - Range: DeliveryMethod -
-
- availableFrom - When the item is available for pickup from the store, locker, etc. - Domain: DeliveryEvent - Range: DateTime -
-
- availableIn - The location in which the strength is available. - Domain: DrugStrength - Range: AdministrativeArea -
-
- availableLanguage - A language someone may use with the item. - Domain: ContactPoint - Domain: ServiceChannel - Range: Language -
-
- availableService - A medical service available from this provider. - Domain: Hospital - Domain: MedicalClinic - Domain: Physician - Range: MedicalProcedure - Range: MedicalTest - Range: MedicalTherapy -
-
- availableStrength - An available dosage strength for the drug. - Domain: Drug - Range: DrugStrength -
-
- availableTest - A diagnostic test or procedure offered by this lab. - Domain: DiagnosticLab - Range: MedicalTest -
-
- availableThrough - After this date, the item will no longer be available for pickup. - Domain: DeliveryEvent - Range: DateTime -
-
- award - An award won by this person or for this creative work. - Domain: CreativeWork - Domain: Person - Range: Text -
-
- awards - Awards won by this person or for this creative work. (legacy spelling; see singular form, award) - Domain: CreativeWork - Domain: Person - Range: Text -
-
- background - Descriptive information establishing a historical perspective on the supplement. May include the rationale for the name, the population where the supplement first came to prominence, etc. - Domain: DietarySupplement - Range: Text -
-
- baseSalary - The base salary of the job. - Domain: JobPosting - Range: Number -
-
- benefits - Description of benefits associated with the job. - Domain: JobPosting - Range: Text -
-
- bestRating - The highest value allowed in this rating system. If bestRating is omitted, 5 is assumed. - Domain: Rating - Range: Number - Range: Text -
-
- billingAddress - The billing address for the order. - Domain: Order - Range: PostalAddress -
-
- billingIncrement - This property specifies the minimal quantity and rounding increment that will be the basis for the billing. The unit of measurement is specified by the unitCode property. - Domain: UnitPriceSpecification - Range: Number -
-
- biomechnicalClass - The biomechanical properties of the bone. - Domain: Joint - Range: Text -
-
- birthDate - Date of birth. - Domain: Person - Range: Date -
-
- bitrate - The bitrate of the media object. - Domain: MediaObject - Range: Text -
-
- blogPost - A posting that is part of this blog. - Domain: Blog - Range: BlogPosting -
-
- blogPosts - - The postings that are part of this blog (legacy spelling; see singular form, blogPost). - Domain: Blog - Range: BlogPosting -
-
- bloodSupply - The blood vessel that carries blood from the heart to the muscle. - Domain: Muscle - Range: Vessel -
-
- bodyLocation - Location in the body of the anatomical structure. - Domain: AnatomicalStructure - Range: Text -
-
- bookEdition - The edition of the book. - Domain: Book - Range: Text -
-
- bookFormat - The format of the book. - Domain: Book - Range: BookFormatType -
-
- borrower - A sub property of participant. The person that borrows the object being lent. - - Domain: LendAction - Range: Person -
-
- box - A polygon is the area enclosed by a point-to-point path for which the starting and ending points are the same. A polygon is expressed as a series of four or more space delimited points where the first and final points are identical. - Domain: GeoShape - Range: Text -
-
- branch - The branches that delineate from the nerve bundle. - Domain: Nerve - Range: AnatomicalStructure - Range: Nerve -
-
- branchOf - The larger organization that this local business is a branch of, if any. - Domain: LocalBusiness - Range: Organization -
-
- brand - The brand(s) associated with a product or service, or the brand(s) maintained by an organization or business person. - Domain: Organization - Domain: Person - Domain: Product - Range: Brand - Range: Organization -
-
- breadcrumb - A set of links that can help a user understand and navigate a website hierarchy. - Domain: WebPage - Range: Text -
-
- breastfeedingWarning - Any precaution, guidance, contraindication, etc. related to this drug's use by breastfeeding mothers. - Domain: Drug - Range: Text -
-
- broadcaster - The organization owning or operating the broadcast service. - Domain: BroadcastService - Range: Organization -
-
- browserRequirements - Specifies browser requirements in human-readable text. For example,"requires HTML5 support". - Domain: WebApplication - Range: Text -
-
- businessFunction - The business function (e.g. sell, lease, repair, dispose) of the offer or component of a bundle (TypeAndQuantityNode). The default is http://purl.org/goodrelations/v1#Sell. - Domain: Offer - Domain: Demand - Domain: TypeAndQuantityNode - Range: BusinessFunction -
-
- buyer - A sub property of participant. The participant/person/organization that bought the object. - - Domain: SellAction - Range: Person -
-
- byArtist - The artist that performed this album or recording. - Domain: MusicAlbum - Domain: MusicRecording - Range: MusicGroup -
-
- calories - The number of calories - Domain: NutritionInformation - Range: Energy -
-
- candidate - A sub property of object. The candidate subject of this action. - - Domain: VoteAction - Range: Person -
-
- caption - The caption for this object. - Domain: ImageObject - Domain: VideoObject - Range: Text -
-
- carbohydrateContent - The number of grams of carbohydrates. - Domain: NutritionInformation - Range: Mass -
-
- carrier - 'carrier' is an out-dated term indicating the 'provider' for parcel delivery and flights. - Domain: ParcelDelivery - domain: Flight - Range: Organization - -
-
- carrierRequirements - Specifies specific carrier(s) requirements for the application (e.g. an application may only work on a specific carrier network). - Domain: MobileApplication - Range: Text -
-
- catalog - A data catalog which contains a dataset. - Domain: Dataset - Range: DataCatalog -
-
- category - A category for the item. Greater signs or slashes can be used to informally indicate a category hierarchy. - Domain: Offer - Domain: PhysicalActivity - Range: PhysicalActivityCategory - Range: Text - Range: Thing -
-
- cause - An underlying cause. More specifically, one of the causative agent(s) that are most directly responsible for the pathophysiologic process that eventually results in the occurrence. - Domain: MedicalCondition - Domain: MedicalSignOrSymptom - Range: MedicalCause -
-
- causeOf - The condition, complication, symptom, sign, etc. caused. - Domain: MedicalCause - Range: MedicalEntity -
-
- childMaxAge - Maximal age of the child - Domain: ParentAudience - Range: Number -
-
- childMinAge - Minimal age of the child - Domain: ParentAudience - Range: Number -
-
- children - A child of the person. - Domain: Person - Range: Person -
-
- cholesterolContent - The number of milligrams of cholesterol. - Domain: NutritionInformation - Range: Mass -
-
- circle - A circle is the circular region of a specified radius centered at a specified latitude and longitude. A circle is expressed as a pair followed by a radius in meters. - Domain: GeoShape - Range: Text -
-
- citation - A citation or reference to another creative work, such as another publication, web page, scholarly article, etc. - Domain: CreativeWork - Range: CreativeWork - Range: Text -
-
- clincalPharmacology - Description of the absorption and elimination of drugs, including their concentration (pharmacokinetics, pK) and biological effects (pharmacodynamics, pD). - Domain: Drug - Range: Text -
-
- clipNumber - Position of the clip within an ordered group of clips. - Domain: Clip - Range: Integer - Range: Text - -
-
- closes - The closing hour of the place or service on the given day(s) of the week. - Domain: OpeningHoursSpecification - Range: Time -
-
- code - A medical code for the entity, taken from a controlled vocabulary or ontology such as ICD-9, DiseasesDB, MeSH, SNOMED-CT, RxNorm, etc. - Domain: MedicalEntity - Range: MedicalCode -
-
- codeRepository - Link to the repository where the un-compiled, human readable code and related code is located (SVN, github, CodePlex) - Domain: Code - Range: URL -
-
- codeValue - The actual code. - Domain: MedicalCode - Range: Text -
-
- codingSystem - The coding system, e.g. 'ICD-10'. - Domain: MedicalCode - Range: Text -
-
- colleague - A colleague of the person. - Domain: Person - Range: Person -
-
- colleagues - - A colleague of the person (legacy spelling; see singular form, colleague). - Domain: Person - Range: Person -
-
- collection - A sub property of object. The collection target of the action. - - Domain: UpdateAction - Range: Thing -
-
- color - The color of the product. - Domain: Product - Range: Text -
-
- comment - Comments, typically from users, on this CreativeWork. - Domain: CreativeWork - Range: UserComments -
-
- commentText - The text of the UserComment. - Domain: UserComments - Range: Text -
-
- commentTime - The time at which the UserComment was made. - Domain: UserComments - Range: Date -
-
- comprisedOf - The underlying anatomical structures, such as organs, that comprise the anatomical system. - Domain: AnatomicalSystem - Range: AnatomicalStructure - Range: AnatomicalSystem -
-
- confirmationNumber - A number that confirms the given order. - Domain: Order - Range: Text -
-
- connectedTo - Other anatomical structures to which this structure is connected. - Domain: AnatomicalStructure - Range: AnatomicalStructure -
-
- contactOption - An option available on this contact point (e.g. a toll-free number or support for hearing-impaired callers.) - Domain: ContactPoint - Range: ContactPointOption -
-
- contactPoint - A contact point for a person or organization. - Domain: Organization - Domain: Person - Range: ContactPoint -
-
- contactPoints - - A contact point for a person or organization (legacy spelling; see singular form, contactPoint). - Domain: Organization - Domain: Person - Range: ContactPoint -
-
- contactType - A person or organization can have different contact points, for different purposes. For example, a sales contact point, a PR contact point and so on. This property is used to specify the kind of contact point. - Domain: ContactPoint - Range: Text -
-
- containedIn - The basic containment relation between places. - Domain: Place - Range: Place -
-
- contentLocation - The location of the content. - Domain: CreativeWork - Range: Place -
-
- contentRating - Official rating of a piece of content&#x2014;for example,'MPAA PG-13'. - Domain: CreativeWork - Range: Text -
-
- contentSize - File size in (mega/kilo) bytes. - Domain: MediaObject - Range: Text -
-
- contentUrl - Actual bytes of the media object, for example the image file or video file. (previous spelling: contentURL) - Domain: MediaObject - Range: URL -
-
- contraindication - A contraindication for this therapy. - Domain: MedicalTherapy - Domain: MedicalDevice - Range: MedicalContraindication -
-
- contributor - A secondary contributor to the CreativeWork. - Domain: CreativeWork - Range: Organization - Range: Person -
-
- cookingMethod - The method of cooking, such as Frying, Steaming, ... - Domain: Recipe - Range: Text -
-
- cookTime - The time it takes to actually cook the dish, in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 duration format</a>. - Domain: Recipe - Range: Duration -
-
- copyrightHolder - The party holding the legal copyright to the CreativeWork. - Domain: CreativeWork - Range: Organization - Range: Person -
-
- copyrightYear - The year during which the claimed copyright for the CreativeWork was first asserted. - Domain: CreativeWork - Range: Number -
-
- cost - Cost per unit of the drug, as reported by the source being tagged. - Domain: Drug - Range: DrugCost -
-
- costCategory - The category of cost, such as wholesale, retail, reimbursement cap, etc. - Domain: DrugCost - Range: DrugCostCategory -
-
- costCurrency - The currency (in 3-letter <a href=http://en.wikipedia.org/wiki/ISO_4217>ISO 4217 format</a>) of the drug cost. - Domain: DrugCost - Range: Text -
-
- costOrigin - Additional details to capture the origin of the cost data. For example, 'Medicare Part B'. - Domain: DrugCost - Range: Text -
-
- costPerUnit - The cost per unit of the drug. - Domain: DrugCost - Range: Number - Range: Text -
-
- countriesNotSupported - Countries for which the application is not supported. You can also provide the two-letter ISO 3166-1 alpha-2 country code. - Domain: SoftwareApplication - Range: Text -
-
- countriesSupported - Countries for which the application is supported. You can also provide the two-letter ISO 3166-1 alpha-2 country code. - Domain: SoftwareApplication - Range: Text -
-
- course - A sub property of location. The course where this action was taken. - - Domain: ExerciseAction - Range: Place -
-
- creator - The creator/author of this CreativeWork or UserComments. This is the same as the Author property for CreativeWork. - Domain: CreativeWork - Domain: UserComments - Range: Organization - Range: Person -
-
- currenciesAccepted - The currency accepted (in <a href='http://en.wikipedia.org/wiki/ISO_4217'>ISO 4217 currency format</a>). - Domain: LocalBusiness - Range: Text -
-
- customer - Party placing the order. - Domain: Order - Range: Organization - Range: Person -
-
- dataset - A dataset contained in a catalog. - Domain: DataCatalog - Range: Dataset -
-
- dateCreated - The date on which the CreativeWork was created. - Domain: CreativeWork - Range: Date -
-
- dateline - The location where the NewsArticle was produced. - Domain: NewsArticle - Range: Text -
-
- dateModified - The date on which the CreativeWork was most recently modified. - Domain: CreativeWork - Range: Date -
-
- datePosted - Publication date for the job posting. - Domain: JobPosting - Range: Date -
-
- datePublished - Date of first broadcast/publication. - Domain: CreativeWork - Range: Date -
-
- dayOfWeek - The day of the week for which these opening hours are valid. - Domain: OpeningHoursSpecification - Range: DayOfWeek -
-
- deathDate - Date of death. - Domain: Person - Range: Date -
-
- deliveryAddress - Destination address. - Domain: ParcelDelivery - Range: PostalAddress -
-
- deliveryLeadTime - The typical delay between the receipt of the order and the goods leaving the warehouse. - Domain: Offer - Domain: Demand - Range: QuantitativeValue -
-
- deliveryMethod - A sub property of instrument. The method of delivery - - Domain: ReceiveAction - Domain: SendAction - Domain: TrackAction - Range: DeliveryMethod -
-
- deliveryStatus - New entry added as the package passes through each leg of its journey (from shipment to final delivery). - Domain: ParcelDelivery - Range: DeliveryEvent -
-
- department - A relationship between an organization and a department of that organization, also described as an organization (allowing different urls, logos, opening hours). For example: a store with a pharmacy, or a bakery with a cafe. - Domain: Organization - Range: Organization -
-
- dependencies - Prerequisites needed to fulfill steps in article. - Domain: TechArticle - Range: Text -
-
- depth - The depth of the product. - Domain: Product - Range: Distance - Range: QuantitativeValue -
-
- description - A short description of the item. - - Domain: Thing - Range: Text -
-
- device - Device required to run the application. Used in cases where a specific make/model is required to run the application. - Domain: SoftwareApplication - Range: Text -
-
- diagnosis - One or more alternative conditions considered in the differential diagnosis process. - Domain: DDxElement - Range: MedicalCondition -
-
- diagram - An image containing a diagram that illustrates the structure and/or its component substructures and/or connections with other structures. - Domain: AnatomicalStructure - Range: ImageObject -
-
- diet - A sub property of instrument. The diet used in this action. - - Domain: ExerciseAction - Range: Diet -
-
- dietFeatures - Nutritional information specific to the dietary plan. May include dietary recommendations on what foods to avoid, what foods to consume, and specific alterations/deviations from the USDA or other regulatory body's approved dietary guidelines. - Domain: Diet - Range: Text -
-
- differentialDiagnosis - One of a set of differential diagnoses for the condition. Specifically, a closely-related or competing diagnosis typically considered later in the cognitive process whereby this medical condition is distinguished from others most likely responsible for a similar collection of signs and symptoms to reach the most parsimonious diagnosis or diagnoses in a patient. - Domain: MedicalCondition - Range: DDxElement -
-
- director - The director of the movie, tv/radio episode or series. - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: Person -
-
- directors - - The director of the movie, tv/radio episode or series. (legacy spelling; see singular form, director) - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: Person -
-
- discount - Any discount applied (to an Order). - Domain: Order - Range: Number - Range: Text -
-
- discountCode - Code used to redeem a discount. - Domain: Order - Range: Text -
-
- discountCurrency - The currency (in 3-letter ISO 4217 format) of the discount. - Domain: Order - Range: Text -
-
- discusses - Specifies the CreativeWork associated with the UserComment. - Domain: UserComments - Range: CreativeWork -
-
- discussionUrl - A link to the page containing the comments of the CreativeWork. - Domain: CreativeWork - Range: URL -
-
- distance - The distance travelled, e.g. exercising or travelling. - Domain: ExerciseAction - Domain: TravelAction - Range: Distance -
-
- distinguishingSign - One of a set of signs and symptoms that can be used to distinguish this diagnosis from others in the differential diagnosis. - Domain: DDxElement - Range: MedicalSignOrSymptom -
-
- distribution - A downloadable form of this dataset, at a specific location, in a specific format. - Domain: Dataset - Range: DataDownload -
-
- domainIncludes - Relates a property to a class that is (one of) the type(s) the property is expected to be used on. - Domain: Property - Range: Class -
-
- inverseOf - Relates a property to a property that is its inverse. Inverse properties relate the same pairs of items to each other, but in reversed direction. For example, the 'alumni' and 'alumniOf' properties are inverseOf each other. Some properties don't have explicit inverses; in these situations RDFa and JSON-LD syntax for reverse properties can be used. - Domain: Property - Range: Property -
-
- supersededBy - Relates a property to one that supersedes it. - Domain: Property - Range: Property -
-
- doorTime - The time admission will commence. - Domain: Event - Range: DateTime -
-
- dosageForm - A dosage form in which this drug/supplement is available, e.g. 'tablet', 'suspension', 'injection'. - Domain: DietarySupplement - Domain: Drug - Range: Text -
-
- doseSchedule - A dosing schedule for the drug for a given population, either observed, recommended, or maximum dose based on the type used. - Domain: Drug - Range: DoseSchedule -
-
- doseUnit - The unit of the dose, e.g. 'mg'. - Domain: DoseSchedule - Range: Text -
-
- doseValue - The value of the dose, e.g. 500. - Domain: DoseSchedule - Range: Number -
-
- downloadUrl - If the file can be downloaded, URL to download the binary. - Domain: SoftwareApplication - Range: URL -
-
- drainsTo - The vasculature that the vein drains into. - Domain: Vein - Range: Vessel -
-
- drug - A drug in this drug class. - Domain: DrugClass - Range: Drug -
-
- drugClass - The class of drug this belongs to (e.g., statins). - Domain: Drug - Range: DrugClass -
-
- drugUnit - The unit in which the drug is measured, e.g. '5 mg tablet'. - Domain: DrugCost - Range: Text -
-
- duns - The Dun & Bradstreet DUNS number for identifying an organization or business person. - Domain: Organization - Domain: Person - Range: Text -
-
- duplicateTherapy - A therapy that duplicates or overlaps this one. - Domain: MedicalTherapy - Range: MedicalTherapy -
-
- duration - The duration of the item (movie, audio recording, event, etc.) in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 date format</a>. - Domain: MediaObject - Domain: Event - Domain: Movie - Domain: MusicRecording - Range: Duration -
-
- durationOfWarranty - The duration of the warranty promise. Common unitCode values are ANN for year, MON for months, or DAY for days. - Domain: WarrantyPromise - Range: QuantitativeValue -
-
- editor - Specifies the Person who edited the CreativeWork. - Domain: CreativeWork - Range: Person -
-
- educationalAlignment - An alignment to an established educational framework. - Domain: CreativeWork - Range: AlignmentObject -
-
- educationalFramework - The framework to which the resource being described is aligned. - Domain: AlignmentObject - Range: Text -
-
- educationalRole - An educationalRole of an EducationalAudience - Domain: EducationalAudience - Range: Text -
-
- educationalUse - The purpose of a work in the context of education; for example, 'assignment', 'group work'. - Domain: CreativeWork - Range: Text -
-
- educationRequirements - Educational background needed for the position. - Domain: JobPosting - Range: Text -
-
- elevation - The elevation of a location. - Domain: GeoCoordinates - Domain: GeoShape - Range: Number - Range: Text -
-
- eligibleCustomerType - The type(s) of customers for which the given offer is valid. - Domain: Offer - Domain: Demand - Range: BusinessEntityType -
-
- eligibleDuration - The duration for which the given offer is valid. - Domain: Offer - Domain: Demand - Range: QuantitativeValue -
-
- eligibleQuantity - The interval and unit of measurement of ordering quantities for which the offer or price specification is valid. This allows e.g. specifying that a certain freight charge is valid only for a certain quantity. - Domain: Offer - Domain: PriceSpecification - Domain: Demand - Range: QuantitativeValue -
-
- eligibleRegion - The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is valid. - Domain: Offer - Domain: DeliveryChargeSpecification - Domain: Demand - Range: GeoShape - Range: Text -
-
- eligibleTransactionVolume - The transaction volume, in a monetary unit, for which the offer or price specification is valid, e.g. for indicating a minimal purchasing volume, to express free shipping above a certain order volume, or to limit the acceptance of credit cards to purchases to a certain minimal amount. - Domain: Offer - Domain: PriceSpecification - Domain: Demand - Range: PriceSpecification -
-
- email - Email address. - Domain: Organization - Domain: ContactPoint - Domain: Person - Range: Text -
-
- embedUrl - A URL pointing to a player for a specific video. In general, this is the information in the <code>src</code> element of an <code>embed</code> tag and should not be the same as the content of the <code>loc</code> tag. (previous spelling: embedURL) - Domain: MediaObject - Range: URL -
-
- employee - Someone working for this organization. - Domain: Organization - Range: Person -
-
- employees - - People working for this organization. (legacy spelling; see singular form, employee) - Domain: Organization - Range: Person -
-
- employmentType - Type of employment (e.g. full-time, part-time, contract, temporary, seasonal, internship). - Domain: JobPosting - Range: Text -
-
- encodesCreativeWork - The CreativeWork encoded by this media object. - Domain: MediaObject - Range: CreativeWork -
-
- encoding - A media object that encodes this CreativeWork. This property is a synonym for associatedMedia. - Domain: CreativeWork - Range: MediaObject -
-
- encodingFormat - mp3, mpeg4, etc. - Domain: MediaObject - Range: Text -
-
- encodings - - A media object that encodes this CreativeWork (legacy spelling; see singular form, encoding). - Domain: CreativeWork - Range: MediaObject -
-
- endDate - The end date and time of the role, event or item (in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 date format</a>). - - - - Domain: Role - Domain: Event - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Range: Date -
-
- endorsee - A sub property of participant. The person/organization being supported. - - Domain: EndorseAction - Range: Organization - Range: Person -
-
- endorsers - People or organizations that endorse the plan. - Domain: Diet - Range: Organization - Range: Person -
-
- endTime - The endTime of something. For a reserved event or service (e.g. FoodEstablishmentReservation), the time that it is expected to end. For actions that span a period of time, when the action was performed. e.g. John wrote a book from January to *December*. - -Note that Event uses startDate/endDate instead of startTime/endTime, even when describing dates with times. This situation may be clarified in future revisions. - - Domain: Action - Domain: FoodEstablishmentReservation - Range: DateTime -
-
- entertainmentBusiness - A sub property of location. The entertainment business where the action occurred. - - Domain: PerformAction - Range: EntertainmentBusiness -
-
- epidemiology - The characteristics of associated patients, such as age, gender, race etc. - Domain: PhysicalActivity - Domain: MedicalCondition - Range: Text -
-
- episode - An episode of a TV/radio series or season - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Domain: RadioSeason - Domain: RadioSeries - Range: Episode -
-
- episodeNumber - Position of the episode within an ordered group of episodes. - - Domain: Episode - Range: Integer - Range: Text -
-
- episodes - - An episode of a TV/radio series or season (legacy spelling; see singular form, episode) - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Domain: RadioSeason - Domain: RadioSeries - Range: Episode -
-
- equal - This ordering relation for qualitative values indicates that the subject is equal to the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- estimatesRiskOf - The condition, complication, or symptom whose risk is being estimated. - Domain: MedicalRiskEstimator - Range: MedicalEntity -
-
- event - Upcoming or past event associated with this place or organization. - Domain: Organization - Domain: Place - Domain: InformAction - Domain: PlayAction - Domain: InviteAction - Domain: JoinAction - Domain: LeaveAction - Range: Event -
-
- events - - Upcoming or past events associated with this place or organization (legacy spelling; see singular form, event). - Domain: Organization - Domain: Place - Range: Event -
-
- eventStatus - An eventStatus of an event represents its status; particularly useful when an event is cancelled or rescheduled. - Domain: Event - Range: EventStatusType -
-
- evidenceLevel - Strength of evidence of the data used to formulate the guideline (enumerated). - Domain: MedicalGuideline - Range: MedicalEvidenceLevel -
-
- evidenceOrigin - Source of the data used to formulate the guidance, e.g. RCT, consensus opinion, etc. - Domain: MedicalGuideline - Range: Text -
-
- exercisePlan - A sub property of instrument. The exercise plan used on this action. - - Domain: ExerciseAction - Range: ExercisePlan -
-
- exerciseType - Type(s) of exercise or activity, such as strength training, flexibility training, aerobics, cardiac rehabilitation, etc. - Domain: ExercisePlan - Domain: ExerciseAction - Range: Text -
-
- exifData - exif data for this object. - Domain: ImageObject - Range: Text -
-
- expectedArrivalFrom - The earliest date the package may arrive. - Domain: ParcelDelivery - Range: DateTime -
-
- expectedArrivalUntil - The latest date the package may arrive. - Domain: ParcelDelivery - Range: DateTime -
-
- expectedPrognosis - The likely outcome in either the short term or long term of the medical condition. - Domain: MedicalCondition - Range: Text -
-
- experienceRequirements - Description of skills and experience needed for the position. - Domain: JobPosting - Range: Text -
-
- expertConsiderations - Medical expert advice related to the plan. - Domain: Diet - Range: Text -
-
- expires - Date the content expires and is no longer useful or available. Useful for videos. - Domain: MediaObject - Range: Date -
-
- familyName - Family name. In the U.S., the last name of an Person. This can be used along with givenName instead of the name property. - Domain: Person - Range: Text -
-
- fatContent - The number of grams of fat. - Domain: NutritionInformation - Range: Mass -
-
- faxNumber - The fax number. - Domain: Organization - Domain: Place - Domain: ContactPoint - Domain: Person - Range: Text -
-
- featureList - Features or modules provided by this application (and possibly required by other applications). - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- fiberContent - The number of grams of fiber. - Domain: NutritionInformation - Range: Mass -
-
- fileFormat - MIME format of the binary (e.g. application/zip). - Domain: SoftwareApplication - Range: Text -
-
- fileSize - Size of the application / package (e.g. 18MB). In the absence of a unit (MB, KB etc.), KB will be assumed. - Domain: SoftwareApplication - Range: Integer -
-
- followee - A sub property of object. The person or organization being followed. - - Domain: FollowAction - Range: Organization - Range: Person -
-
- follows - The most generic uni-directional social relation. - Domain: Person - Range: Person -
-
- followup - Typical or recommended followup care after the procedure is performed. - Domain: MedicalProcedure - Range: Text -
-
- foodEstablishment - A sub property of location. The specific food establishment where the action occurred. - - Domain: CookAction - Range: FoodEstablishment - Range: Place -
-
- foodEvent - A sub property of location. The specific food event where the action occurred. - - Domain: CookAction - Range: FoodEvent -
-
- foodWarning - Any precaution, guidance, contraindication, etc. related to consumption of specific foods while taking this drug. - Domain: Drug - Range: Text -
-
- founder - A person who founded this organization. - Domain: Organization - Range: Person -
-
- founders - - A person who founded this organization (legacy spelling; see singular form, founder). - Domain: Organization - Range: Person -
-
- dissolutionDate - The date that this organization was dissolved. - Domain: Organization - Range: Date -
-
- foundingDate - The date that this organization was founded. - Domain: Organization - Range: Date -
-
- free - A flag to signal that the publication is accessible for free. - Domain: PublicationEvent - Range: Boolean -
-
- frequency - How often the dose is taken, e.g. 'daily'. - Domain: DoseSchedule - Range: Text -
-
- fromLocation - A sub property of location. The original location of the object or the agent before the action. - - Domain: MoveAction - Domain: TransferAction - Domain: ExerciseAction - Range: Number - Range: Place -
-
- function - Function of the anatomical structure. - Domain: AnatomicalStructure - Range: Text -
-
- functionalClass - The degree of mobility the joint allows. - Domain: Joint - Range: Text -
-
- gender - Gender of the person. - Domain: Person - Range: Text -
-
- genre - Genre of the creative work - Domain: CreativeWork - Range: Text -
-
- geo - The geo coordinates of the place. - Domain: Place - Range: GeoCoordinates - Range: GeoShape -
-
- geographicArea - The geographic area associated with the audience. - Domain: Audience - Range: AdministrativeArea -
-
- givenName - Given name. In the U.S., the first name of a Person. This can be used along with familyName instead of the name property. - Domain: Person - Range: Text -
-
- globalLocationNumber - The Global Location Number (GLN, sometimes also referred to as International Location Number or ILN) of the respective organization, person, or place. The GLN is a 13-digit number used to identify parties and physical locations. - Domain: Organization - Domain: Place - Domain: Person - Range: Text -
-
- greater - This ordering relation for qualitative values indicates that the subject is greater than the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- greaterOrEqual - This ordering relation for qualitative values indicates that the subject is greater than or equal to the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- gtin13 - The <a href="http://apps.gs1.org/GDD/glossary/Pages/GTIN-13.aspx">GTIN-13</a> code of the product, or the product to which the offer refers. This is equivalent to 13-digit ISBN codes and EAN UCC-13. Former 12-digit UPC codes can be converted into a GTIN-13 code by simply adding a preceeding zero. See <a href="http://www.gs1.org/barcodes/technical/idkeys/gtin">GS1 GTIN Summary</a> for more details. - Domain: Offer - Domain: Product - Domain: Demand - Range: Text -
-
- gtin14 - The <a href="http://apps.gs1.org/GDD/glossary/Pages/GTIN-14.aspx">GTIN-14</a> code of the product, or the product to which the offer refers. See <a href="http://www.gs1.org/barcodes/technical/idkeys/gtin">GS1 GTIN Summary</a> for more details. - Domain: Offer - Domain: Product - Domain: Demand - Range: Text -
-
- gtin8 - The <a href="http://apps.gs1.org/GDD/glossary/Pages/GTIN-8.aspx">GTIN-8</a> code of the product, or the product to which the offer refers. This code is also known as EAN/UCC-8 or 8-digit EAN. See <a href="http://www.gs1.org/barcodes/technical/idkeys/gtin">GS1 GTIN Summary</a> for more details. - Domain: Offer - Domain: Product - Domain: Demand - Range: Text -
-
- guideline - A medical guideline related to this entity. - Domain: MedicalEntity - Range: MedicalGuideline -
-
- guidelineDate - Date on which this guideline's recommendation was made. - Domain: MedicalGuideline - Range: Date -
-
- guidelineSubject - The medical conditions, treatments, etc. that are the subject of the guideline. - Domain: MedicalGuideline - Range: MedicalEntity -
-
- hasDeliveryMethod - Method used for delivery or shipping. - Domain: DeliveryEvent - Domain: ParcelDelivery - Range: DeliveryMethod -
-
- hasPOS - Points-of-Sales operated by the organization or person. - Domain: Organization - Domain: Person - Range: Place -
-
- headline - Headline of the article - Domain: CreativeWork - Range: Text -
-
- healthCondition - Expectations for health conditions of target audience - Domain: PeopleAudience - Range: MedicalCondition -
-
- height - The height of the item or person. - Domain: MediaObject - Domain: Product - Domain: Person - Range: Distance - Range: QuantitativeValue -
-
- highPrice - The highest price of all offers available. - Domain: AggregateOffer - Range: Number - Range: Text -
-
- hiringOrganization - Organization offering the job position. - Domain: JobPosting - Range: Organization -
-
- homeLocation - A contact location for a person's residence. - Domain: Person - Range: ContactPoint - Range: Place -
-
- honorificPrefix - An honorific prefix preceding a Person's name such as Dr/Mrs/Mr. - Domain: Person - Range: Text -
-
- honorificSuffix - An honorific suffix preceding a Person's name such as M.D. /PhD/MSCSW. - Domain: Person - Range: Text -
-
- hospitalAffiliation - A hospital with which the physician or office is affiliated. - Domain: Physician - Range: Hospital -
-
- hoursAvailable - The hours during which this contact point is available. - Domain: ContactPoint - Range: OpeningHoursSpecification -
-
- howPerformed - How the procedure is performed. - Domain: MedicalProcedure - Range: Text -
-
- identifyingExam - A physical examination that can identify this sign. - Domain: MedicalSign - Range: PhysicalExam -
-
- identifyingTest - A diagnostic test that can identify this sign. - Domain: MedicalSign - Range: MedicalTest -
-
- illustrator - The illustrator of the book. - Domain: Book - Range: Person -
-
- image - An image of the item. This can be a <a href="http://schema.org/URL">URL</a> or a fully described <a href="http://schema.org/ImageObject">ImageObject</a>. - Domain: Thing - Range: URL - Range: ImageObject -
-
- imagingTechnique - Imaging technique used. - Domain: ImagingTest - Range: MedicalImagingTechnique -
-
- inAlbum - The album to which this recording belongs. - Domain: MusicRecording - Range: MusicAlbum -
-
- incentives - Description of bonus and commission compensation aspects of the job. - Domain: JobPosting - Range: Text -
-
- includedRiskFactor - A modifiable or non-modifiable risk factor included in the calculation, e.g. age, coexisting condition. - Domain: MedicalRiskEstimator - Range: MedicalRiskFactor -
-
- includesObject - This links to a node or nodes indicating the exact quantity of the products included in the offer. - Domain: Offer - Domain: Demand - Range: TypeAndQuantityNode -
-
- increasesRiskOf - The condition, complication, etc. influenced by this factor. - Domain: MedicalRiskFactor - Range: MedicalEntity -
-
- indication - A factor that indicates use of this therapy for treatment and/or prevention of a condition, symptom, etc. For therapies such as drugs, indications can include both officially-approved indications as well as off-label uses. These can be distinguished by using the ApprovedIndication subtype of MedicalIndication. - Domain: MedicalTherapy - Domain: MedicalDevice - Range: MedicalIndication -
-
- industry - The industry associated with the job position. - Domain: JobPosting - Range: Text -
-
- infectiousAgent - The actual infectious agent, such as a specific bacterium. - Domain: InfectiousDisease - Range: Text -
-
- infectiousAgentClass - The class of infectious agent (bacteria, prion, etc.) that causes the disease. - Domain: InfectiousDisease - Range: InfectiousAgentClass -
-
- ingredients - An ingredient used in the recipe. - Domain: Recipe - Range: Text -
-
- inLanguage - The language of the content. please use one of the language codes from the <a href='http://tools.ietf.org/html/bcp47'>IETF BCP 47 standard.</a> - Domain: CreativeWork - Range: Text -
-
- inPlaylist - The playlist to which this recording belongs. - Domain: MusicRecording - Range: MusicPlaylist -
-
- insertion - The place of attachment of a muscle, or what the muscle moves. - Domain: Muscle - Range: AnatomicalStructure -
-
- installUrl - URL at which the app may be installed, if different from the URL of the item. - Domain: SoftwareApplication - Range: URL -
-
- instrument - The object that helped the agent perform the action. e.g. John wrote a book with *a pen*. - Domain: Action - Range: Thing -
-
- intensity - Quantitative measure gauging the degree of force involved in the exercise, for example, heartbeats per minute. May include the velocity of the movement. - Domain: ExercisePlan - Range: Text -
-
- interactingDrug - Another drug that is known to interact with this drug in a way that impacts the effect of this drug or causes a risk to the patient. Note: disease interactions are typically captured as contraindications. - Domain: Drug - Range: Drug -
-
- interactionCount - A count of a specific user interactions with this item&#x2014;for example, <code>20 UserLikes</code>, <code>5 UserComments</code>, or <code>300 UserDownloads</code>. The user interaction type should be one of the sub types of <a href='UserInteraction'>UserInteraction</a>. - Domain: CreativeWork - Domain: Organization - Domain: Place - Domain: MediaObject - Domain: Person - Range: Text -
-
- interactivityType - The predominant mode of learning supported by the learning resource. Acceptable values are 'active', 'expositive', or 'mixed'. - Domain: CreativeWork - Range: Text -
-
- inventoryLevel - The current approximate inventory level for the item or items. - Domain: Offer - Domain: Demand - Domain: SomeProducts - Range: QuantitativeValue -
-
- isAccessoryOrSparePartFor - A pointer to another product (or multiple products) for which this product is an accessory or spare part. - Domain: Product - Range: Product -
-
- isAvailableGenerically - True if the drug is available in a generic form (regardless of name). - Domain: Drug - Range: Boolean -
-
- isBasedOnUrl - A resource that was used in the creation of this resource. This term can be repeated for multiple sources. For example, http://example.com/great-multiplication-intro.html - Domain: CreativeWork - Range: URL -
-
- isbn - The ISBN of the book. - Domain: Book - Range: Text - -
-
- isConsumableFor - A pointer to another product (or multiple products) for which this product is a consumable. - Domain: Product - Range: Product -
-
- isFamilyFriendly - Indicates whether this content is family friendly. - Domain: CreativeWork - Range: Boolean -
-
- isGift - Was the offer accepted as a gift for someone other than the buyer. - Domain: Order - Range: Boolean -
-
- isicV4 - The International Standard of Industrial Classification of All Economic Activities (ISIC), Revision 4 code for a particular organization, business person, or place. - Domain: Organization - Domain: Place - Domain: Person - Range: Text -
-
- isPartOf - Indicates a CreativeWork that this CreativeWork is (in some sense) part of. - Domain: CreativeWork - Range: CreativeWork - -
-
- isProprietary - True if this item's name is a proprietary/brand name (vs. generic name). - Domain: DietarySupplement - Domain: Drug - Range: Boolean -
-
- isRelatedTo - A pointer to another, somehow related product (or multiple products). - Domain: Product - Range: Product -
-
- isSimilarTo - A pointer to another, functionally similar product (or multiple products). - Domain: Product - Range: Product -
-
- issuedThrough - The service through with the permit was granted. - Domain: Permit - Range: Service -
-
- isVariantOf - A pointer to a base product from which this product is a variant. It is safe to infer that the variant inherits all product features from the base model, unless defined locally. This is not transitive. - Domain: ProductModel - Range: ProductModel -
-
- itemCondition - A predefined value from OfferItemCondition or a textual description of the condition of the product or service, or the products or services included in the offer. - Domain: Offer - Domain: Product - Domain: Demand - Range: OfferItemCondition -
- -
- numberOfItems - The number of items in an ItemList. Note that some descriptions might not full describe all items in a list (e.g. multi-page pagination). - Domain: ItemList - Range: Number -
-
- itemListOrder - Type of ordering (e.g. Ascending, Descending, Unordered). - Domain: ItemList - Range: ItemListOrderType - Range: Text -
- - -
- ItemListOrderType - Enumerated for values for itemListOrder for indicating how an ordered ItemList is organized. - Subclass of: Enumeration -
- -
- ItemListOrderAscending - An ItemList ordered with lower values listed first. - type: ItemListOrderType -
- -
- ItemListOrderDescending - An ItemList ordered with higher values listed first. - type: ItemListOrderType -
- -
- ItemListUnordered - An ItemList ordered with no explicit order. - type: ItemListOrderType -
- - -
- itemOffered - The item being offered. - Domain: Offer - Domain: Demand - Range: Product -
-
- itemReviewed - The item that is being reviewed/rated. - Domain: AggregateRating - Domain: Review - Range: Thing -
-
- itemShipped - Item(s) being shipped. - Domain: ParcelDelivery - Range: Product -
-
- jobLocation - A (typically single) geographic location associated with the job position. - Domain: JobPosting - Range: Place -
-
- jobTitle - The job title of the person (for example, Financial Manager). - Domain: Person - Range: Text -
-
- keywords - Keywords or tags used to describe this content. Multiple entries in a keywords list are typically delimited by commas. - Domain: CreativeWork - Range: Text -
-
- knows - The most generic bi-directional social/work relation. - Domain: Person - Range: Person -
-
- labelDetails - Link to the drug's label details. - Domain: Drug - Range: URL -
-
- landlord - A sub property of participant. The owner of the real estate property. - - Domain: RentAction - Range: Organization - Range: Person -
-
- language - A sub property of instrument. The language used on this action. - - Domain: CommunicateAction - Domain: WriteAction - Range: Language -
-
- lastReviewed - Date on which the content on this web page was last reviewed for accuracy and/or completeness. - Domain: WebPage - Range: Date -
-
- latitude - The latitude of a location. For example <code>37.42242</code>. - Domain: GeoCoordinates - Range: Number - Range: Text -
-
- license - A license document that applies to this content, typically indicated by URL. - Domain: CreativeWork - Range: CreativeWork - Range: URL -
-
- learningResourceType - The predominant type or kind characterizing the learning resource. For example, 'presentation', 'handout'. - Domain: CreativeWork - Range: Text -
-
- legalName - The official name of the organization, e.g. the registered company name. - Domain: Organization - Range: Text -
-
- legalStatus - The drug or supplement's legal status, including any controlled substance schedules that apply. - Domain: DietarySupplement - Domain: Drug - Range: DrugLegalStatus -
-
- lender - A sub property of participant. The person that lends the object being borrowed. - - Domain: BorrowAction - Range: Person -
-
- lesser - This ordering relation for qualitative values indicates that the subject is lesser than the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- lesserOrEqual - This ordering relation for qualitative values indicates that the subject is lesser than or equal to the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- line - A line is a point-to-point path consisting of two or more points. A line is expressed as a series of two or more point objects separated by space. - Domain: GeoShape - Range: Text -
-
- location - The location of the event, organization or action. - Domain: Organization - Domain: Event - Domain: Action - Range: Place - Range: PostalAddress -
-
- logo - A logo associated with an organization. - - Domain: Organization - Domain: Place - Domain: Product - Domain: Brand - Range: ImageObject - Range: URL -
-
- longitude - The longitude of a location. For example <code>-122.08585</code>. - Domain: GeoCoordinates - Range: Number - Range: Text -
-
- loser - A sub property of participant. The loser of the action. - - Domain: WinAction - Range: Person -
-
- lowPrice - The lowest price of all offers available. - Domain: AggregateOffer - Range: Number - Range: Text -
-
- mainContentOfPage - Indicates if this web page element is the main subject of the page. - Domain: WebPage - Range: WebPageElement -
-
- makesOffer - A pointer to products or services offered by the organization or person. - Domain: Organization - Domain: Person - Range: Offer -
-
- manufacturer - The manufacturer of the product. - Domain: DietarySupplement - Domain: Drug - Domain: Product - Range: Organization -
-
- hasMap - A URL to a map of the place. - Domain: Place - Range: URL - Range: Map -
-
- map - A URL to a map of the place. - - Domain: Place - Range: URL -
-
- maps - - A URL to a map of the place (legacy spelling; see singular form, map). - Domain: Place - Range: URL -
-
- maximumIntake - Recommended intake of this supplement for a given population as defined by a specific recommending authority. - Domain: DietarySupplement - Range: MaximumDoseSchedule -
-
- maxPrice - The highest price if the price is a range. - Domain: PriceSpecification - Range: Number -
-
- maxValue - The upper value of some characteristic or property. - Domain: QuantitativeValue - Domain: PropertyValueSpecification - Range: Number -
-
- mechanismOfAction - The specific biochemical interaction through which this drug or supplement produces its pharmacological effect. - Domain: DietarySupplement - Domain: Drug - Range: Text -
-
- medicalSpecialty - A medical specialty of the provider. - Domain: Hospital - Domain: MedicalClinic - Domain: Physician - Range: MedicalSpecialty -
-
- medicineSystem - The system of medicine that includes this MedicalEntity, for example 'evidence-based', 'homeopathic', 'chiropractic', etc. - Domain: MedicalEntity - Range: MedicineSystem -
-
- member - A member of an Organization or a ProgramMembership. Organizations can be members of organizations; ProgramMembership is typically for individuals. - - Domain: Organization - domain: ProgramMembership - Range: Organization - Range: Person -
-
- memberOf - An Organization (or ProgramMembership) to which this Person or Organization belongs. - - Domain: Person - Domain: Organization - Range: Organization - Range: ProgramMembership -
-
- members - - A member of this organization (legacy spelling; see singular form, member). - Domain: Organization - domain: ProgramMembership - Range: Organization - Range: Person -
-
- memoryRequirements - Minimum memory requirements. - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- mentions - Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept. - Domain: CreativeWork - Range: Thing -
-
- menu - Either the actual menu or a URL of the menu. - Domain: FoodEstablishment - Range: Text - Range: URL -
-
- merchant - 'merchant' is an out-dated term for 'seller'. - Domain: Order - Range: Organization - Range: Person - -
-
- minPrice - The lowest price if the price is a range. - Domain: PriceSpecification - Range: Number -
-
- minValue - The lower value of some characteristic or property. - Domain: QuantitativeValue - Domain: PropertyValueSpecification - Range: Number -
-
- model - The model of the product. Use with the URL of a ProductModel or a textual representation of the model identifier. The URL of the ProductModel can be from an external source. It is recommended to additionally provide strong product identifiers via the gtin8/gtin13/gtin14 and mpn properties. - Domain: Product - Range: ProductModel - Range: Text -
-
- mpn - The Manufacturer Part Number (MPN) of the product, or the product to which the offer refers. - Domain: Offer - Domain: Product - Domain: Demand - Range: Text -
-
- musicBy - The composer of the movie or TV/radio soundtrack. - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: MusicGroup - Range: Person -
-
- musicGroupMember - A member of a music group&#x2014;for example, John, Paul, George, or Ringo. - - Domain: MusicGroup - Range: Person -
-
- naics - The North American Industry Classification System (NAICS) code for a particular organization or business person. - Domain: Organization - Domain: Person - Range: Text -
-
- name - The name of the item. - Domain: Thing - Range: Text -
-
- nationality - Nationality of the person. - Domain: Person - Range: Country -
-
- naturalProgression - The expected progression of the condition if it is not treated and allowed to progress naturally. - Domain: MedicalCondition - Range: Text -
-
- nerve - The underlying innervation associated with the muscle. - Domain: Muscle - Range: Nerve -
-
- nerveMotor - The neurological pathway extension that involves muscle control. - Domain: Nerve - Range: Muscle -
-
- nonEqual - This ordering relation for qualitative values indicates that the subject is not equal to the object. - Domain: QualitativeValue - Range: QualitativeValue -
-
- nonProprietaryName - The generic name of this drug or supplement. - Domain: DietarySupplement - Domain: Drug - Range: Text -
-
- normalRange - Range of acceptable values for a typical patient, when applicable. - Domain: MedicalTest - Range: Text -
-
- numberofEmployees - The size of business by number of employees. - Domain: BusinessAudience - Range: QuantitativeValue -
-
- numberOfEpisodes - The number of episodes in this season or series. - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Domain: RadioSeason - Domain: RadioSeries - Range: Number -
-
- numberOfPages - The number of pages in the book. - Domain: Book - Range: Integer -
-
- numberOfSeasons - The number of seasons in this series. - Domain: Series - Range: Number -
-
- numTracks - The number of tracks in this album or playlist. - Domain: MusicPlaylist - Range: Integer -
-
- nutrition - Nutrition information about the recipe. - Domain: Recipe - Range: NutritionInformation -
-
- object - The object upon the action is carried out, whose state is kept intact or changed. Also known as the semantic roles patient, affected or undergoer (which change their state) or theme (which doesn't). e.g. John read *a book*. - Domain: Action - Range: Thing -
-
- occupationalCategory - Category or categories describing the job. Use BLS O*NET-SOC taxonomy: http://www.onetcenter.org/taxonomy.html. Ideally includes textual label and formal code, with the property repeated for each applicable value. - Domain: JobPosting - Range: Text -
-
- offerCount - The number of offers for the product. - Domain: AggregateOffer - Range: Integer -
-
- offers - An offer to provide this item&#x2014;for example, an offer to sell a product, rent the DVD of a movie, or give away tickets to an event. - Domain: CreativeWork - Domain: MediaObject - Domain: Event - Domain: Product - Range: Offer -
-
- openingHours - The opening hours for a business. Opening hours can be specified as a weekly time range, starting with days, then times per day. Multiple days can be listed with commas ',' separating each day. Day or time ranges are specified using a hyphen '-'.<br />- Days are specified using the following two-letter combinations: <code>Mo</code>, <code>Tu</code>, <code>We</code>, <code>Th</code>, <code>Fr</code>, <code>Sa</code>, <code>Su</code>.<br />- Times are specified using 24:00 time. For example, 3pm is specified as <code>15:00</code>. <br />- Here is an example: <code>&lt;time itemprop=&quot;openingHours&quot; datetime=&quot;Tu,Th 16:00-20:00&quot;&gt;Tuesdays and Thursdays 4-8pm&lt;/time&gt;</code>. <br />- If a business is open 7 days a week, then it can be specified as <code>&lt;time itemprop=&quot;openingHours&quot; datetime=&quot;Mo-Su&quot;&gt;Monday through Sunday, all day&lt;/time&gt;</code>. - Domain: LocalBusiness - Domain: CivicStructure - Range: Duration -
-
- openingHoursSpecification - The opening hours of a certain place. - Domain: Place - Range: OpeningHoursSpecification -
-
- opens - The opening hour of the place or service on the given day(s) of the week. - Domain: OpeningHoursSpecification - Range: Time -
-
- operatingSystem - Operating systems supported (Windows 7, OSX 10.6, Android 1.6). - Domain: SoftwareApplication - Range: Text -
-
- opponent - A sub property of participant. The opponent on this action. - - Domain: ExerciseAction - Range: Person -
-
- option - A sub property of object. The options subject to this action. - - Domain: ChooseAction - Range: Text - Range: Thing -
-
- orderDate - Date order was placed. - Domain: Order - Range: DateTime -
-
- orderedItem - The item ordered. - Domain: Order - Range: Product -
-
- orderNumber - The identifier of the transaction. - Domain: Order - Range: Text -
-
- orderStatus - The current status of the order. - Domain: Order - Range: OrderStatus -
-
- origin - The place or point where a muscle arises. - Domain: Muscle - Range: AnatomicalStructure -
-
- originAddress - Shipper's address. - Domain: ParcelDelivery - Range: PostalAddress -
-
- originatesFrom - The vasculature the lymphatic structure originates, or afferents, from. - Domain: LymphaticVessel - Range: Vessel -
-
- outcome - Expected or actual outcomes of the study. - Domain: MedicalStudy - Range: Text -
-
- overdosage - Any information related to overdose on a drug, including signs or symptoms, treatments, contact information for emergency response. - Domain: Drug - Range: Text -
-
- overview - Descriptive information establishing the overarching theory/philosophy of the plan. May include the rationale for the name, the population where the plan first came to prominence, etc. - Domain: Diet - Range: Text -
-
- ownedFrom - The date and time of obtaining the product. - Domain: OwnershipInfo - Range: DateTime -
-
- ownedThrough - The date and time of giving up ownership on the product. - Domain: OwnershipInfo - Range: DateTime -
-
- owns - Products owned by the organization or person. - Domain: Organization - Domain: Person - Range: OwnershipInfo - Range: Product -
-
- parent - A parent of this person. - Domain: Person - Range: Person -
-
- parents - - A parents of the person (legacy spelling; see singular form, parent). - Domain: Person - Range: Person -
-
- parentService - A broadcast service to which the broadcast service may belong to such as regional variations of a national channel. - Domain: BroadcastService - Range: BroadcastService -
-
- participant - Other co-agents that participated in the action indirectly. e.g. John wrote a book with *Steve*. - Domain: Action - Range: Organization - Range: Person -
-
- partOfEpisode - The episode to which this clip belongs. - Domain: Clip - Range: Episode -
-
- partOfOrder - The overall order the items in this delivery were included in. - Domain: ParcelDelivery - Range: Order -
-
- partOfSeason - The season to which this episode belongs. - Domain: Episode - Domain: TVEpisode - Domain: Clip - Domain: RadioClip - Domain: RadioEpisode - Domain: TVClip - Range: Season -
-
- partOfSeries - The series to which this episode or season belongs. - Domain: Episode - Domain: TVEpisode - Domain: Season - Domain: TVSeason - Domain: Clip - Domain: RadioClip - Domain: RadioEpisode - Domain: RadioSeason - Domain: TVClip - Range: Series -
-
- partOfSystem - The anatomical or organ system that this structure is part of. - Domain: AnatomicalStructure - Range: AnatomicalSystem -
-
- partOfTVSeries - - The TV series to which this episode or season belongs. (legacy form; partOfSeries is preferred) - Domain: TVEpisode - Domain: TVSeason - Domain: TVClip - Range: TVSeries -
-
- pathophysiology - Changes in the normal mechanical, physical, and biochemical functions that are associated with this activity or condition. - Domain: PhysicalActivity - Domain: MedicalCondition - Range: Text -
-
- paymentAccepted - Cash, credit card, etc. - Domain: LocalBusiness - Range: Text -
-
- paymentDue - The date that payment is due. - Domain: Order - Range: DateTime -
-
- paymentMethod - The name of the credit card or other method of payment for the order. - Domain: Order - Range: PaymentMethod -
-
- paymentMethodId - An identifier for the method of payment used (e.g. the last 4 digits of the credit card). - Domain: Order - Range: Text -
-
- paymentUrl - The URL for sending a payment. - Domain: Order - Range: URL -
-
- performer - A performer at the event&#x2014;for example, a presenter, musician, musical group or actor. - Domain: Event - Range: Organization - Range: Person -
-
- performerIn - Event that this person is a performer or participant in. - Domain: Person - Range: Event -
-
- performers - - The main performer or performers of the event&#x2014;for example, a presenter, musician, or actor (legacy spelling; see singular form, performer). - Domain: Event - Range: Organization - Range: Person -
-
- permissions - Permission(s) required to run the app (for example, a mobile app may require full internet access or may run only on wifi). - Domain: SoftwareApplication - Range: Text -
-
- permitAudience - The target audience for this permit. - Domain: Permit - Range: Audience -
-
- phase - The phase of the trial. - Domain: MedicalTrial - Range: Text -
-
- photo - A photograph of this place. - - Domain: Place - Range: ImageObject - Range: Photograph -
-
- photos - - Photographs of this place (legacy spelling; see singular form, photo). - Domain: Place - Range: ImageObject - Range: Photograph -
-
- physiologicalBenefits - Specific physiologic benefits associated to the plan. - Domain: Diet - Range: Text -
-
- playerType - Player type required&#x2014;for example, Flash or Silverlight. - Domain: MediaObject - Range: Text -
-
- polygon - A polygon is the area enclosed by a point-to-point path for which the starting and ending points are the same. A polygon is expressed as a series of four or more space delimited points where the first and final points are identical. - Domain: GeoShape - Range: Text -
-
- population - Any characteristics of the population used in the study, e.g. 'males under 65'. - Domain: MedicalStudy - Range: Text -
-
- position - The position of an item in a series or sequence of items. - Domain: CreativeWork - Domain: ListItem - Range: Text - Range: Integer -
-
- possibleComplication - A possible unexpected and unfavorable evolution of a medical condition. Complications may include worsening of the signs or symptoms of the disease, extension of the condition to other organ systems, etc. - Domain: MedicalCondition - Range: Text -
-
- possibleTreatment - A possible treatment to address this condition, sign or symptom. - Domain: MedicalCondition - Domain: MedicalSignOrSymptom - Range: MedicalTherapy -
-
- postalCode - The postal code. For example, 94043. - Domain: PostalAddress - Range: Text -
-
- postOfficeBoxNumber - The post office box number for PO box addresses. - Domain: PostalAddress - Range: Text -
-
- postOp - A description of the postoperative procedures, care, and/or followups for this device. - Domain: MedicalDevice - Range: Text -
-
- predecessorOf - A pointer from a previous, often discontinued variant of the product to its newer variant. - Domain: ProductModel - Range: ProductModel -
-
- pregnancyCategory - Pregnancy category of this drug. - Domain: Drug - Range: DrugPregnancyCategory -
-
- pregnancyWarning - Any precaution, guidance, contraindication, etc. related to this drug's use during pregnancy. - Domain: Drug - Range: Text -
-
- preOp - A description of the workup, testing, and other preparations required before implanting this device. - Domain: MedicalDevice - Range: Text -
-
- preparation - Typical preparation that a patient must undergo before having the procedure performed. - Domain: MedicalProcedure - Range: Text -
-
- prepTime - The length of time it takes to prepare the recipe, in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 duration format</a>. - Domain: Recipe - Range: Duration -
-
- prescribingInfo - Link to prescribing information for the drug. - Domain: Drug - Range: URL -
-
- prescriptionStatus - Indicates whether this drug is available by prescription or over-the-counter. - Domain: Drug - Range: DrugPrescriptionStatus -
-
- previousStartDate - Used in conjunction with eventStatus for rescheduled or cancelled events. This property contains the previously scheduled start date. For rescheduled events, the startDate property should be used for the newly scheduled start date. In the (rare) case of an event that has been postponed and rescheduled multiple times, this field may be repeated. - Domain: Event - Range: Date -
-
- price - The offer price of a product, or of a price component when attached to PriceSpecification and its subtypes. -<br /> -<br /> - Usage guidelines: -<br /> -<ul> -<li>Use the <a href="http://github.com/priceCurrency">priceCurrency</a> property (with <a href="http://en.wikipedia.org/wiki/ISO_4217#Active_codes">ISO 4217 codes</a> e.g. "USD") instead of - including <a href="http://en.wikipedia.org/wiki/Dollar_sign#Currencies_that_use_the_dollar_or_peso_sign">ambiguous symbols</a> such as '$' in the value. -</li> -<li> - Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. -</li> -<li> - Note that both <a href="http://www.w3.org/TR/xhtml-rdfa-primer/#using-the-content-attribute">RDFa</a> and Microdata syntax allow the use of a "content=" attribute for publishing simple machine-readable values - alongside more human-friendly formatting. -</li> -<li> - Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similiar Unicode symbols. -</li> -</ul> - - - Domain: Offer - Domain: PriceSpecification - Domain: TradeAction - Range: Number - Range: Text -
-
- priceRange - The price range of the business, for example <code>$$$</code>. - Domain: LocalBusiness - Range: Text -
-
- priceSpecification - One or more detailed price specifications, indicating the unit price and delivery or payment charges. - Domain: Offer - Domain: Demand - Range: PriceSpecification -
-
- priceType - A short text or acronym indicating multiple price specifications for the same offer, e.g. SRP for the suggested retail price or INVOICE for the invoice price, mostly used in the car industry. - Domain: UnitPriceSpecification - Range: Text -
-
- priceValidUntil - The date after which the price is no longer available. - Domain: Offer - Range: Date -
-
- primaryImageOfPage - Indicates the main image on the page. - Domain: WebPage - Range: ImageObject -
-
- primaryPrevention - A preventative therapy used to prevent an initial occurrence of the medical condition, such as vaccination. - Domain: MedicalCondition - Range: MedicalTherapy -
-
- printColumn - The number of the column in which the NewsArticle appears in the print edition. - Domain: NewsArticle - Range: Text -
-
- printEdition - The edition of the print product in which the NewsArticle appears. - Domain: NewsArticle - Range: Text -
-
- printPage - If this NewsArticle appears in print, this field indicates the name of the page on which the article is found. Please note that this field is intended for the exact page name (e.g. A5, B18). - Domain: NewsArticle - Range: Text -
-
- printSection - If this NewsArticle appears in print, this field indicates the print section in which the article appeared. - Domain: NewsArticle - Range: Text -
-
- procedure - A description of the procedure involved in setting up, using, and/or installing the device. - Domain: MedicalDevice - Range: Text -
-
- procedureType - The type of procedure, for example Surgical, Noninvasive, or Percutaneous. - Domain: MedicalProcedure - Range: MedicalProcedureType -
-
- processingTime - Estimated processing time for the service using this channel. - Domain: ServiceChannel - Range: Duration -
-
- processorRequirements - Processor architecture required to run the application (e.g. IA64). - Domain: SoftwareApplication - Range: Text -
-
- producer - The producer of the movie, tv/radio series, season, or episode, or video. - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Season - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeries - Range: Person -
-
- produces - The tangible thing generated by the service, e.g. a passport, permit, etc. - Domain: Service - Range: Thing -
-
- productID - The product identifier, such as ISBN. For example: <code>&lt;meta itemprop='productID' content='isbn:123-456-789'/&gt;</code>. - Domain: Product - Range: Text -
-
- productionCompany - The production company or studio that made the movie, tv/radio series, season, or episode, or media object. - Domain: MediaObject - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Season - Domain: Series - Domain: TVSeries - Domain: VideoObject - Domain: RadioEpisode - Domain: RadioSeries - Range: Organization -
-
- productSupported - The product or service this support contact point is related to (such as product support for a particular product line). This can be a specific product or product line (e.g. "iPhone") or a general category of products or services (e.g. "smartphones"). - Domain: ContactPoint - Range: Product - Range: Text -
-
- proficiencyLevel - Proficiency needed for this content; expected values: 'Beginner', 'Expert'. - Domain: TechArticle - Range: Text -
-
- programmingLanguage - The computer programming language. - Domain: Code - Range: Thing -
-
- programmingModel - Indicates whether API is managed or unmanaged. - Domain: APIReference - Range: Text -
-
- proprietaryName - Proprietary name given to the diet plan, typically by its originator or creator. - Domain: Diet - Range: Text -
-
- proteinContent - The number of grams of protein. - Domain: NutritionInformation - Range: Mass -
-
- providesService - The service provided by this channel. - Domain: ServiceChannel - Range: Service -
-
- publication - A publication event associated with the episode, clip or media object. - Domain: MediaObject - Domain: Episode - Domain: Clip - Range: PublicationEvent -
-
- publicationType - The type of the medical article, taken from the US NLM MeSH <a href=http://www.nlm.nih.gov/mesh/pubtypes.html>publication type catalog. - Domain: MedicalScholarlyArticle - Range: Text -
-
- publishedOn - A broadcast service associated with the publication event. - Domain: PublicationEvent - Range: BroadcastService -
-
- publisher - The publisher of the creative work. - Domain: CreativeWork - Range: Organization -
-
- publishingPrinciples - Link to page describing the editorial principles of the organization primarily responsible for the creation of the CreativeWork. - Domain: CreativeWork - Range: URL -
-
- purpose - A goal towards an action is taken. Can be concrete or abstract. - Domain: MedicalDevice - Domain: AllocateAction - Domain: PayAction - Range: MedicalDevicePurpose - Range: Thing -
-
- qualifications - Specific qualifications required for this role. - Domain: JobPosting - Range: Text -
-
- query - A sub property of instrument. The query used on this action. - - Domain: SearchAction - Range: Class - Range: Text -
-
- question - A sub property of object. A question. - - Domain: AskAction - Range: Text -
-
- rangeIncludes - Relates a property to a class that constitutes (one of) the expected type(s) for values of the property. - Domain: Property - Range: Class -
-
- ratingCount - The count of total number of ratings. - Domain: AggregateRating - Range: Number -
-
- ratingValue - The rating for the content. - Domain: Rating - Range: Text -
-
- realEstateAgent - A sub property of participant. The real estate agent involved in the action. - - Domain: RentAction - Range: RealEstateAgent -
-
- recipe - A sub property of instrument. The recipe/instructions used to perform the action. - - Domain: CookAction - Range: Recipe -
-
- recipeCategory - The category of the recipe&#x2014;for example, appetizer, entree, etc. - Domain: Recipe - Range: Text -
-
- recipeCuisine - The cuisine of the recipe (for example, French or Ethiopian). - Domain: Recipe - Range: Text -
-
- recipeInstructions - The steps to make the dish. - Domain: Recipe - Range: Text -
-
- recipeYield - The quantity produced by the recipe (for example, number of people served, number of servings, etc). - Domain: Recipe - Range: Text -
-
- recipient - A sub property of participant. The participant who is at the receiving end of the action. - - Domain: CommunicateAction - Domain: AuthorizeAction - Domain: DonateAction - Domain: GiveAction - Domain: PayAction - Domain: ReturnAction - Domain: SendAction - Domain: TipAction - Range: Audience - Range: Organization - Range: Person -
-
- recognizingAuthority - If applicable, the organization that officially recognizes this entity as part of its endorsed system of medicine. - Domain: MedicalEntity - Range: Organization -
-
- recommendationStrength - Strength of the guideline's recommendation (e.g. 'class I'). - Domain: MedicalGuidelineRecommendation - Range: Text -
-
- recommendedIntake - Recommended intake of this supplement for a given population as defined by a specific recommending authority. - Domain: DietarySupplement - Range: RecommendedDoseSchedule -
-
- regionDrained - The anatomical or organ system drained by this vessel; generally refers to a specific part of an organ. - Domain: LymphaticVessel - Domain: Vein - Range: AnatomicalStructure - Range: AnatomicalSystem -
-
- regionsAllowed - The regions where the media is allowed. If not specified, then it's assumed to be allowed everywhere. Specify the countries in <a href='http://en.wikipedia.org/wiki/ISO_3166'>ISO 3166 format</a>. - Domain: MediaObject - Range: Place -
-
- relatedAnatomy - Anatomical systems or structures that relate to the superficial anatomy. - Domain: SuperficialAnatomy - Range: AnatomicalStructure - Range: AnatomicalSystem -
-
- relatedCondition - A medical condition associated with this anatomy. - Domain: AnatomicalStructure - Domain: AnatomicalSystem - Domain: SuperficialAnatomy - Range: MedicalCondition -
-
- relatedDrug - Any other drug related to this one, for example commonly-prescribed alternatives. - Domain: Drug - Range: Drug -
-
- relatedLink - A link related to this web page, for example to other related web pages. - Domain: WebPage - Range: URL -
-
- relatedStructure - Related anatomical structure(s) that are not part of the system but relate or connect to it, such as vascular bundles associated with an organ system. - Domain: AnatomicalSystem - Range: AnatomicalStructure -
-
- relatedTherapy - A medical therapy related to this anatomy. - Domain: AnatomicalStructure - Domain: AnatomicalSystem - Domain: SuperficialAnatomy - Range: MedicalTherapy -
-
- relatedTo - The most generic familial relation. - Domain: Person - Range: Person -
-
- releaseDate - The release date of a product or product model. This can be used to distinguish the exact variant of a product. - Domain: Product - Range: Date -
-
- releaseNotes - Description of what changed in this version. - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- relevantSpecialty - If applicable, a medical specialty in which this entity is relevant. - Domain: MedicalEntity - Range: MedicalSpecialty -
-
- repetitions - Number of times one should repeat the activity. - Domain: ExercisePlan - Range: Number -
-
- replacee - A sub property of object. The object that is being replaced. - - Domain: ReplaceAction - Range: Thing -
-
- replacer - A sub property of object. The object that replaces. - - Domain: ReplaceAction - Range: Thing -
-
- replyToUrl - The URL at which a reply may be posted to the specified UserComment. - Domain: UserComments - Range: URL -
-
- representativeOfPage - Indicates whether this image is representative of the content of the page. - Domain: ImageObject - Range: Boolean -
-
- requiredGender - Audiences defined by a person's gender. - Domain: PeopleAudience - Range: Text -
-
- requiredMaxAge - Audiences defined by a person's maximum age. - Domain: PeopleAudience - Range: Integer -
-
- requiredMinAge - Audiences defined by a person's minimum age. - Domain: PeopleAudience - Range: Integer -
-
- requirements - Component dependency requirements for application. This includes runtime environments and shared libraries that are not included in the application distribution package, but required to run the application (Examples: DirectX, Java or .NET runtime). - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- requiresSubscription - Indicates if use of the media require a subscription (either paid or free). Allowed values are <code>true</code> or <code>false</code> (note that an earlier version had 'yes', 'no'). - Domain: MediaObject - Range: Boolean -
-
- responsibilities - Responsibilities associated with this role. - Domain: JobPosting - Range: Text -
-
- restPeriods - How often one should break from the activity. - Domain: ExercisePlan - Range: Text -
-
- result - The result produced in the action. e.g. John wrote *a book*. - Domain: Action - Range: Thing -
-
- resultReview - A sub property of result. The review that resulted in the performing of the action. - - Domain: ReviewAction - Range: Review -
-
- review - A review of the item. - Domain: CreativeWork - Domain: Organization - Domain: Place - Domain: Offer - Domain: Product - Range: Review -
-
- reviewBody - The actual body of the review. - Domain: Review - Range: Text -
-
- reviewCount - The count of total number of reviews. - Domain: AggregateRating - Range: Number -
-
- reviewedBy - People or organizations that have reviewed the content on this web page for accuracy and/or completeness. - Domain: WebPage - Range: Organization - Range: Person -
-
- reviewRating - The rating given in this review. Note that reviews can themselves be rated. The <code>reviewRating</code> applies to rating given by the review. The <code>aggregateRating</code> property applies to the review itself, as a creative work. - Domain: Review - Range: Rating -
-
- reviews - - Review of the item (legacy spelling; see singular form, review). - Domain: CreativeWork - Domain: Organization - Domain: Place - Domain: Offer - Domain: Product - Range: Review -
-
- riskFactor - A modifiable or non-modifiable factor that increases the risk of a patient contracting this condition, e.g. age, coexisting condition. - Domain: MedicalCondition - Range: MedicalRiskFactor -
-
- risks - Specific physiologic risks associated to the plan. - Domain: Diet - Range: Text -
-
- runsTo - The vasculature the lymphatic structure runs, or efferents, to. - Domain: LymphaticVessel - Range: Vessel -
-
- runtime - Runtime platform or script interpreter dependencies (Example - Java v1, Python2.3, .Net Framework 3.0) - Domain: Code - Range: Text -
-
- safetyConsideration - Any potential safety concern associated with the supplement. May include interactions with other drugs and foods, pregnancy, breastfeeding, known adverse reactions, and documented efficacy of the supplement. - Domain: DietarySupplement - Range: Text -
-
- salaryCurrency - The currency (coded using ISO 4217, http://en.wikipedia.org/wiki/ISO_4217 used for the main salary information in this job posting. - Domain: JobPosting - Range: Text -
-
- sameAs - URL of a reference Web page that unambiguously indicates the item's identity. E.g. the URL of the item's Wikipedia page, Freebase page, or official website. - Domain: Thing - Range: URL -
-
- sampleType - Full (compile ready) solution, code snippet, inline code, scripts, template. - Domain: Code - Range: Text -
-
- saturatedFatContent - The number of grams of saturated fat. - Domain: NutritionInformation - Range: Mass -
-
- scheduledTime - The time the object is scheduled to. - Domain: PlanAction - Domain: ReserveAction - Range: DateTime -
-
- screenshot - A link to a screenshot image of the app. - Domain: SoftwareApplication - Range: ImageObject - Range: URL -
-
- season - A season in a tv/radio series. - Domain: Series - Domain: TVSeries - Domain: RadioSeries - Range: Season -
-
- seasonNumber - Position of the season within an ordered group of seasons. - - Domain: Season - Domain: TVSeason - Range: Integer - Range: Text -
-
- seasons - - A season in a tv/radio series. (legacy spelling; see singular form, season) - Domain: Series - Domain: TVSeries - Domain: RadioSeries - Range: Season -
-
- secondaryPrevention - A preventative therapy used to prevent reoccurrence of the medical condition after an initial episode of the condition. - Domain: MedicalCondition - Range: MedicalTherapy -
-
- seeks - A pointer to products or services sought by the organization or person (demand). - Domain: Organization - Domain: Person - Range: Demand -
-
- seller - An entity which offers (sells / leases / lends / loans) the services / goods. A seller may also be a provider. - Domain: Order - Domain: BuyAction - Domain: Offer - Domain: Demand - Domain: Flight - Range: Organization - Range: Person - -
-
- sender - A sub property of participant. The participant who is at the sending end of the action. - - Domain: ReceiveAction - Range: Audience - Range: Organization - Range: Person -
-
- sensoryUnit - The neurological pathway extension that inputs and sends information to the brain or spinal cord. - Domain: Nerve - Range: AnatomicalStructure - Range: SuperficialAnatomy -
-
- serialNumber - The serial number or any alphanumeric identifier of a particular product. When attached to an offer, it is a shortcut for the serial number of the product included in the offer. - Domain: Offer - Domain: Demand - Domain: IndividualProduct - Range: Text -
-
- seriousAdverseOutcome - A possible serious complication and/or serious side effect of this therapy. Serious adverse outcomes include those that are life-threatening; result in death, disability, or permanent damage; require hospitalization or prolong existing hospitalization; cause congenital anomalies or birth defects; or jeopardize the patient and may require medical or surgical intervention to prevent one of the outcomes in this definition. - Domain: MedicalTherapy - Domain: MedicalDevice - Range: MedicalEntity -
-
- servesCuisine - The cuisine of the restaurant. - Domain: FoodEstablishment - Range: Text -
-
- serviceArea - The geographic area where the service is provided. - Domain: Service - Range: AdministrativeArea -
-
- serviceAudience - The audience eligible for this service. - Domain: Service - Range: Audience -
-
- serviceLocation - The location (e.g. civic structure, local business, etc.) where a person can go to access the service. - Domain: ServiceChannel - Range: Place -
-
- serviceOperator - The operating organization, if different from the provider. This enables the representation of services that are provided by an organization, but operated by another organization like a subcontractor. - Domain: GovernmentService - Range: Organization -
-
- servicePhone - The phone number to use to access the service. - Domain: ServiceChannel - Range: ContactPoint -
-
- servicePostalAddress - The address for accessing the service by mail. - Domain: ServiceChannel - Range: PostalAddress -
-
- serviceSmsNumber - The number to access the service by text message. - Domain: ServiceChannel - Range: ContactPoint -
-
- serviceType - The type of service being offered, e.g. veterans' benefits, emergency relief, etc. - Domain: Service - Range: Text -
-
- serviceUrl - The website to access the service. - Domain: ServiceChannel - Range: URL -
-
- servingSize - The serving size, in terms of the number of volume or mass. - Domain: NutritionInformation - Range: Text -
-
- sibling - A sibling of the person. - Domain: Person - Range: Person -
-
- siblings - - A sibling of the person (legacy spelling; see singular form, sibling). - Domain: Person - Range: Person -
-
- signDetected - A sign detected by the test. - Domain: MedicalTest - Range: MedicalSign -
-
- significance - The significance associated with the superficial anatomy; as an example, how characteristics of the superficial anatomy can suggest underlying medical conditions or courses of treatment. - Domain: SuperficialAnatomy - Range: Text -
-
- significantLink - One of the more significant URLs on the page. Typically, these are the non-navigation links that are clicked on the most. - Domain: WebPage - Range: URL -
-
- significantLinks - - The most significant URLs on the page. Typically, these are the non-navigation links that are clicked on the most (legacy spelling; see singular form, significantLink). - Domain: WebPage - Range: URL -
-
- signOrSymptom - A sign or symptom of this condition. Signs are objective or physically observable manifestations of the medical condition while symptoms are the subjective experience of the medical condition. - Domain: MedicalCondition - Range: MedicalSignOrSymptom -
-
- skills - Skills required to fulfill this role. - Domain: JobPosting - Range: Text -
-
- sku - The Stock Keeping Unit (SKU), i.e. a merchant-specific identifier for a product or service, or the product to which the offer refers. - Domain: Offer - Domain: Product - Domain: Demand - Range: Text -
-
- sodiumContent - The number of milligrams of sodium. - Domain: NutritionInformation - Range: Mass -
-
- softwareVersion - Version of the software instance. - Domain: SoftwareApplication - Range: Text -
-
- source - The anatomical or organ system that the artery originates from. - Domain: Artery - Range: AnatomicalStructure -
-
- sourcedFrom - The neurological pathway that originates the neurons. - Domain: Nerve - Range: BrainStructure -
-
- sourceOrganization - The Organization on whose behalf the creator was working. - Domain: CreativeWork - Range: Organization -
-
- spatial - The range of spatial applicability of a dataset, e.g. for a dataset of New York weather, the state of New York. - Domain: Dataset - Range: Place -
-
- specialCommitments - Any special commitments associated with this job posting. Valid entries include VeteranCommit, MilitarySpouseCommit, etc. - Domain: JobPosting - Range: Text -
-
- specialty - One of the domain specialities to which this web page's content applies. - Domain: WebPage - Range: Specialty -
-
- sponsor - Sponsor of the study. - Domain: MedicalStudy - Range: Organization -
-
- sportsActivityLocation - A sub property of location. The sports activity location where this action occurred. - - Domain: ExerciseAction - Range: SportsActivityLocation -
-
- sportsEvent - A sub property of location. The sports event where this action occurred. - - Domain: ExerciseAction - Range: SportsEvent -
-
- sportsTeam - A sub property of participant. The sports team that participated on this action. - - Domain: ExerciseAction - Range: SportsTeam -
-
- spouse - The person's spouse. - Domain: Person - Range: Person -
-
- stage - The stage of the condition, if applicable. - Domain: MedicalCondition - Range: MedicalConditionStage -
-
- stageAsNumber - The stage represented as a number, e.g. 3. - Domain: MedicalConditionStage - Range: Number -
-
- startDate - The start date and time of the event, role or item (in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 date format</a>). - - - - Domain: Role - Domain: Event - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Range: Date -
-
- startTime - The startTime of something. For a reserved event or service (e.g. FoodEstablishmentReservation), the time that it is expected to start. For actions that span a period of time, when the action was performed. e.g. John wrote a book from *January* to December. - -Note that Event uses startDate/endDate instead of startTime/endTime, even when describing dates with times. This situation may be clarified in future revisions. - - Domain: Action - Domain: FoodEstablishmentReservation - Range: DateTime -
-
- status - The status of the study (enumerated). - Domain: MedicalStudy - Range: MedicalStudyStatus -
-
- storageRequirements - Storage requirements (free space required). - Domain: SoftwareApplication - Range: Text - Range: URL -
-
- streetAddress - The street address. For example, 1600 Amphitheatre Pkwy. - Domain: PostalAddress - Range: Text -
-
- strengthUnit - The units of an active ingredient's strength, e.g. mg. - Domain: DrugStrength - Range: Text -
-
- strengthValue - The value of an active ingredient's strength, e.g. 325. - Domain: DrugStrength - Range: Number -
-
- structuralClass - The name given to how bone physically connects to each other. - Domain: Joint - Range: Text -
-
- study - A medical study or trial related to this entity. - Domain: MedicalEntity - Range: MedicalStudy -
-
- studyDesign - Specifics about the observational study design (enumerated). - Domain: MedicalObservationalStudy - Range: MedicalObservationalStudyDesign -
-
- studyLocation - The location in which the study is taking/took place. - Domain: MedicalStudy - Range: AdministrativeArea -
-
- studySubject - A subject of the study, i.e. one of the medical conditions, therapies, devices, drugs, etc. investigated by the study. - Domain: MedicalStudy - Range: MedicalEntity -
-
- subEvent - An Event that is part of this event. For example, a conference event includes many presentations, each of which is a subEvent of the conference. - Domain: Event - Range: Event -
-
- subEvents - - Events that are a part of this event. For example, a conference event includes many presentations, each subEvents of the conference (legacy spelling; see singular form, subEvent). - Domain: Event - Range: Event -
-
- subOrganization - A relationship between two organizations where the first includes the second, e.g., as a subsidiary. See also: the more specific 'department' property. - Domain: Organization - Range: Organization -
-
- subStageSuffix - The substage, e.g. 'a' for Stage IIIa. - Domain: MedicalConditionStage - Range: Text -
-
- subStructure - Component (sub-)structure(s) that comprise this anatomical structure. - Domain: AnatomicalStructure - Range: AnatomicalStructure -
-
- subTest - A component test of the panel. - Domain: MedicalTestPanel - Range: MedicalTest -
-
- subtype - A more specific type of the condition, where applicable, for example 'Type 1 Diabetes', 'Type 2 Diabetes', or 'Gestational Diabetes' for Diabetes. - Domain: MedicalCondition - Range: Text -
-
- successorOf - A pointer from a newer variant of a product to its previous, often discontinued predecessor. - Domain: ProductModel - Range: ProductModel -
-
- sugarContent - The number of grams of sugar. - Domain: NutritionInformation - Range: Mass -
-
- suggestedGender - The gender of the person or audience. - Domain: PeopleAudience - Range: Text -
-
- suggestedMaxAge - Maximal age recommended for viewing content. - Domain: PeopleAudience - Range: Number -
-
- suggestedMinAge - Minimal age recommended for viewing content. - Domain: PeopleAudience - Range: Number -
-
- superEvent - An event that this event is a part of. For example, a collection of individual music performances might each have a music festival as their superEvent. - Domain: Event - Range: Event -
-
- supplyTo - The area to which the artery supplies blood. - Domain: Artery - Range: AnatomicalStructure -
-
- targetDescription - The description of a node in an established educational framework. - Domain: AlignmentObject - Range: Text -
-
- targetName - The name of a node in an established educational framework. - Domain: AlignmentObject - Range: Text -
-
- targetPlatform - Type of app development: phone, Metro style, desktop, XBox, etc. - Domain: APIReference - Range: Text -
-
- targetPopulation - Characteristics of the population for which this is intended, or which typically uses it, e.g. 'adults'. - Domain: DietarySupplement - Domain: DoseSchedule - Range: Text -
-
- targetProduct - Target Operating System / Product to which the code applies. If applies to several versions, just the product name can be used. - Domain: Code - Range: SoftwareApplication -
-
- targetUrl - The URL of a node in an established educational framework. - Domain: AlignmentObject - Range: URL -
-
- taxID - The Tax / Fiscal ID of the organization or person, e.g. the TIN in the US or the CIF/NIF in Spain. - Domain: Organization - Domain: Person - Range: Text -
-
- telephone - The telephone number. - Domain: Organization - Domain: Place - Domain: ContactPoint - Domain: Person - Range: Text -
-
- temporal - The range of temporal applicability of a dataset, e.g. for a 2011 census dataset, the year 2011 (in ISO 8601 time interval format). - Domain: Dataset - Range: DateTime -
-
- text - The textual content of this CreativeWork. - Domain: CreativeWork - Range: Text -
-
- thumbnail - Thumbnail image for an image or video. - Domain: ImageObject - Domain: VideoObject - Range: ImageObject -
-
- thumbnailUrl - A thumbnail image relevant to the Thing. - Domain: CreativeWork - Range: URL -
-
- tickerSymbol - The exchange traded instrument associated with a Corporation object. The tickerSymbol is expressed as an exchange and an instrument name separated by a space character. For the exchange component of the tickerSymbol attribute, we reccommend using the controlled vocaulary of Market Identifier Codes (MIC) specified in ISO15022. - Domain: Corporation - Range: Text -
-
- timeRequired - Approximate or typical time it takes to work with or through this learning resource for the typical intended target audience, e.g. 'P30M', 'P1H25M'. - Domain: CreativeWork - Range: Duration -
-
- tissueSample - The type of tissue sample required for the test. - Domain: PathologyTest - Range: Text -
-
- title - The title of the job. - Domain: JobPosting - Range: Text -
-
- toLocation - A sub property of location. The final location of the object or the agent after the action. - - Domain: InsertAction - Domain: MoveAction - Domain: TransferAction - Domain: ExerciseAction - Range: Number - Range: Place -
-
- totalTime - The total time it takes to prepare and cook the recipe, in <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 duration format</a>. - Domain: Recipe - Range: Duration -
-
- track - A music recording (track)&#x2014;usually a single song. - Domain: MusicPlaylist - Domain: MusicGroup - Range: MusicRecording -
-
- trackingNumber - Shipper tracking number. - Domain: ParcelDelivery - Range: Text -
-
- trackingUrl - Tracking url for the parcel delivery. - Domain: ParcelDelivery - Range: URL -
-
- tracks - - A music recording (track)&#x2014;usually a single song (legacy spelling; see singular form, track). - Domain: MusicPlaylist - Domain: MusicGroup - Range: MusicRecording -
-
- trailer - The trailer of a movie or tv/radio series, season, or episode. - Domain: Movie - Domain: Episode - Domain: TVEpisode - Domain: Season - Domain: TVSeason - Domain: Series - Domain: TVSeries - Domain: RadioEpisode - Domain: RadioSeason - Domain: RadioSeries - Range: VideoObject -
-
- transcript - If this MediaObject is an AudioObject or VideoObject, the transcript of that object. - Domain: AudioObject - Domain: VideoObject - Range: Text -
-
- transFatContent - The number of grams of trans fat. - Domain: NutritionInformation - Range: Mass -
-
- transmissionMethod - How the disease spreads, either as a route or vector, for example 'direct contact', 'Aedes aegypti', etc. - Domain: InfectiousDisease - Range: Text -
-
- trialDesign - Specifics about the trial design (enumerated). - Domain: MedicalTrial - Range: MedicalTrialDesign -
-
- tributary - The anatomical or organ system that the vein flows into; a larger structure that the vein connects to. - Domain: Vein - Range: AnatomicalStructure -
-
- typeOfGood - The product that this structured value is referring to. - Domain: OwnershipInfo - Domain: TypeAndQuantityNode - Range: Product -
-
- typicalAgeRange - The typical expected age range, e.g. '7-9', '11-'. - Domain: CreativeWork - Domain: Event - Range: Text -
-
- typicalTest - A medical test typically performed given this condition. - Domain: MedicalCondition - Range: MedicalTest -
-
- unitCode - The unit of measurement given using the UN/CEFACT Common Code (3 characters). - Domain: QuantitativeValue - Domain: TypeAndQuantityNode - Domain: UnitPriceSpecification - Range: Text -
-
- unsaturatedFatContent - The number of grams of unsaturated fat. - Domain: NutritionInformation - Range: Mass -
-
- uploadDate - Date when this media object was uploaded to this site. - Domain: MediaObject - Range: Date -
-
- url - URL of the item. - Domain: Thing - Range: URL -
-
- usedToDiagnose - A condition the test is used to diagnose. - Domain: MedicalTest - Range: MedicalCondition -
-
- usesDevice - Device used to perform the test. - Domain: MedicalTest - Range: MedicalDevice -
-
- validFor - The time validity of the permit. - Domain: Permit - Range: Duration -
-
- validFrom - The date when the item becomes valid. - Domain: Offer - Domain: PriceSpecification - Domain: Demand - Domain: OpeningHoursSpecification - Domain: Permit - Range: DateTime -
-
- validIn - The geographic area where the permit is valid. - Domain: Permit - Range: AdministrativeArea -
-
- validThrough - The end of the validity of offer, price specification, or opening hours data. - Domain: Offer - Domain: PriceSpecification - Domain: Demand - Domain: OpeningHoursSpecification - Range: DateTime -
-
- validUntil - The date when the item is no longer valid. - Domain: Permit - Range: Date -
-
- value - The value of the product characteristic. - Domain: QuantitativeValue - Range: Number -
-
- valueAddedTaxIncluded - Specifies whether the applicable value-added tax (VAT) is included in the price specification or not. - Domain: PriceSpecification - Range: Boolean -
-
- valueReference - A pointer to a secondary value that provides additional information on the original value, e.g. a reference temperature. - Domain: QualitativeValue - Domain: QuantitativeValue - Range: Enumeration - Range: StructuredValue -
-
- vatID - The Value-added Tax ID of the organization or person. - Domain: Organization - Domain: Person - Range: Text -
-
- vendor - 'vendor' is an earlier term for 'seller'. - - Domain: BuyAction - Range: Organization - Range: Person - -
-
- version - The version of the CreativeWork embodied by a specified resource. - Domain: CreativeWork - Range: Number -
-
- video - An embedded video object. - Domain: CreativeWork - Range: VideoObject -
-
- videoFrameSize - The frame size of the video. - Domain: VideoObject - Range: Text -
-
- videoQuality - The quality of the video. - Domain: VideoObject - Range: Text -
-
- warning - Any FDA or other warnings about the drug (text or URL). - Domain: Drug - Range: Text - Range: URL -
-
- warranty - The warranty promise(s) included in the offer. - Domain: Offer - Domain: Demand - Range: WarrantyPromise -
-
- warrantyPromise - The warranty promise(s) included in the offer. - Domain: BuyAction - Domain: SellAction - Range: WarrantyPromise -
-
- warrantyScope - The scope of the warranty promise. - Domain: WarrantyPromise - Range: WarrantyScope -
-
- weight - The weight of the product or person. - Domain: Product - Domain: Person - Range: QuantitativeValue -
-
- width - The width of the item. - Domain: MediaObject - Domain: Product - Range: Distance - Range: QuantitativeValue -
-
- winner - A sub property of participant. The winner of the action. - - Domain: LoseAction - Range: Person -
-
- wordCount - The number of words in the text of the Article. - Domain: Article - Range: Integer -
-
- workHours - The typical working hours for this job (e.g. 1st shift, night shift, 8am-5pm). - Domain: JobPosting - Range: Text -
-
- workload - Quantitative measure of the physiologic output of the exercise; also referred to as energy expenditure. - Domain: ExercisePlan - Range: Energy -
-
- workLocation - A contact location for a person's place of work. - Domain: Person - Range: ContactPoint - Range: Place -
-
- worksFor - Organizations that the person works for. - Domain: Person - Range: Organization -
-
- worstRating - The lowest value allowed in this rating system. If worstRating is omitted, 1 is assumed. - Domain: Rating - Range: Number - Range: Text -
-
- yearlyRevenue - The size of the business in annual revenue. - Domain: BusinessAudience - Range: QuantitativeValue -
-
- yearsInOperation - The age of the business. - Domain: BusinessAudience - Range: QuantitativeValue -
- -
- WikiDoc - This class contains information contributed by <a href=http://wikidoc.org>WikiDoc</a>. -
- -
- Stack Exchange - The Question/Answer types were <a href="https://www.w3.org/wiki/WebSchemas/QASchemaResearch">based on</a> the Stack Overflow API. -
- -
- rNews - This class contains derivatives of IPTC rNews properties. rNews is a data model of publishing metadata with serializations currently available for RDFa as well as HTML5 Microdata. More information about the IPTC and rNews can be found at <a href=http://rnews.org>rnews.org</a>. -
- -
- DatasetClass - This class is based upon W3C DCAT work, and benefits from collaboration around the DCAT, ADMS and VoID vocabularies. See http://www.w3.org/wiki/WebSchemas/Datasets for full details and mappings. -
- -
- GoodRelationsClass - This class is derived from the GoodRelations Vocabulary for E-Commerce, created by Martin Hepp. GoodRelations is a data model for sharing e-commerce data on the Web that can be expressed in a variety of syntaxes, including RDFa and HTML5 Microdata. More information about GoodRelations can be found at <a href="http://purl.org/goodrelations/">http://purl.org/goodrelations/</a>. -
- -
- GoodRelationsProperties - This class contains derivatives of properties from the GoodRelations Vocabulary for E-Commerce, created by Martin Hepp. GoodRelations is a data model for sharing e-commerce data on the Web that can be expressed in a variety of syntaxes, including RDFa and HTML5 Microdata. More information about GoodRelations can be found at <a href="http://purl.org/goodrelations/">http://purl.org/goodrelations/</a>. -
- -
- LRMIClass - This class is based on the work of the LRMI project, see lrmi.net for details. -
- -
- ActionCollabClass - The schema.org Actions mechanism benefited from extensive discussions across the Web standards community around W3C, in particular from the <a href="http://purl.org/hydra/"> Hydra project</a>'s community group. -
- -
- BibExTerm - The W3C <a href="http://www.w3.org/community/schemabibex/">Schema Bib Extend</a> (BibEx) group led the work to improve schema.org for bibliographic information, including terms for periodicals, articles and multi-volume works. The design was inspired in places (e.g. pageStart, pageEnd, pagination) by the <a href="http://bibliontology.com/">Bibliographic Ontology</a>, 'bibo'. -
- -
- - - - -

Reservations

- -
- Reservation - Describes a reservation for travel, dining or an event. Some reservations require tickets.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, restaurant reservations, flights, or rental cars, use http://schema.org/Offer.

- Subclass of: Intangible -
-
- BusReservation - A reservation for bus travel.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use http://schema.org/Offer.

- Subclass of: Reservation -
-
- EventReservation - A reservation for an event like a concert, sporting event, or lecture.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use http://schema.org/Offer.

- Subclass of: Reservation -
-
- FlightReservation - A reservation for air travel.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use http://schema.org/Offer.

- Subclass of: Reservation -
-
- FoodEstablishmentReservation - A reservation to dine at a food-related business.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations.

- Subclass of: Reservation -
-
- LodgingReservation - A reservation for lodging at a hotel, motel, inn, etc.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations.

- Subclass of: Reservation -
-
- RentalCarReservation - A reservation for a rental car.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations.

- Subclass of: Reservation -
-
- TaxiReservation - A reservation for a taxi.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use http://schema.org/Offer.

- Subclass of: Reservation -
-
- TrainReservation - A reservation for train travel.

Note: This type is for information about actual reservations, e.g. in confirmation emails or HTML pages with individual confirmations of reservations. For offers of tickets, use http://schema.org/Offer.

- Subclass of: Reservation -
-
- ReservationPackage - A group of multiple reservations with common values for all sub-reservations. - Subclass of: Reservation -
-
- ReservationStatusType - Enumerated status values for Reservation. - Subclass of: Enumeration -
-
- ReservationCancelled - The status for a previously confirmed reservation that is now cancelled. - type: ReservationStatusType -
-
- ReservationConfirmed - The status of a confirmed reservation. - type: ReservationStatusType -
-
- ReservationHold - The status of a reservation on hold pending an update like credit card number or flight changes. - type: ReservationStatusType -
-
- ReservationPending - The status of a reservation when a request has been sent, but not confirmed. - type: ReservationStatusType -
-
- Bus Trip - A trip on a commercial bus line. - Subclass of: Intangible -
-
- Train Trip - A trip on a commercial train line. - Subclass of: Intangible -
-
- Flight - An airline flight. - Subclass of: Intangible -
-
- Airline - An organization that provides flights for passengers. - Subclass of: Organization -
-
- Program Membership - Used to describe membership in a loyalty programs (e.g. "StarAliance"), traveler clubs (e.g. "AAA"), purchase clubs ("Safeway Club"), etc. - Subclass of: Intangible -
-
- Ticket - Used to describe a ticket to an event, a flight, a bus ride, etc. - Subclass of: Intangible -
-
- Seat - Used to describe a seat, such as a reserved seat in an event reservation. - Subclass of: Intangible -
-
- Taxi - A taxi. - Subclass of: Service -
-
- Vehicle - A vehicle. - Subclass of: Product -
-
- Car - An automobile. - Subclass of: Vehicle -
-
- reservationId - A unique identifier for the reservation. - domain: Reservation - Range: Text -
-
- reservationStatus - The current status of the reservation. - domain: Reservation - Range: ReservationStatusType -
-
- reservationFor - The thing -- flight, event, restaurant,etc. being reserved. - domain: Reservation - Range: Thing -
-
- underName - The person or organization the reservation or ticket is for. - domain: Reservation - domain: Ticket - Range: Person - Range: Organization -
-
- provider - The service provider, service operator, or service performer; the goods producer. Another party (a seller) may offer those services or goods on behalf of the provider. A provider may also serve as the seller. - domain: CreativeWork - domain: Service - domain: Reservation - domain: Flight - domain: ParcelDelivery - domain: TrainTrip - domain: BusTrip - Range: Person - Range: Organization -
-
- bookingAgent - 'bookingAgent' is an out-dated term indicating a 'broker' that serves as a booking agent. - domain: Reservation - Range: Person - Range: Organization - -
-
- bookingTime - The date and time the reservation was booked. - domain: Reservation - Range: DateTime -
-
- modifiedTime - The date and time the reservation was modified. - domain: Reservation - Range: DateTime -
-
- programMembershipUsed - Any membership in a frequent flyer, hotel loyalty program, etc. being applied to the reservation. - domain: Reservation - Range: ProgramMembership -
-
- reservedTicket - A ticket associated with the reservation. - domain: Reservation - Range: Ticket -
-
- totalPrice - The total price for the reservation or ticket, including applicable taxes, shipping, etc. - domain: Reservation - domain: Ticket - Range: Number - Range: Text - Range: PriceSpecification -
-
- priceCurrency - The currency (in 3-letter ISO 4217 format) of the price or a price component, when attached to PriceSpecification and its subtypes. - domain: Reservation - domain: Ticket - Domain: Offer - Domain: PriceSpecification - Range: Text -
-
- membershipNumber - A unique identifier for the membership. - domain: ProgramMembership - Range: Text -
-
- programName - The program providing the membership. - domain: ProgramMembership - Range: Text -
-
- hostingOrganization - The organization (airline, travelers' club, etc.) the membership is made with. - domain: ProgramMembership - Range: Organization -
-
- issuedBy - The organization issuing the ticket or permit. - domain: Ticket - Domain: Permit - Range: Organization -
-
- dateIssued - The date the ticket was issued. - domain: Ticket - Range: DateTime -
-
- ticketedSeat - The seat associated with the ticket. - domain: Ticket - Range: Seat -
-
- ticketNumber - The unique identifier for the ticket. - domain: Ticket - Range: Text -
-
- ticketToken - Reference to an asset (e.g., Barcode, QR code image or PDF) usable for entrance. - domain: Ticket - Range: Text - Range: URL -
-
- seatNumber - The location of the reserved seat (e.g., 27). - domain: Seat - Range: Text -
-
- seatRow - The row location of the reserved seat (e.g., B). - domain: Seat - Range: Text -
-
- seatSection - The section location of the reserved seat (e.g. Orchestra). - domain: Seat - Range: Text -
-
- seatingType - The type/class of the seat. - domain: Seat - Range: Text - Range: QualitativeValue -
-
- subReservation - The individual reservations included in the package. Typically a repeated property. - domain: ReservationPackage - Range: Reservation -
-
- boardingGroup - The airline-specific indicator of boarding order / preference. - domain: ReservationPackage - Range: Text -
-
- flightNumber - The unique identifier for a flight including the airline IATA code. For example, if describing United flight 110, where the IATA code for United is 'UA', the flightNumber is 'UA110'. - domain: Flight - Range: Text -
- - -
- departureTime - The expected departure time. - domain: BusTrip - domain: Flight - domain: TrainTrip - Range: DateTime -
-
- arrivalTime - The expected arrival time. - domain: BusTrip - domain: Flight - domain: TrainTrip - Range: DateTime -
-
- departureAirport - The airport where the flight originates. - domain: Flight - Range: Airport -
-
- departureAirport - The airport where the flight terminates. - domain: Flight - Range: Airport -
-
- departureGate - Identifier of the flight's departure gate. - domain: Flight - Range: Text -
-
- arrivalGate - Identifier of the flight's arrival gate. - domain: Flight - Range: Text -
-
- departureTerminal - Identifier of the flight's departure terminal. - domain: Flight - Range: Text -
-
- arrivalTerminal - Identifier of the flight's arrival terminal. - domain: Flight - Range: Text -
-
- aircraft - The kind of aircraft (e.g., "Boeing 747"). - domain: Flight - Range: Text - Range: Vehicle -
-
- mealService - Description of the meals that will be provided or available for purchase. - domain: Flight - Range: Text -
-
- estimatedFlightDuration - The estimated time the flight will take. - domain: Flight - Range: Text - Range: Duration -
-
- flightDistance - The distance of the flight. - domain: Flight - Range: Text - Range: Distance -
-
- webCheckinTime - The time when a passenger can check into the flight online. - domain: Flight - Range: DateTime -
-
- iataCode - IATA identifier for an airline or airport - domain: Airline - domain: Airport - Range: Text -
-
- iacoCode - IACO identifier for an airport. - domain: Airport - Range: Text -
-
- partySize - Number of people the reservation should accommodate. - domain: FoodEstablishmentReservation - domain: TaxiReservation - Range: Number - Range: QuantitativeValue -
-
- trainNumber - The unique identifier for the train. - domain: TrainTrip - Range: Text -
-
- trainName - The name of the train (e.g. The Orient Express). - domain: TrainTrip - Range: Text -
-
- departureStation - The station from which the train departs. - domain: TrainTrip - Range: TrainStation -
-
- arrivalStation - The station where the train trip ends. - domain: TrainTrip - Range: TrainStation -
-
- departurePlatform - The platform from which the train departs. - domain: TrainTrip - Range: Text -
-
- arrivalPlatform - The platform where the train arrives. - domain: TrainTrip - Range: Text -
-
- busNumber - The unique identifier for the bus. - domain: BusTrip - Range: Text -
-
- busName - The name of the bus (e.g. Bolt Express). - domain: BusTrip - Range: Text -
-
- departureBusStop - The stop or station from which the bus departs. - domain: BusTrip - Range: BusStation - Range: BusStop -
-
- arrivalBusStop - The stop or station from which the bus arrives. - domain: BusTrip - Range: BusStation - Range: BusStop -
-
- pickupLocation - Where a taxi will pick up a passenger or a rental car can be picked up. - domain: RentalCarReservation - domain: TaxiReservation - Range: Place -
-
- dropoffLocation - Where a rental car can be dropped off. - domain: RentalCarReservation - Range: Place -
-
- pickupTime - When a taxi will pickup a passenger or a rental car can be picked up. - domain: RentalCarReservation - domain: TaxiReservation - Range: DateTime -
-
- dropoffTime - When a rental car can be dropped off. - domain: RentalCarReservation - Range: DateTime -
-
- checkinTime - The earliest someone may check into a lodging establishment. - domain: LodgingReservation - Range: DateTime -
-
- checkoutTime - The latest someone may check out of a lodging establishment. - domain: LodgingReservation - Range: DateTime -
-
- lodgingUnitType - Textual description of the unit type (including suite vs. room, size of bed, etc.). - domain: LodgingReservation - Range: Text - Range: QualitativeValue -
-
- lodgingUnitDescription - A full description of the lodging unit. - domain: LodgingReservation - Range: Text -
-
- numAdults - The number of adults staying in the unit. - domain: LodgingReservation - Range: Number - Range: QuantitativeValue -
-
- numChildren - The number of children staying in the unit. - domain: LodgingReservation - Range: Number - Range: QuantitativeValue -
- - -
- -

Questions and Answers (QA) and FAQ schema

-

Enrichment of Schema.org to enable annotation of questions and answers content, as discussed on public-vocabs@w3.org.

-

See wiki for details.

- - -
- QAPage - A QAPage is a WebPage focussed on a specific Question and its Answer(s), e.g. in a question answering site or documenting Frequently Asked Questions (FAQs). - Subclass of: WebPage -
- - -
- -
- - -
- Question - A specific question - e.g. from a user seeking answers online, or collected in a Frequently Asked Questions (FAQ) document. - Subclass of: CreativeWork - Source: Stack Overflow -
- -
- upvoteCount - The number of upvotes this question has received from the community. - Domain: Question - Domain: Answer - Domain: Comment - Range: Integer -
-
- downvoteCount - The number of downvotes this question has received from the community. - Domain: Question - Domain: Answer - Domain: Comment - Range: Integer -
- - - - - -
- answerCount - The number of answers this question has received. - Domain: Question - Range: Integer -
-
- commentCount - The number of comments this CreativeWork (e.g. Article, Question or Answer) has received. This is most applicable to works published in Web sites with commenting system; additional comments may exist elsewhere. - Domain: CreativeWork - Range: Integer -
- -
- acceptedAnswer - The answer that has been accepted as best, typically on a Question/Answer site. Sites vary in their selection mechanisms, e.g. drawing on community opinion and/or the view of the Question author. - - Domain: Question - Range: Answer -
- - -
- Answer - An answer offered to a question; perhaps correct, perhaps opinionated or wrong. - Subclass of: CreativeWork - Source: Stack Overflow -
- -
- parentItem - The parent of a question, answer or item in general. - Domain: Answer - Domain: Comment - Range: Question -
- - - - - -
- suggestedAnswer - An answer (possibly one of several, possibly incorrect) to a Question, e.g. on a Question/Answer site. - Domain: Question - Range: Answer -
- - -
- -

EmailMessage

- -
- EmailMessage - An email message. - Subclass of: CreativeWork -
- -
- - -

Potential Actions

- - -
- actionStatus - Indicates the current disposition of the Action. - Domain: Action - Range: ActionStatusType -
- -
- ActionStatusType - The status of an Action. - Subclass of: Enumeration -
- -
- PotentialActionStatus - A description of an action that is supported. -
- -
- ActiveActionStatus - An in-progress action (e.g, while watching the movie, or driving to a location). -
- -
- CompletedActionStatus - An action that has already taken place. -
- -
- potentialAction - Indicates a potential Action, which describes an idealized action in which this thing would play an 'object' role. - Domain: Thing - Range: Action -
- -
- EntryPoint - An entry point, within some Web-based protocol. - Subclass of: Intangible - Source: Action collaborations -
- - -
- target - Indicates a target EntryPoint for an Action. - Domain: Action - Range: EntryPoint -
- -
- httpMethod - An HTTP method that specifies the appropriate HTTP method for a request to an HTTP EntryPoint. Values are capitalized strings as used in HTTP. - Domain: EntryPoint - Range: Text -
- - -
- encodingType - The supported encoding type(s) for an EntryPoint request. - Domain: EntryPoint - Range: Text -
- -
- contentType - The supported content type(s) for an EntryPoint response. - Domain: EntryPoint - Range: Text -
- -
- application - An application that can complete the request. - Domain: EntryPoint - Range: SoftwareApplication -
- -
- PropertyValueSpecification - A Property value specification. - Subclass of: Intangible - Source: Action collaborations -
- -
- urlTemplate - An url template (RFC6570) that will be used to construct the target of the execution of the action. - Domain: EntryPoint - Range: Text -
- -
- valueName - Indicates the name of the PropertyValueSpecification to be used in URL templates and form encoding in a manner analogous to HTML's input@name. - Domain: PropertyValueSpecification - Range: Text -
- -
- valueRequired - Whether the property must be filled in to complete the action. Default is false. - Domain: PropertyValueSpecification - Range: Boolean -
- -
- defaultValue - The default value of the input. For properties that expect a literal, the default is a literal value, for properties that expect an object, it's an ID reference to one of the current values. - Domain: PropertyValueSpecification - Range: Thing - Range: Text -
- -
- readonlyValue - Whether or not a property is mutable. Default is false. Specifying this for a property that also has a value makes it act similar to a "hidden" input in an HTML form. - Domain: PropertyValueSpecification - Range: Boolean -
- -
- multipleValues - Whether multiple values are allowed for the property. Default is false. - Domain: PropertyValueSpecification - Range: Boolean -
- -
- valueMinLength - Specifies the minimum allowed range for number of characters in a literal value. - Domain: PropertyValueSpecification - Range: Number -
- -
- valueMaxLength - Specifies the allowed range for number of characters in a literal value. - Domain: PropertyValueSpecification - Range: Number -
- -
- valuePattern - Specifies a regular expression for testing literal values according to the HTML spec. - Domain: PropertyValueSpecification - Range: Number -
- - - -
- stepValue - The stepValue attribute indicates the granularity that is expected (and required) of the value in a PropertyValueSpecification. - Domain: PropertyValueSpecification - Range: Number -
- -

workPerformed

- -
- workPerformed - A work performed in some event, for example a play performed in a TheaterEvent. - domainIncludes: Event - rangeIncludes: CreativeWork -
- -

Role

- -
- Role - Represents additional information about a relationship or property. For example a Role can be used to say that a 'member' role linking some SportsTeam to a player occurred during a particular time period. Or that a Person's 'actor' role in a Movie was for some particular characterName. Such properties can be attached to a Role entity, which is then associated with the main entities using ordinary properties like 'member' or 'actor'. - - Subclass of: Intangible -
- -
- PerformanceRole - A PerformanceRole is a Role that some entity places with regard to a theatrical performance, e.g. in a Movie, TVSeries etc. - Subclass of: Role -
- -
- characterName - The name of a character played in some acting or performing role, i.e. in a PerformanceRole. - domainIncludes: PerformanceRole - rangeIncludes: Text -
- -
- OrganizationRole - A subclass of Role used to describe roles within organizations. - Subclass of: Role -
- -
- namedPosition - A position played, performed or filled by a person or organization, as part of an organization. For example, an athlete in a SportsTeam might play in the position named 'Quarterback'. - domainIncludes: OrganizationRole - rangeIncludes: Text - rangeIncludes: URL -
- -

WebSite

- -
- WebSite - A WebSite is a set of related web pages and other items typically served from a single web domain and accessible via URLs. - Subclass of: CreativeWork -
- -

Periodicals and BibExtend-related

- -
- Periodical - A publication in any medium issued in successive parts bearing numerical or chronological designations and intended, such as a magazine, scholarly journal, or newspaper to continue indefinitely. - Subclass of: CreativeWork - - Source: BibEx -
-
- PublicationVolume - A part of a successively published publication such as a periodical or multi-volume work, often numbered. It may represent a time span, such as a year. - Subclass of: CreativeWork - Source: BibEx -
-
- PublicationIssue - A part of a successively published publication such as a periodical or publication volume, often numbered, usually containing a grouping of works such as articles. - Subclass of: CreativeWork - - Source: BibEx -
-
- hasPart - Indicates a CreativeWork that is (in some sense) a part of this CreativeWork. - Domain: CreativeWork - Range: CreativeWork - - Source: BibEx -
-
- issn - The International Standard Serial Number (ISSN) that identifies this periodical. You can repeat this property to (for example) identify different formats of this periodical. - Domain: Periodical - Range: Text - - Source: BibEx -
-
- issueNumber - Identifies the issue of publication; for example, "iii" or "2". - - Domain: PublicationIssue - Range: Integer - Range: Text - - Source: BibEx -
-
- pageEnd - The page on which the work ends; for example "138" or "xvi". - Domain: PublicationVolume - Domain: PublicationIssue - Domain: Article - Range: Integer - Range: Text - - Source: BibEx -
-
- pageStart - The page on which the work starts; for example "135" or "xiii". - Domain: PublicationVolume - Domain: PublicationIssue - Domain: Article - Range: Integer - Range: Text - - Source: BibEx -
-
- pagination - Any description of pages that is not separated into pageStart and pageEnd; for example, "1-6, 9, 55" or "10-12, 46-49". - Domain: PublicationVolume - Domain: PublicationIssue - Domain: Article - Range: Text - - Source: BibEx -
-
- volumeNumber - Identifies the volume of publication or multi-part work; for example, "iii" or "2". - - Domain: PublicationVolume - Range: Integer - Range: Text - - Source: BibEx -
- -
- workExample - Example/instance/realization/derivation of the concept of this creative work. eg. The paperback edition, first edition, or eBook. - Domain: CreativeWork - Range: CreativeWork - Source: BibEx - -
- -
- exampleOfWork - A creative work that this work is an example/instance/realization/derivation of. - Domain: CreativeWork - Range: CreativeWork - Source: BibExt - -
- -

Broker

- -
- broker - An entity that arranges for an exchange between a buyer and a seller. In most cases a broker never acquires or releases ownership of a product or service involved in an exchange. If it is not clear whether an entity is a broker, seller, or buyer, the latter two terms are preferred. - domainIncludes: Reservation - domainIncludes: Order - rangeIncludes: Person - rangeIncludes: Organization -
- -

ItemList and ListItem extras

- -
- itemListElement - For itemListElement values, you can use simple strings (e.g. "Peter", "Paul, "Mary"), existing entities, or use ListItem. - <br/><br/> - Text values are best if the elements in the list are plain strings. Existing entities are best for a simple, unordered list of existing things in your data. ListItem is used with ordered lists when you want to provide additional context about the element in that list or when the same item might be in different places in different lists. - <br/><br/> - Note: The order of elements in your mark-up is not sufficient for indicating the order or elements. Use ItemList with a 'position' property in such cases. - Domain: ItemList - Range: Text - Range: ListItem - Range: Thing -
- -
- ListItem - An list item, e.g. a step in a checklist or how-to description. - Subclass of: Intangible -
- - - -
- item - An entity represented by an entry in a list (e.g. an 'artist' in a list of 'artists')’. - Domain: ListItem - Range: Thing -
- -
- previousItem - A link to the ListItem that preceeds the current one. - Domain: ListItem - Domain: ListItem -
- -
- nextItem - A link to the ListItem that follows the current one. - Domain: ListItem - Domain: ListItem -
- - - - - - diff --git a/tests/data/vgo.rdf b/tests/data/vgo.rdf new file mode 100644 index 00000000..648c3c73 --- /dev/null +++ b/tests/data/vgo.rdf @@ -0,0 +1,911 @@ + + + + + + + + + + + + + + + + + + +]> + + + + + 2013-10-22 + 2014-12-19 + http://delicias.dia.fi.upm.es/members/DGarijo/#me + http://filip.milstan.net/ + http://purl.org/net/mpoveda + http://www.mendeley.com/profiles/janne-parkkila/ + vgo + http://purl.org/net/VideoGameOntology# + http://creativecommons.org/licenses/by-nc-sa/2.0/ + 1.0 + An ontology for describing video games and game plays. Created by Janne Parkkila, Filip Radulovic, Daniel Garijo and María Poveda. + The Video Game Ontology + The Video Game Ontology is an ontology designed for describing video games and all the resources related to their game plays. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + has achievement + The vgo:hasAchievement property specifies that a game has a specific achievement. A game often contains more than one achievement that can be awarded to the players. + optional + + + + + + + + + + has character + The vgo:hasCharacter property specifies that a game has a specific character. A game can have more than one characters involved. + optional + + + + + + + + + + has feature + The vgo:hasFeature property indicates what is a vgo:Feature (or ability) of a particular vgo:Item. For example, a fire sword, a healing staff or boots of flight connects item to a feature it can have. An item with connection to potable feature would make the item potable. + + + + + + + + + + has game genre + The vgo:hasGameGenre property specifies that a game belongs to a certain game genre. For example, Pong would be an arcade game and Mario a platformer. + + + + + + + + + + has item + The vgo:hasItem property specifies that a game has a specific item. A game often contains more than one items. + optional + + + + + + + + + + has leaderboard + The vgo:hasLeaderboard specifies that a leaderboard belongs to a particular game. A game can have one or more leaderboards that keep track of ranking of the players. For example a leaderboard could be ranking of who has the most soccer game victories or who has the fastest lap in a Formula 1 game. + + + + + + + + + + + has playing area + The vgo:hasPlayingArea property asserts a gaming area to a specific game. In every game, the gameplay takes place in some playing area. + + + + + + + + + + involves achievement + The vgo:involvesPlayer property specifies that a session involves a specific player. A session may involve more than one player. + optional + + + + + + + + + + involves character + The vgo:involvesCharacter property specifies that a session involves a specific character. + optional + + + + + + + + + + involves player + The vgo:involvesPlayer property specifies that a session involves a specific player. A session may involve more than one player. + optional + + + + + + + + + + is achieved in session + The property vgo:isAchievedInSession asserts the receiving of an achievement to a certain gameplay session. This enables to keep track of what achievements a player has gained during one gameplay session. + + + + + + + + + + + is achievement in game + The property vgo:isAchievementInGame asserts that a specific vgo:Achievement can be earned in a particular vgo:Game. An achievement must belong to a certain game. + + + + + + + + + + + is character in game + vgo:isCharacterInGame property describes the relation between a vgo:Character and a vgo:Game. a vgo:Character always belongs to a certain game. + + + + + + + + + + + is character in session + The vgo:isCharacterInSession property connects the vgo:Character to a vgo:Session. A character participates in a game session (e.g., a football match or a counter strike round) during a period of time. As players can have multiple characters, a character needs to be connected to the session, in order to know which of those characters participated in the certain session. + + + + + + + + + + + is event associated to player + The vgo:isEventAssociatedToPlayer property asserts an event to a specific vgo:Player. A player may have caused an event to happen through the actions of his/her character and this property is used to connect the real person to the event. + + + + + + + + + + is event in game + The vgo:isEventInGame property asserts an event to a specific game. An event always happens inside a specific a game. + + + + + + + + + + is event in session + The vgo:isEventInSession property links an event to a specific gameplay session. An event always happens during a certain session and this property enables to link the events to that session. For example, an event of moving the queen in game of chess should be connected to a session of chess. + + + + + + + + + + is event related to item + The vgo:isEventRelatedToItem property asserts an event to a specific item. This property is used to describe an event that includes an item in one way or another. For example, an event where character gains a new sword can be described with this relation. + + + + + + + + + + is event triggered by character + The vgo:isEventTriggeredByCharacter connects the vgo:InstantaneousEvent to specific vgo:Character. This describes that an event is often caused by a character. The character in question can be either a character controlled by a player or a computer. For example, both player and non-player characters can trigger a character death event. + + + + + + + + + + + is friend with player + The vgo:isFriendWithPlayer describes a connection between players. The property is used to model the friends a player has and with whom he might be playing games with. The friends of a player are not bound necessarily to particular game, but can be describe the friendly playing relationship in overall. + + + + + + + + + + + is item in game + The vgo:isItemInGame is used to specify which item belongs to a particular game. An item cannot exist alone and thus should always be associated to a certain game. + + + + + + + + + + + is leaderboard in game + The vgo:isLeaderboardInGame property specifies that a leaderboard is from a specific game. + optional + + + + + + + + + + is player in session + The vgo:isPlayerInSession property connects vgo:Player to a specific vgo:Session. This property is used to keep track of the gameplay sessions the player has played and what has happened in those sessions. For example vgo:Player may have participated in a this can be a one round of Counter-Strike or played one hour session of mario. + + + + + + + + + + + is session in game + The vgo:isSessionInGame property links a vgo:Session to a certain vgo:Game. Each gameplay session must belong to a certain game. + + + + + + + + + + lives in + The vgo:livesIn describes the connection between a player and his place of existence in the real-world. A vgo:Player is connected to wgs84:SpatialThing as that has descriptions for places where people live and contains more detailed information of them, such as continents and regions. + + + + + + + + + + owns achievement + The vgo:ownsAchievement links the vgo:Player to the particular vgo:Achievement earned in a game. + + + + + + + + + + owns character + The vgo:ownsCharacter property asserts which characters are owned by a specific player. A player can have multiple characters in one game and this connection is used to define all the different characters a player could be playing. Even though a player deletes, trades or loses his/her character in any way, the connection can be kept to contain the player’s history of owned characters. + + + + + + + + + + owns item + The vgo:ownsItem describes ownership of an item. A vgo:Item is always owned by a certain vgo:Character. A vgo:Character can own multiple vgo:Items and this relationship is used to keep track of the character’s owned items. Even though players may lose items, the vgo:ownsItem connection is still held with the item. This approach allows to keep track of character’s history of owned items. + + + + + + + + + + plays game + the vgo:playsGame property asserts which games has the vgo:Player played at any point of time. + + + + + + + + + + purchases game offering + The vgo:purchasesGameOffering property aseerts a vgo:InAppPurchaseEvent to a specific vgo:GameProduct. This property describes what is purchased by the in-app purchase event that the player has done. + + + + + + + + + + unlocks achievement + The vgo:unlocksAchievement property asserts an event to a certain achievement. An achievement is always unlocked as a consequence of some event. For example, eating the 100th piece of cake unlocks the “Cake Eater” achievement. + + + + + + + + + + + + + + + + + + + + + end time + endTime describes the ending moment in time of a single Session. endTime connects the session to a DateTime value which holds the moment when the session ended. + + + + + + + + + + event name + name connects InstantaneousEvent a text string. This allows the event to have a name to recognize it for. + + + + + + + + + + event time + time describes the connection of InstantaneousEvent happening at a certain moment of time. time Conncets the event to a DateTime value that describes the moment when the event happened. + + + + + + + + + + release date + releaseDate connects a game to a time which describes the release date of the game. + + + + + + + + + + start time + startTime describes the starting moment in time of a single Session. startTime connects the session to a DateTime value which holds the moment when the session started. + + + + + + + + + + username + The username connects player to a text string which describes the username a player has. + + + + + + + + + + + + + + + + + + + + + + + + + + + Achievement + The vgo:Achievement is a reward gained in a game due to some event accomplished in the game. Achievements are commonly used in game industry to reward players for having accomplished tasks in the game. +This ontology defines various subclasses of vgo:Achievement, which are all based on the classification presented by Markus Montola et al. [Markus Montola, Timo Nummenmaa, Andrés Lucero, Marion Boberg, and Hannu Korhonen, 2009, “Applying game achievement systems to enhance user experience in a photo sharing service”, In Proceedings of the 13th International MindTrek Conference: Everyday Life in the Ubiquitous Era (MindTrek '09)] http://dl.acm.org/citation.cfm?id=1621859 + + + + + + + + Character + A vgo:Character is any actor that can exists in a game. A character can be a human-like creature as seen traditionally in video games. However, a character could also be a car, a paddle in game of Pong or spaceship of a space shooter game. This is often contextually related to the gameplay of a certain game. A character can be either controller by a player or by a computer. + + + + + + + + Collection + + The vgo:Collection type of achievement is typically rewarded from collecting an amount of certain items in a game. An example of vgo:Collection would be obtaining a full set of christmas clothes for a character to wear or collecting every possible flower in the game. + + + + + + + + Completion + + The vgo:Completion type of achievement is usually rewarded from successfully completing a certain goal or subgoal in a game. An example of vgo:Completion would be to save a princess from a burning tower or completing all side-quests in a game. + + + + + + + + Curiosity + + The vgo:Curiosity describes funny random things that can happen or be found in the game. An example could be jumping from the Eiffel tower without dying or following a comupter controlled character’s activities for one hour. + + + + + + + + Fandom + + The vgo:Fandom achievement is related to doing some true fan activities. An example of vgo:Fandom could be purchasing a collectors edition of the game or attending a fan gathering. + + + + + + + + Feature + vgo:Feature describes an ability or characteristic. For example, a sword could have “damage dealing” ability and a bottle of water could be “potable”. + + + + + + + + gain event + + The vgo:GainEvent describes an event that is related to character/player gaining something in a game. This is a subclass of vgo:GameEvent as gaining something is related to a specific game. For example, a player can gain a new character, achievement or item. + + + + + + + + Game + The vgo:Game class describes a game product that can be played by a player. +Examples of games are Pong, Grand Theft Auto, Pokemon and Need for Speed. + + + + + + + + game event + + The vgo:GameEvent describes an event that takes place in a game without straight player interaction. GameEvents are often very specific for each game. Examples of vgo:GameEvent could be an enemy dying, connecting to a multiplayer server, loading a new level or playing an animation. + + + + + + + + game product + + + + + + + + + + + + + + A vgo:GameProduct is anything that is for sale inside a game. These can be either normal game items purchased with in-game currency or with real world money. An example of vgo:GameProduct could be a consumable health potion bought with real money, a better weapon or some visual improvement (e.g. Hats in Steam). Basically a game product can be anything, a character, an item or an achievement. +GameProduct is a subclass of Good Relations: ProductOrService & schema:Product. Since vgo:GameProduct is a type of buyable product, it reuses the properties available in the schema and Good Relations, such as currency price, validity of the offer and so on. + + + + + + + + Genre + The vgo:Genre class describes the genre a game belongs to. All of the games have at least one genre. Examples of this are RPG, Simulator and Adventure + + + + + + + + hard mode + + The vgo:HardMode achievement describes succeeding in a game on a high difficulty level. An example could be completing the “Doom” game on Nightmare difficulty level. + + + + + + + + in-app purchase event + + The vgo:InAppPurchaseEvent describes an event that is related to making a purchase with real money inside a game. This is a subclass of InstantaneousEvent because it happens at certain moment in time. An example of vgo:InAppPurchaseEvent would be unlocking secret levels with real money or purchasing better equipment with real money. + + + + + + + + instantaneous event + The vgo:InstantaneousEvent class describes an event that happens during the gameplay at a certain moment in time. This can be a player gaining an achievement, killing an enemy or making an in-app purchase. + + + + + + + + Item + A vgo:Item portrays any item that exists in a game. The item can either be just visual part of the game or a concrete usable item. As an example an item could be a drinkable potion, a magical sword or just a flower pot. + + + + + + + + Leaderboard + + The vgo:Leaderboard class describes a ranking system of the players. There can be multiple rankings in a game, for example, the kill-count ranking of Modern Warfare or the best time listing of Formula 1 game. + + + + + + + + lose event + + vgo:LoseEvent describes an event that is related to character/player losing something in a game. This is a subclass of GameEvent as gaining something is related to a specific game. For example, a player can lose a character due to trade with another player. Another example would be a character losing item due to consuming it. + + + + + + + + Loyalty + + The vgo:Loyalty achievement is used to give recognition to loyal players. For example, this could be an achievement received after subscribing to the game for a year. + + + + + + + + Luck + + The vgo:Lucky describes an achievement that is awarded to the player in a lucky situation. An example of vgo:Lucky achievement would be winning in a lottery or throwing “Yahtzee” without re-rolling the dice. + + + + + + + + menu event + + The vgo:MenuEvent describes an event that is related to interacting with the ingame menu. An example of menu event is muting sounds, changing graphic settings, changing gameplay difficulty or remapping game controls. + + + + + + + + Minigame + + The vgo:Minigame achievement describes success in mini-games that have been included in a certain game but are not vital for completing the game. An example could be to complete all the Pizza deliveries in GTA minigame or gaining over 100 dollars while playing poker in Red Dead Redemption. + + + + + + + + Multiplayer + + The vgo:Multiplayer achievement describes anything that can be awarded to one or multiple players due to their gameplay in multiplayer. For example, this could be winning 10 Team Fortress matches in a row with the same team or getting killed ten times in a row in Counter-Strike. + + + + + + + + Paragon + + The vgo:Paragon is a rare achievement that is given only to limited number of players. An example of vgo:Paragon achievement could be the first player to finish a game under 10 hours or the first ten players to complete the game 100% through. + + + + + + + + Player + + The vgo:Player describes the entity playing the game. This can be either a human or a computer. vgo:Player class is used to keep a profile of a certain playing entity and to connect all the games, achievements and characters he/she has. The vgo:Player is a subclass of foaf:Person as it contains all relative information of a certain person. + + + + + + + + player event + + The vgo:PlayerEvent describes a vgo:InstantaneousEvent that is caused by the player. For example jumping in the game, throwing an item or pressing a joystick button. + + + + + + + + playing area + The vgo:PlayingArea is the description of a place where the gameplay takes place. All of the games have some kind of area where they are played in. An example of playing areas could be football field in soccer game, a race track from a racing game or a star system of EVE Online. + + + + + + + + Session + + The vgo:Session class describes a session of gameplay. A session can be a single round of chess, a round of Counter-Strike, one half-time of soccer or one race of Formula 1. vgo:Session class can be used to store gameplay information, especially for analytical reasons. + + + + + + + + special play style + + The vgo:SpecialPlayStyle achievement is awarded to players after playing a game in special fashion. Often this is something harder than the regular play and requires more player experience to excel in it. An example of vgo:SpecialPlayStyle could be to complete a game without any violence or against a timer. + + + + + + + + Tutorial + + The vgo:Tutorial achievement is awarded to a player for trying out various features of the game. This is often related to learning how to play the game, how the controls work and how the game logic works. An example of vgo:Tutorial could be testing out newly gained special equipment or just playing through the in-game tutorial in the beginning. + + + + + + + + Veteran + + The vgo:Veteran achievement is an award that is given for accumulating a lot of play hours or game actions. For example, vgo:Veteran could be playing thousand hours of World of Tanks or making 100 goals in ice hockey game. + + + + + + + + Virtuosity + + The vgo:Virtuosity describes an achievement that is awarded for playing masterfully in the game. Examples of virtuous play could be finishing the game without saving at all, dying zero times or preventing an opposing team from scoring any goals in a soccer game. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/e2e/customized/App/Schema/Entity/Brand.php b/tests/e2e/customized/App/Schema/Entity/Brand.php new file mode 100644 index 00000000..ee7d16fd --- /dev/null +++ b/tests/e2e/customized/App/Schema/Entity/Brand.php @@ -0,0 +1,67 @@ +id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setSlogan(?string $slogan): void + { + $this->slogan = $slogan; + } + + public function getSlogan(): ?string + { + return $this->slogan; + } +} diff --git a/tests/e2e/customized/App/Schema/Entity/ContactPoint.php b/tests/e2e/customized/App/Schema/Entity/ContactPoint.php new file mode 100644 index 00000000..a74dce5b --- /dev/null +++ b/tests/e2e/customized/App/Schema/Entity/ContactPoint.php @@ -0,0 +1,46 @@ +id; + } + + public function setTelephone(?string $telephone): void + { + $this->telephone = $telephone; + } + + public function getTelephone(): ?string + { + return $this->telephone; + } +} diff --git a/tests/e2e/customized/App/Schema/Entity/Person.php b/tests/e2e/customized/App/Schema/Entity/Person.php new file mode 100644 index 00000000..f3de5863 --- /dev/null +++ b/tests/e2e/customized/App/Schema/Entity/Person.php @@ -0,0 +1,298 @@ +|null a sibling of the person + * + * @see https://schema.org/siblings + */ + #[ORM\ManyToMany(targetEntity: 'App\Schema\Entity\Person')] + #[ORM\JoinTable(name: 'person_person_siblings')] + #[ORM\InverseJoinColumn(name: 'sibling_person_id', unique: true)] + #[ApiProperty(types: ['https://schema.org/siblings'])] + private ?Collection $siblings = null; + + /** + * Of a \[\[Person\]\], and less typically of an \[\[Organization\]\], to indicate a topic that is known about - suggesting possible expertise but not implying it. We do not distinguish skill levels here, or relate this to educational content, events, objectives or \[\[JobPosting\]\] descriptions. + * + * @see https://schema.org/knowsAbout + */ + #[ORM\OneToOne(targetEntity: 'App\Schema\Entity\Thing')] + #[ORM\JoinColumn(nullable: false)] + #[ApiProperty(types: ['https://schema.org/knowsAbout'])] + #[Assert\NotNull] + private Thing $knowsAbout; + + /** @see _:customColumn */ + #[ORM\Column(type: 'decimal', nullable: true, precision: 5, scale: 1, options: ['comment' => 'my comment'])] + private ?string $customColumn = null; + + public function __construct() + { + $this->siblings = new ArrayCollection(); + } + + public function getMyProperty(): string + { + return $this->myProperty; + } + + public function setFamilyName(?string $familyName): void + { + $this->familyName = $familyName; + } + + public function getFamilyName(): ?string + { + return $this->familyName; + } + + public function setGivenName(?string $givenName): void + { + $this->givenName = $givenName; + } + + public function getGivenName(): ?string + { + return $this->givenName; + } + + public function setAdditionalName(?string $additionalName): void + { + $this->additionalName = $additionalName; + } + + public function getAdditionalName(): ?string + { + return $this->additionalName; + } + + public function setGender(string $gender): void + { + $this->gender = $gender; + } + + public function getGender(): string + { + return $this->gender; + } + + public function setAddress(PostalAddress $address): void + { + $this->address = $address; + } + + public function getAddress(): PostalAddress + { + return $this->address; + } + + public function setBirthDate(?\DateTimeInterface $birthDate): void + { + $this->birthDate = $birthDate; + } + + public function getBirthDate(): ?\DateTimeInterface + { + return $this->birthDate; + } + + public function setTelephone(?string $telephone): void + { + $this->telephone = $telephone; + } + + public function getTelephone(): ?string + { + return $this->telephone; + } + + public function setEmail(?string $email): void + { + $this->email = $email; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setUrl(?string $url): void + { + $this->url = $url; + } + + public function getUrl(): ?string + { + return $this->url; + } + + public function addSibling(Person $sibling): void + { + $this->siblings[] = $sibling; + } + + public function removeSibling(Person $sibling): void + { + $this->siblings->removeElement($sibling); + } + + /** + * @return Collection|null + */ + public function getSiblings(): Collection + { + return $this->siblings; + } + + public function setKnowsAbout(Thing $knowsAbout): void + { + $this->knowsAbout = $knowsAbout; + } + + public function getKnowsAbout(): Thing + { + return $this->knowsAbout; + } + + public function setCustomColumn(?string $customColumn): void + { + $this->customColumn = $customColumn; + } + + public function getCustomColumn(): ?string + { + return $this->customColumn; + } +} diff --git a/tests/e2e/customized/App/Schema/Entity/PostalAddress.php b/tests/e2e/customized/App/Schema/Entity/PostalAddress.php new file mode 100644 index 00000000..8aa1616c --- /dev/null +++ b/tests/e2e/customized/App/Schema/Entity/PostalAddress.php @@ -0,0 +1,114 @@ +addressCountry = $addressCountry; + } + + public function getAddressCountry(): ?string + { + return $this->addressCountry; + } + + public function setAddressLocality(?string $addressLocality): void + { + $this->addressLocality = $addressLocality; + } + + public function getAddressLocality(): ?string + { + return $this->addressLocality; + } + + public function setAddressRegion(?string $addressRegion): void + { + $this->addressRegion = $addressRegion; + } + + public function getAddressRegion(): ?string + { + return $this->addressRegion; + } + + public function setPostalCode(?string $postalCode): void + { + $this->postalCode = $postalCode; + } + + public function getPostalCode(): ?string + { + return $this->postalCode; + } + + public function setStreetAddress(?string $streetAddress): void + { + $this->streetAddress = $streetAddress; + } + + public function getStreetAddress(): ?string + { + return $this->streetAddress; + } +} diff --git a/tests/e2e/customized/App/Schema/Entity/Thing.php b/tests/e2e/customized/App/Schema/Entity/Thing.php new file mode 100644 index 00000000..93dfb3fa --- /dev/null +++ b/tests/e2e/customized/App/Schema/Entity/Thing.php @@ -0,0 +1,49 @@ + Thing::class, 'person' => Person::class])] +class Thing +{ + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'AUTO')] + #[ORM\Column(type: 'integer')] + private ?int $id = null; + + /** + * The name of the item. + * + * @see https://schema.org/name + */ + #[ORM\Column(type: 'text', nullable: true)] + #[ApiProperty(types: ['https://schema.org/name'])] + private ?string $name = null; + + public function getId(): ?int + { + return $this->id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } +} diff --git a/tests/e2e/customized/App/Schema/Enum/GenderType.php b/tests/e2e/customized/App/Schema/Enum/GenderType.php new file mode 100644 index 00000000..cbe6dbe4 --- /dev/null +++ b/tests/e2e/customized/App/Schema/Enum/GenderType.php @@ -0,0 +1,21 @@ +`). + required: false + schema: + type: string + format: date + - name: until + in: query + description: Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date). + required: false + schema: + type: string + format: date + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - offeringId + - name + - startDate + - endDate + - -offeringId + - -name + - -startDate + - -endDate + default: [ startDate ] + example: + - startDate + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + oneOf: + - $ref: '../schemas/ProgramOffering.yaml' + - $ref: '../schemas/CourseOffering.yaml' + - $ref: '../schemas/ComponentOffering.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/AssociationInstance.yaml b/tests/e2e/open-education-api-v5/paths/AssociationInstance.yaml new file mode 100644 index 00000000..151799be --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/AssociationInstance.yaml @@ -0,0 +1,102 @@ +get: + summary: GET /associations/{associationId} + description: Get a single association. + tags: + - associations + parameters: + - name: associationId + in: path + description: Association ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - person + - offering + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/AssociationFull.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' + + + + +patch: + summary: PATCH /associations/{associationId} + description: | + Update the status or result of an enrollment. Other elements of the association object COULD + also be PATCHED. But are not likely and have therefor not been included in this endpoint. + Implementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, + a specialized media type `application/merge-patch+json` for partial resource representation + to update parts of resource objects. + security: + - openId: + - associations.write + tags: + - associations + + parameters: + - name: associationId + in: path + description: The id of the association to update + required: true + schema: + type: string + format: uuid + + requestBody: + required: true + content: + application/merge-patch+json: + schema: + properties: + remoteState: + $ref: '../enumerations/remoteAssociationState.yaml' + result: + oneOf: + - $ref: '../schemas/ComponentResult.yaml' + - $ref: '../schemas/CourseResult.yaml' + - $ref: '../schemas/ProgramResult.yaml' + + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/AssociationId.yaml' + - $ref: '../schemas/PostResponse.yaml' + - properties: + state: + $ref: '../enumerations/associationState.yaml' + + '400': + $ref: '../schemas/ErrorBadRequest.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/AssociationInstanceExternalMe.yaml b/tests/e2e/open-education-api-v5/paths/AssociationInstanceExternalMe.yaml new file mode 100644 index 00000000..b38640bd --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/AssociationInstanceExternalMe.yaml @@ -0,0 +1,41 @@ +post: + summary: POST /associations/external/me + description: | + POST a single association enroll a person based on person information obtained from .wellknown endpoint, an offering, + and the organization/type=root information form the organization that is issuing this association. + The offering can either be identified by an offeringId if known or the full offering details. + security: + - openId: + - associations:external:me.write + tags: + - associations + + requestBody: + required: true + content: + application/json: + schema: + required: + - remoteState + allOf: + - $ref: '../schemas/AssociationWrite.yaml' + - properties: + issuer: + $ref: '../schemas/Organization.yaml' + + responses: + '201': + description: CREATED + content: + application/json: + schema: + allOf: + - $ref: '../schemas/AssociationId.yaml' + - $ref: '../schemas/PostResponse.yaml' + - properties: + state: + $ref: '../enumerations/associationState.yaml' + + + '400': + $ref: '../schemas/ErrorBadRequest.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/AssociationInstanceMe.yaml b/tests/e2e/open-education-api-v5/paths/AssociationInstanceMe.yaml new file mode 100644 index 00000000..15f694c9 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/AssociationInstanceMe.yaml @@ -0,0 +1,33 @@ +post: + summary: POST /associations/me + description: POST a single association to enroll a person based on person information obtained from .wellknown endpoint and an offering. The offering can either be identified by an offeringId if known or the full offering details. + security: + - openId: + - associations:me.write + tags: + - associations + + requestBody: + required: true + content: + application/json: + schema: + $ref: '../schemas/AssociationFull.yaml' + + + responses: + '201': + description: CREATED + content: + application/json: + schema: + allOf: + - $ref: '../schemas/AssociationId.yaml' + - $ref: '../schemas/PostResponse.yaml' + + '400': + description: Bad Request + content: + application/problem+json: + schema: + $ref: '../schemas/Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/paths/BuildingCollection.yaml b/tests/e2e/open-education-api-v5/paths/BuildingCollection.yaml new file mode 100644 index 00000000..f4c93670 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/BuildingCollection.yaml @@ -0,0 +1,59 @@ +get: + summary: GET /buildings + description: Get a list of all buildings, ordered by name (ascending). + tags: + - buildings + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - buildingId + - name + - -buildingId + - -name + default: [ name ] + example: + - name + - -buildingId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Building.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/BuildingInstance.yaml b/tests/e2e/open-education-api-v5/paths/BuildingInstance.yaml new file mode 100644 index 00000000..9f6b815d --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/BuildingInstance.yaml @@ -0,0 +1,34 @@ +get: + summary: GET /buildings/{buildingId} + description: Get a single building. + tags: + - buildings + parameters: + - name: buildingId + in: path + description: Building ID + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Building.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/BuildingRoomCollection.yaml b/tests/e2e/open-education-api-v5/paths/BuildingRoomCollection.yaml new file mode 100644 index 00000000..65005f1e --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/BuildingRoomCollection.yaml @@ -0,0 +1,77 @@ +get: + summary: GET /buildings/{buildingId}/rooms + description: Get a list of all rooms in a building. + tags: + - buildings + parameters: + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: buildingId + in: path + description: The id of the building to find rooms for + required: true + schema: + type: string + format: uuid + - name: roomType + in: query + description: Filter by room type + required: false + schema: + $ref: '../enumerations/roomType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - roomId + - name + - totalSeats + - availableSeats + - -roomId + - -name + - -totalSeats + - -availableSeats + default: [ name ] + example: + - name + - -availableSeats + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Room.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ComponentInstance.yaml b/tests/e2e/open-education-api-v5/paths/ComponentInstance.yaml new file mode 100644 index 00000000..c0a8251d --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ComponentInstance.yaml @@ -0,0 +1,46 @@ +get: + summary: GET /components/{componentId} + description: Get a single component. + tags: + - components + parameters: + - name: componentId + in: path + description: component ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - course + - organization + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Component.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ComponentOfferingCollection.yaml b/tests/e2e/open-education-api-v5/paths/ComponentOfferingCollection.yaml new file mode 100644 index 00000000..5e709f2c --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ComponentOfferingCollection.yaml @@ -0,0 +1,92 @@ +get: + summary: GET /components/{componentId}/offerings + description: Get a list of all offerings for this component, ordered chronologically. + tags: + - components + parameters: + - name: componentId + in: path + description: Component ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: resultExpected + in: query + description: Filter by resultExpected + required: false + schema: + type: boolean + - name: since + in: query + description: Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`). + required: false + schema: + type: string + format: date + - name: until + in: query + description: Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date). + required: false + schema: + type: string + format: date + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - offeringId + - name + - startDateTime + - endDateTime + - -offeringId + - -name + - -startDateTime + - -endDateTime + default: [ startDateTime ] + example: + - offeringId + - -startDateTime + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/ComponentOffering.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/CourseCollection.yaml b/tests/e2e/open-education-api-v5/paths/CourseCollection.yaml new file mode 100644 index 00000000..4f9b57dd --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/CourseCollection.yaml @@ -0,0 +1,72 @@ +get: + summary: GET /courses + description: Get a list of all courses, ordered by name (ascending). + tags: + - courses + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: level + in: query + description: Filter by level + required: false + schema: + $ref: '../enumerations/level.yaml' + - name: modeOfDelivery + in: query + description: Filter by modeOfDelivery + required: false + schema: + $ref: '../enumerations/modesOfDelivery.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - courseId + - name + - -courseId + - -name + default: [ name ] + example: + - name + - -courseId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Course.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/CourseComponentCollection.yaml b/tests/e2e/open-education-api-v5/paths/CourseComponentCollection.yaml new file mode 100644 index 00000000..fdd4ddbb --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/CourseComponentCollection.yaml @@ -0,0 +1,74 @@ +get: + summary: GET /courses/{courseId}/components + description: Get an ordered list of all course components. + tags: + - courses + parameters: + - name: courseId + in: path + description: Course ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: componentType + in: query + description: Filter by component type + required: false + schema: + $ref: '../enumerations/componentType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - componentId + - name + - -componentId + - -name + default: [ componentId ] + example: + - name + - -componentId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Component.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/CourseInstance.yaml b/tests/e2e/open-education-api-v5/paths/CourseInstance.yaml new file mode 100644 index 00000000..7a379769 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/CourseInstance.yaml @@ -0,0 +1,49 @@ +get: + summary: GET /courses/{courseId} + description: Get a single course. + tags: + - courses + parameters: + - name: courseId + in: path + description: Course ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to include, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - programs + - coordinators + - organization + - educationSpecification + - $ref: '../parameters/returnTimelineOverrides.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/CourseExpanded.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/CourseOfferingCollection.yaml b/tests/e2e/open-education-api-v5/paths/CourseOfferingCollection.yaml new file mode 100644 index 00000000..01f19a4c --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/CourseOfferingCollection.yaml @@ -0,0 +1,98 @@ +get: + summary: GET /courses/{courseId}/offerings + description: Get a list of all offerings for this course, ordered chronologically. + tags: + - courses + parameters: + - name: courseId + in: path + description: Course ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: modeOfDelivery + in: query + description: Filter by modeOfDelivery + required: false + schema: + $ref: '../enumerations/modesOfDelivery.yaml' + - name: resultExpected + in: query + description: Filter by resultExpected + required: false + schema: + type: boolean + - name: since + in: query + description: Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`). + required: false + schema: + type: string + format: date + - name: until + in: query + description: Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date). + required: false + schema: + type: string + format: date + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - offeringId + - name + - startDate + - endDate + - -offeringId + - -name + - -startDate + - -endDate + default: [ startDate ] + example: + - offeringId + - -endDate + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/CourseOffering.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/EducationSpecificationCollection.yaml b/tests/e2e/open-education-api-v5/paths/EducationSpecificationCollection.yaml new file mode 100644 index 00000000..dcca08ab --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/EducationSpecificationCollection.yaml @@ -0,0 +1,75 @@ +get: + summary: GET /education-specifications + description: Get a list of all education specifications, ordered by name (ascending). + tags: + - education specifications + parameters: + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: educationSpecificationType + in: query + description: Filter by type of education specification + required: false + schema: + $ref: '../enumerations/educationSpecificationType.yaml' + - name: primaryCode + in: query + description: Filter by primary code of education specification + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - educationSpecificationType + - name + - primaryCode + - -educationSpecificationType + - -name + - -primaryCode + default: + - [ name ] + example: + - educationSpecificationType + - -primaryCode + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/EducationSpecification.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/EducationSpecificationCourseCollection.yaml b/tests/e2e/open-education-api-v5/paths/EducationSpecificationCourseCollection.yaml new file mode 100644 index 00000000..d97299b3 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/EducationSpecificationCourseCollection.yaml @@ -0,0 +1,80 @@ +get: + summary: GET /education-specifications/{educationSpecificationId}/courses + description: Get an ordered list of all courses given through this EducationSpecification. + tags: + - education specifications + parameters: + - name: educationSpecificationId + in: path + description: Education Specification ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: level + in: query + description: Filter by level + required: false + schema: + $ref: '../enumerations/level.yaml' + - name: modeOfDelivery + in: query + description: Filter by modeOfDelivery + required: false + schema: + $ref: '../enumerations/modesOfDelivery.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - courseId + - name + - -courseId + - -name + default: [ courseId ] + example: + - courseId + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Course.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/EducationSpecificationEducationSpecificationCollection.yaml b/tests/e2e/open-education-api-v5/paths/EducationSpecificationEducationSpecificationCollection.yaml new file mode 100644 index 00000000..41cf7135 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/EducationSpecificationEducationSpecificationCollection.yaml @@ -0,0 +1,69 @@ +get: + summary: GET /education-specifications/{educationSpecificationId}/education-specifications + description: Get an ordered list of all education-specifications given through this educationspecification. + tags: + - education specifications + parameters: + - name: educationSpecificationId + in: path + description: Education Specification ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - educationSpecificationId + - name + - educationSpecificationType + - -educationSpecificationId + - -name + - -educationSpecificationType + default: [ educationSpecificationId ] + example: + - educationSpecificationId + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Course.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/EducationSpecificationInstance.yaml b/tests/e2e/open-education-api-v5/paths/EducationSpecificationInstance.yaml new file mode 100644 index 00000000..f76b6bba --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/EducationSpecificationInstance.yaml @@ -0,0 +1,52 @@ +get: + summary: GET /education-specifications/{educationSpecificationId} + description: Get a single education specification. + tags: + - education specifications + parameters: + - name: educationSpecificationId + in: path + description: Education specification ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/returnTimelineOverrides.yaml' + - name: expand + in: query + explode: false + description: Optional properties to include, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - parent + - children + - organization + responses: + '200': + description: OK + content: + application/json: + schema: + oneOf: + - title: Without timelineOverrides (default) + $ref: '../schemas/EducationSpecification.yaml' + - title: With timelineOverrides + $ref: '../schemas/EducationSpecificationExpanded.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/EducationSpecificationProgramCollection.yaml b/tests/e2e/open-education-api-v5/paths/EducationSpecificationProgramCollection.yaml new file mode 100644 index 00000000..84722ce6 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/EducationSpecificationProgramCollection.yaml @@ -0,0 +1,104 @@ +get: + summary: GET /education-specifications/{educationSpecificationId}/programs + description: Get an ordered list of all programs for a given education specification, ordered by name. + tags: + - education specifications + parameters: + - name: educationSpecificationId + in: path + description: Education Specification ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: programType + in: query + description: Filter by program type + required: false + schema: + $ref: '../enumerations/programType.yaml' + - name: qualificationAwarded + in: query + description: Filter by qualificationAwarded + required: false + schema: + $ref: '../enumerations/qualificationAwarded.yaml' + - name: levelOfQualification + in: query + description: Filter by levelOfQualification + required: false + schema: + $ref: '../enumerations/levelOfQualification.yaml' + - name: sector + in: query + description: Filter by sector + required: false + schema: + $ref: '../enumerations/sector.yaml' + - name: fieldsOfStudy + in: query + description: Filter by fieldsOfStudy + required: false + schema: + type: string + - name: croho-creboCode + in: query + description: Filter by croho-creboCode + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - programId + - name + - -programId + - -name + default: [ name ] + example: + - programId + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Program.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/GroupCollection.yaml b/tests/e2e/open-education-api-v5/paths/GroupCollection.yaml new file mode 100644 index 00000000..6e8cb0fb --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/GroupCollection.yaml @@ -0,0 +1,87 @@ +get: + summary: GET /groups + description: Get a list of all groups, ordered by name (ascending). + tags: + - groups + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: groupType + in: query + description: Filter by group type + required: false + schema: + $ref: '../enumerations/groupType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - groupId + - name + - startDate + - -groupId + - -name + - -startDate + default: [ name ] + example: + - groupId + - -startDate + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + required: + - pageSize + - pageNumber + - hasPreviousPage + - hasNextPage + - items + properties: + pageSize: + type: integer + format: int32 + description: The number of items per page + pageNumber: + type: integer + format: int32 + description: The current page number + hasPreviousPage: + type: boolean + description: Whether there is a previous page + hasNextPage: + type: boolean + description: Whether there is a previous page + totalPages: + type: integer + format: int32 + description: Total number of pages + items: + type: array + items: + $ref: '../schemas/Group.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/GroupInstance.yaml b/tests/e2e/open-education-api-v5/paths/GroupInstance.yaml new file mode 100644 index 00000000..c74ba60b --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/GroupInstance.yaml @@ -0,0 +1,45 @@ +get: + summary: GET /groups/{groupId} + description: Get a single group. + tags: + - groups + parameters: + - name: groupId + in: path + description: Group ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - organization + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Group.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/GroupPersonCollection.yaml b/tests/e2e/open-education-api-v5/paths/GroupPersonCollection.yaml new file mode 100644 index 00000000..2783a5db --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/GroupPersonCollection.yaml @@ -0,0 +1,95 @@ +get: + summary: GET /groups/{groupId}/persons + description: Get an ordered list of all persons that are member of a given group, ordered by personId. + tags: + - groups + parameters: + - name: groupId + in: path + description: Group ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/personSearch.yaml' + - name: affiliations + in: query + description: Filter by affiliations + required: false + schema: + $ref: '../enumerations/personAffiliations.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - personId + - givenName + - surName + - displayName + - -personId + - -givenName + - -surName + - -displayName + default: [ personId ] + example: + - personId + - -givenName + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + required: + - pageSize + - pageNumber + - hasPreviousPage + - hasNextPage + - items + properties: + pageSize: + type: integer + format: int32 + description: The number of items per page + pageNumber: + type: integer + format: int32 + description: The current page number + hasPreviousPage: + type: boolean + description: Whether there is a previous page + hasNextPage: + type: boolean + description: Whether there is a previous page + totalPages: + type: integer + format: int32 + description: Total number of pages + items: + type: array + items: + $ref: '../schemas/Person.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/NewsFeedCollection.yaml b/tests/e2e/open-education-api-v5/paths/NewsFeedCollection.yaml new file mode 100644 index 00000000..e6368aee --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/NewsFeedCollection.yaml @@ -0,0 +1,72 @@ +get: + summary: GET /news-feeds + description: Get a list of all news feeds, ordered by title. + tags: + - news + parameters: + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: newsFeedType + in: query + description: Filter by news type + required: false + schema: + type: string + enum: + - organization + - program + - course + - component + - person + - building + - room + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - newsFeedId + - name + - -newsFeedId + - -name + default: [ name ] + example: + - name + - -newsFeedId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/NewsFeed.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/NewsFeedInstance.yaml b/tests/e2e/open-education-api-v5/paths/NewsFeedInstance.yaml new file mode 100644 index 00000000..9f6cfb5a --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/NewsFeedInstance.yaml @@ -0,0 +1,34 @@ +get: + summary: GET /news-feeds/{newsFeedId} + description: Get a single news feed. + tags: + - news + parameters: + - name: newsFeedId + in: path + description: News feed ID + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/NewsFeed.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/NewsFeedItemCollection.yaml b/tests/e2e/open-education-api-v5/paths/NewsFeedItemCollection.yaml new file mode 100644 index 00000000..e509e718 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/NewsFeedItemCollection.yaml @@ -0,0 +1,79 @@ +get: + summary: GET /news-feeds/{newsFeedId}/news-items + description: Get an ordered list of all news items. + tags: + - news + parameters: + - name: newsFeedId + in: path + description: News feed ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: author + in: query + description: Filter by author + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - newsItemId + - name + - validFrom + - validUntil + - lastModified + - -newsItemId + - -name + - -validFrom + - -validUntil + - -lastModified + default: [ newsItemId ] + example: + - validFrom + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/NewsItem.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/NewsItemInstance.yaml b/tests/e2e/open-education-api-v5/paths/NewsItemInstance.yaml new file mode 100644 index 00000000..e0eb3768 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/NewsItemInstance.yaml @@ -0,0 +1,45 @@ +get: + summary: GET /news-items/{newsItemId} + description: Get a single news item. + tags: + - news + parameters: + - name: newsItemId + in: path + description: News item ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to include, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - newsFeeds + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/NewsItem.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OfferingAssociationCollection.yaml b/tests/e2e/open-education-api-v5/paths/OfferingAssociationCollection.yaml new file mode 100644 index 00000000..7e914118 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OfferingAssociationCollection.yaml @@ -0,0 +1,95 @@ +get: + summary: GET /offerings/{offeringId}/associations + description: Get a list of all offering associations. + tags: + - offerings + parameters: + - name: offeringId + in: path + description: Offering ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - name: associationType + in: query + description: Filter by association type + required: false + schema: + type: string + enum: + - programOffering + - courseOffering + - componentOffering + - name: role + in: query + description: Filter by role + required: false + schema: + $ref: '../enumerations/associationRole.yaml' + - name: state + in: query + description: Filter by state + required: false + schema: + $ref: '../enumerations/associationState.yaml' + - name: result-state + in: query + description: Filter by result state + required: false + schema: + $ref: '../enumerations/resultState.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - associationId + - -associationId + default: + - associationId + example: + - associationId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + oneOf: + - $ref: '../schemas/ProgramOfferingAssociationExpandable.yaml' + - $ref: '../schemas/CourseOfferingAssociationExpandable.yaml' + - $ref: '../schemas/ComponentOfferingAssociationExpandable.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OfferingAssociationInstanceMe.yaml b/tests/e2e/open-education-api-v5/paths/OfferingAssociationInstanceMe.yaml new file mode 100644 index 00000000..175c3028 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OfferingAssociationInstanceMe.yaml @@ -0,0 +1,41 @@ +post: + summary: POST offerings/{offeringId}/associations/me + description: | + POST a single association to enroll a person based on hte .wellknown information of the person at the institution. The offeringId is provided in the path. + security: + - openId: + - associations:me.write + tags: + - offerings + parameters: + - name: offeringId + in: path + description: Offering ID + required: true + schema: + type: string + format: uuid + + requestBody: + required: true + content: + application/json: + schema: + $ref: '../schemas/AssociationProperties.yaml' + + responses: + '201': + description: CREATED + content: + application/json: + schema: + allOf: + - $ref: '../schemas/AssociationId.yaml' + - $ref: '../schemas/PostResponse.yaml' + + '400': + description: Bad Request + content: + application/problem+json: + schema: + $ref: '../schemas/Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/paths/OfferingGroupCollection.yaml b/tests/e2e/open-education-api-v5/paths/OfferingGroupCollection.yaml new file mode 100644 index 00000000..f26717f8 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OfferingGroupCollection.yaml @@ -0,0 +1,93 @@ +get: + summary: GET /offerings/{offeringId}/groups + description: Get an ordered list of all groups related to an offering, ordered by name. + tags: + - offerings + parameters: + - name: offeringId + in: path + description: Offering ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: groupType + in: query + description: Filter by group type + required: false + schema: + $ref: '../enumerations/groupType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - groupId + - name + - startDate + - -groupId + - -name + - -startDate + default: [ name ] + example: + - name + - -startDate + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + required: + - pageSize + - pageNumber + - hasPreviousPage + - hasNextPage + - items + properties: + pageSize: + type: integer + format: int32 + description: The number of items per page + pageNumber: + type: integer + format: int32 + description: The current page number + hasPreviousPage: + type: boolean + description: Whether there is a previous page + hasNextPage: + type: boolean + description: Whether there is a previous page + totalPages: + type: integer + format: int32 + description: Total number of pages + items: + type: array + items: + $ref: '../schemas/Group.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OfferingInstance.yaml b/tests/e2e/open-education-api-v5/paths/OfferingInstance.yaml new file mode 100644 index 00000000..2bcfad24 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OfferingInstance.yaml @@ -0,0 +1,59 @@ +get: + summary: GET /offerings/{offeringId} + description: Get a single offering. + tags: + - offerings + parameters: + - name: offeringId + in: path + description: Offering ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - program + - programOffering + - course + - courseOffering + - component + - organization + - academicSession + responses: + '200': + description: OK + content: + application/json: + schema: + oneOf: + - $ref: '../schemas/CourseOffering.yaml' + title: courseOffering + - $ref: '../schemas/ComponentOffering.yaml' + title: componentOffering + - $ref: '../schemas/ProgramOffering.yaml' + title: programOffering + + + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationCollection.yaml new file mode 100644 index 00000000..fb8b7ee0 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationCollection.yaml @@ -0,0 +1,65 @@ +get: + summary: GET /organizations + description: Get an ordered list of all organizations, ordered by name. + tags: + - organizations + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: organizationType + in: query + description: Filter by organization type + required: false + schema: + $ref: '../enumerations/organizationType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - organizationId + - name + - -organizationId + - -name + default: [ name ] + example: + - name + - -organizationId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Organization.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationComponentCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationComponentCollection.yaml new file mode 100644 index 00000000..4dc1bb07 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationComponentCollection.yaml @@ -0,0 +1,74 @@ +get: + summary: GET /organizations/{organizationId}/components + description: Get an ordered list of all components for a given organization, ordered by name. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: componentType + in: query + description: Filter by component type + required: false + schema: + $ref: '../enumerations/componentType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - componentId + - name + - -componentId + - -name + default: [ name ] + example: + - componentId + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Component.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationCourseCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationCourseCollection.yaml new file mode 100644 index 00000000..0dd90ac5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationCourseCollection.yaml @@ -0,0 +1,80 @@ +get: + summary: GET /organizations/{organizationId}/courses + description: Get an ordered list of all courses for a given organization, ordered by name. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: level + in: query + description: Filter by level + required: false + schema: + $ref: '../enumerations/level.yaml' + - name: modeOfDelivery + in: query + description: Filter by modeOfDelivery + required: false + schema: + $ref: '../enumerations/modesOfDelivery.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - courseId + - name + - -courseId + - -name + default: [ name ] + example: + - name + - -courseId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Course.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationEducationSpecificationCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationEducationSpecificationCollection.yaml new file mode 100644 index 00000000..222f57fe --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationEducationSpecificationCollection.yaml @@ -0,0 +1,75 @@ +get: + summary: GET /organizations/{organizationId}/education-specifications + description: Get an ordered list of all EducationSpecifications for a given organization, ordered by name. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: educationSpecificationType + in: query + description: Filter by type of education specification + required: false + schema: + $ref: '../enumerations/educationSpecificationType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - educationSpecificationType + - name + - primarycode + - -educationSpecificationType + - -name + - -primarycode + default: [ name ] + example: + - name + - -educationSpecificationType + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/EducationSpecification.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationGroupCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationGroupCollection.yaml new file mode 100644 index 00000000..f1bb1003 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationGroupCollection.yaml @@ -0,0 +1,73 @@ +get: + summary: GET /organizations/{organizationId}/groups + description: Get an ordered list of all groups for a given organization, ordered by name. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: groupType + in: query + description: Filter by group type + required: false + schema: + $ref: '../enumerations/groupType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - groupId + - name + - startDate + - -groupId + - -name + - -startDate + default: [ name ] + example: + - groupId + - -name + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Group.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationInstance.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationInstance.yaml new file mode 100644 index 00000000..9e4e3ee5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationInstance.yaml @@ -0,0 +1,46 @@ +get: + summary: GET /organizations/{organizationId} + description: Get a single organization. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - parent + - children + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Organization.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationOfferingCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationOfferingCollection.yaml new file mode 100644 index 00000000..96cf73ce --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationOfferingCollection.yaml @@ -0,0 +1,105 @@ +get: + summary: GET /organizations/{organizationId}/offerings + description: Get a list of all offerings for a given organization + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: offeringType + in: query + description: Filter by offering type + required: false + schema: + type: string + enum: + - program + - course + - component + - name: resultExpected + in: query + description: Filter by resultExpected + required: false + schema: + type: boolean + - name: since + in: query + description: Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`). + required: false + schema: + type: string + format: date + - name: until + in: query + description: Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date). + required: false + schema: + type: string + format: date + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - offeringId + - name + - startDate + - endDate + - -offeringId + - -name + - -startDate + - -endDate + default: [ startDate ] + example: + - name + - -startDate + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + oneOf: + - $ref: '../schemas/ProgramOffering.yaml' + - $ref: '../schemas/CourseOffering.yaml' + - $ref: '../schemas/ComponentOffering.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/OrganizationProgramCollection.yaml b/tests/e2e/open-education-api-v5/paths/OrganizationProgramCollection.yaml new file mode 100644 index 00000000..31e47988 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/OrganizationProgramCollection.yaml @@ -0,0 +1,98 @@ +get: + summary: GET /organizations/{organizationId}/programs + description: Get an ordered list of all programs for a given organization, ordered by name. + tags: + - organizations + parameters: + - name: organizationId + in: path + description: Organization ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: programType + in: query + description: Filter by program type + required: false + schema: + $ref: '../enumerations/programType.yaml' + - name: qualificationAwarded + in: query + description: Filter by qualificationAwarded + required: false + schema: + $ref: '../enumerations/qualificationAwarded.yaml' + - name: levelOfQualification + in: query + description: Filter by levelOfQualification + required: false + schema: + $ref: '../enumerations/levelOfQualification.yaml' + - name: sector + in: query + description: Filter by sector + required: false + schema: + $ref: '../enumerations/sector.yaml' + - name: fieldsOfStudy + in: query + description: Filter by fieldsOfStudy + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - programId + - name + - -programId + - -name + default: [ name ] + example: + - name + - -programId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Program.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/PersonAssociationCollection.yaml b/tests/e2e/open-education-api-v5/paths/PersonAssociationCollection.yaml new file mode 100644 index 00000000..57440bb0 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/PersonAssociationCollection.yaml @@ -0,0 +1,121 @@ +get: + summary: GET /persons/{personId}/associations + description: Get a list of all associations for an individual person. + tags: + - persons + parameters: + - name: personId + in: path + description: Person ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - name: associationType + in: query + description: Filter by association type + required: false + schema: + type: string + enum: + - programOffering + - courseOffering + - componentOffering + - name: role + in: query + description: Filter by role + required: false + schema: + $ref: '../enumerations/associationRole.yaml' + - name: state + in: query + description: Filter by state + required: false + schema: + $ref: '../enumerations/associationState.yaml' + - name: result-state + in: query + description: Filter by result state + required: false + schema: + $ref: '../enumerations/resultState.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - associationId + - -associationId + default: [ associationId ] + example: + - associationId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + oneOf: + - allOf: + - $ref: '../schemas/ProgramOfferingAssociation.yaml' + - type: object + required: + - offering + properties: + offering: + $ref: '../schemas/ProgramOffering.yaml' + academicSession: + $ref: '../schemas/AcademicSession.yaml' + - allOf: + - $ref: '../schemas/CourseOfferingAssociation.yaml' + - type: object + required: + - offering + properties: + offering: + $ref: '../schemas/CourseOffering.yaml' + academicSession: + $ref: '../schemas/AcademicSession.yaml' + - allOf: + - $ref: '../schemas/ComponentOfferingAssociation.yaml' + - type: object + required: + - offering + properties: + offering: + $ref: '../schemas/ComponentOffering.yaml' + academicSession: + $ref: '../schemas/AcademicSession.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/PersonCollection.yaml b/tests/e2e/open-education-api-v5/paths/PersonCollection.yaml new file mode 100644 index 00000000..a347130a --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/PersonCollection.yaml @@ -0,0 +1,96 @@ +get: + summary: GET /persons + description: Get an ordered list of all persons. + tags: + - persons + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/personSearch.yaml' + - name: affiliations + in: query + description: Filter by affiliations + required: false + schema: + $ref: '../enumerations/personAffiliations.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - personId + - givenName + - surName + - displayName + - -personId + - -givenName + - -surName + - -displayName + default: [ personId ] + example: + - surName + - -personId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Person.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' + +post: + summary: POST /persons + description: POST a single person. + tags: + - persons + requestBody: + required: true + content: + application/json: + schema: + allOf: + - $ref: '../schemas/PersonProperties.yaml' + + + responses: + '201': + description: CREATED + content: + application/json: + schema: + allOf: + - $ref: '../schemas/PersonId.yaml' + - $ref: '../schemas/PostResponse.yaml' + + '400': + $ref: '../schemas/ErrorBadRequest.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/PersonGroupCollection.yaml b/tests/e2e/open-education-api-v5/paths/PersonGroupCollection.yaml new file mode 100644 index 00000000..6da00cc7 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/PersonGroupCollection.yaml @@ -0,0 +1,93 @@ +get: + summary: GET /persons/{personId}/groups + description: Get an ordered list of all groups for a given person, ordered by name. + tags: + - persons + parameters: + - name: personId + in: path + description: Person ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: groupType + in: query + description: Filter by group type + required: false + schema: + $ref: '../enumerations/groupType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - groupId + - name + - startDate + - -groupId + - -name + - -startDate + default: [ name ] + example: + - name + - -groupId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + required: + - pageSize + - pageNumber + - hasPreviousPage + - hasNextPage + - items + properties: + pageSize: + type: integer + format: int32 + description: The number of items per page + pageNumber: + type: integer + format: int32 + description: The current page number + hasPreviousPage: + type: boolean + description: Whether there is a previous page + hasNextPage: + type: boolean + description: Whether there is a previous page + totalPages: + type: integer + format: int32 + description: Total number of pages + items: + type: array + items: + $ref: '../schemas/Group.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/PersonInstance.yaml b/tests/e2e/open-education-api-v5/paths/PersonInstance.yaml new file mode 100644 index 00000000..46e9b2cb --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/PersonInstance.yaml @@ -0,0 +1,34 @@ +get: + summary: GET /persons/{personId} + description: Get a single person. + tags: + - persons + parameters: + - name: personId + in: path + description: User ID + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Person.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/PersonMe.yaml b/tests/e2e/open-education-api-v5/paths/PersonMe.yaml new file mode 100644 index 00000000..de91d00a --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/PersonMe.yaml @@ -0,0 +1,28 @@ +get: + summary: GET /persons/me + description: Returns the person object for the currently authenticated user. + security: + - bearerAuth: [] + tags: + - persons + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Person.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ProgramCollection.yaml b/tests/e2e/open-education-api-v5/paths/ProgramCollection.yaml new file mode 100644 index 00000000..cfd375b9 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ProgramCollection.yaml @@ -0,0 +1,90 @@ +get: + summary: GET /programs + description: Get an ordered list of all programs, ordered by name. + tags: + - programs + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: programType + in: query + description: Filter by program type + required: false + schema: + $ref: '../enumerations/programType.yaml' + - name: qualificationAwarded + in: query + description: Filter by qualificationAwarded + required: false + schema: + $ref: '../enumerations/qualificationAwarded.yaml' + - name: levelOfQualification + in: query + description: Filter by levelOfQualification + required: false + schema: + $ref: '../enumerations/levelOfQualification.yaml' + - name: sector + in: query + description: Filter by sector + required: false + schema: + $ref: '../enumerations/sector.yaml' + - name: fieldsOfStudy + in: query + description: Filter by fieldsOfStudy + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - programId + - name + - -programId + - -name + default: [ name ] + example: + - name + - programId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Program.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ProgramCourseCollection.yaml b/tests/e2e/open-education-api-v5/paths/ProgramCourseCollection.yaml new file mode 100644 index 00000000..3ee838a3 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ProgramCourseCollection.yaml @@ -0,0 +1,80 @@ +get: + summary: GET /programs/{programId}/courses + description: Get an ordered list of all courses given through this program. + tags: + - programs + parameters: + - name: programId + in: path + description: Program ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: level + in: query + description: Filter by level + required: false + schema: + $ref: '../enumerations/level.yaml' + - name: modeOfDelivery + in: query + description: Filter by modeOfDelivery + required: false + schema: + $ref: '../enumerations/modesOfDelivery.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - courseId + - name + - -courseId + - -name + default: [ courseId ] + example: + - name + - -courseId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Course.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ProgramInstance.yaml b/tests/e2e/open-education-api-v5/paths/ProgramInstance.yaml new file mode 100644 index 00000000..7893b45e --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ProgramInstance.yaml @@ -0,0 +1,50 @@ +get: + summary: GET /programs/{programId} + description: Get a single program. + tags: + - programs + parameters: + - name: programId + in: path + description: Program ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to include, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - parent + - children + - coordinators + - organization + - educationSpecification + - $ref: '../parameters/returnTimelineOverrides.yaml' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/ProgramExpanded.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ProgramOfferingCollection.yaml b/tests/e2e/open-education-api-v5/paths/ProgramOfferingCollection.yaml new file mode 100644 index 00000000..ffb90b21 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ProgramOfferingCollection.yaml @@ -0,0 +1,98 @@ +get: + summary: GET /programs/{programId}/offerings + description: Get a list of all offerings for this program, ordered chronologically. + tags: + - programs + parameters: + - name: programId + in: path + description: Program ID + required: true + schema: + type: string + format: uuid + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: modeOfStudy + in: query + description: Filter by modeOfStudy + required: false + schema: + $ref: '../enumerations/modeOfStudy.yaml' + - name: resultExpected + in: query + description: Filter by resultExpected + required: false + schema: + type: boolean + - name: since + in: query + description: Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`). + required: false + schema: + type: string + format: date + - name: until + in: query + description: Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date). + required: false + schema: + type: string + format: date + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - offeringId + - name + - startDate + - endDate + - -offeringId + - -name + - -startDate + - -endDate + default: [ startDate ] + example: + - name + - -startDate + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/ProgramOffering.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/ProgramProgramCollection.yaml b/tests/e2e/open-education-api-v5/paths/ProgramProgramCollection.yaml new file mode 100644 index 00000000..6716f124 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/ProgramProgramCollection.yaml @@ -0,0 +1,96 @@ +get: + summary: GET /programs/{programId}/programs + description: Get an ordered list of nested programs, ordered by name. + tags: + - programs + parameters: + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - $ref: '../parameters/teachingLanguage.yaml' + - name: programId + in: path + description: the id of the program to find nested programs for + required: true + schema: + type: string + format: uuid + - name: programType + in: query + description: Filter by program type + required: false + schema: + $ref: '../enumerations/programType.yaml' + - name: qualificationAwarded + in: query + description: Filter by qualificationAwarded + required: false + schema: + $ref: '../enumerations/qualificationAwarded.yaml' + - name: levelOfQualification + in: query + description: Filter by levelOfQualification + required: false + schema: + $ref: '../enumerations/levelOfQualification.yaml' + - name: sector + in: query + description: Filter by sector + required: false + schema: + $ref: '../enumerations/sector.yaml' + - name: fieldsOfStudy + in: query + description: Filter by fieldsOfStudy + required: false + schema: + type: string + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - programId + - name + - -programId + - -name + default: [ name ] + example: + - name + - -programId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Program.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/RoomCollection.yaml b/tests/e2e/open-education-api-v5/paths/RoomCollection.yaml new file mode 100644 index 00000000..776d74a1 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/RoomCollection.yaml @@ -0,0 +1,69 @@ +get: + summary: GET /rooms + description: Get a list of all rooms, ordered by name (ascending). + tags: + - rooms + parameters: + - $ref: '../parameters/primaryCode.yaml' + - $ref: '../parameters/pageSize.yaml' + - $ref: '../parameters/pageNumber.yaml' + - $ref: '../parameters/consumer.yaml' + - $ref: '../parameters/search.yaml' + - name: roomType + in: query + description: Filter by room type + required: false + schema: + $ref: '../enumerations/roomType.yaml' + - name: sort + in: query + explode: false + description: 'Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]' + required: false + schema: + type: array + items: + type: string + enum: + - roomId + - name + - totalSeats + - availableSeats + - -roomId + - -name + - -totalSeats + - -availableSeats + default: [ name ] + example: + - name + - -availableSeats + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: '../schemas/Pagination.yaml' + - type: object + required: + - items + properties: + items: + type: array + items: + $ref: '../schemas/Room.yaml' + ext: + $ref: '../schemas/Ext.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/RoomInstance.yaml b/tests/e2e/open-education-api-v5/paths/RoomInstance.yaml new file mode 100644 index 00000000..9733f436 --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/RoomInstance.yaml @@ -0,0 +1,45 @@ +get: + summary: GET /rooms/{roomId} + description: Get a single room. + tags: + - rooms + parameters: + - name: roomId + in: path + description: Room ID + required: true + schema: + type: string + format: uuid + - name: expand + in: query + explode: false + description: Optional properties to expand, separated by a comma + required: false + schema: + type: array + items: + type: string + enum: + - building + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Room.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/paths/Service.yaml b/tests/e2e/open-education-api-v5/paths/Service.yaml new file mode 100644 index 00000000..5459dbdc --- /dev/null +++ b/tests/e2e/open-education-api-v5/paths/Service.yaml @@ -0,0 +1,27 @@ +get: + parameters: [] + summary: GET / + description: Get metadata for the service. + tags: + - service metadata + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../schemas/Service.yaml' + '400': + $ref: '../schemas/ErrorBadRequest.yaml' + '401': + $ref: '../schemas/ErrorUnauthorized.yaml' + '403': + $ref: '../schemas/ErrorForbidden.yaml' + '404': + $ref: '../schemas/ErrorNotFound.yaml' + '405': + $ref: '../schemas/ErrorMethodNotAllowed.yaml' + '429': + $ref: '../schemas/ErrorTooManyRequests.yaml' + '500': + $ref: '../schemas/ErrorInternalServerError.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/AcademicSession.yaml b/tests/e2e/open-education-api-v5/schemas/AcademicSession.yaml new file mode 100644 index 00000000..9ab552da --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/AcademicSession.yaml @@ -0,0 +1,80 @@ +type: object +description: | + A named period of time that can be used to communicate the various schedules and time periods an institution recognizes and uses to organize their education. AcademicSessions can be nested. + Offerings MAY be be linked to a specific AcademicSession to indicate that the specified Offering takes place during the AcademicSession, however this is not mandatory. +required: + - academicSessionId + - name + - startDate + - endDate +properties: + academicSessionId: + type: string + description: Unique id for this academic session + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + readOnly: true + academicSessionType: + $ref: '../enumerations/academicSessionType.yaml' + primaryCode: + description: The primary human readable identifier for this academic session. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: identifier + code: '2012-Q1' + name: + type: array + description: The name of this academic session + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Fall semester 2020 + startDate: + type: string + description: The day on which this academic session starts, RFC3339 (full-date) + format: date + example: '2020-08-17' + endDate: + type: string + description: The day on which this academic session ends, RFC3339 (full-date) + format: date + example: '2020-12-18' + parent: + description: The parent Academicsession of this session (e.g. fall semester 20xx where the current session is a week 40). This object is [`expandable`](#tag/academic_sessions_model) + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: Expanded AcademicSession + children: + type: array + description: The list of Academicsession children of this Session (e.g. all academic sessions in fall semester 20xx). This object is [`expandable`](#tag/academic_sessions_model) + items: + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: Expanded AcademicSession + year: + description: The top level year of this session (e.g. 20xx where the current session is a week 40 of a semester). This object is [`expandable`](#tag/academic_sessions_model) + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: Expanded AcademicSession + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Address.yaml b/tests/e2e/open-education-api-v5/schemas/Address.yaml new file mode 100644 index 00000000..0ca44888 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Address.yaml @@ -0,0 +1,53 @@ +type: object +description: The full street address +required: + - addressType +properties: + addressType: + $ref: '../enumerations/addressType.yaml' + street: + type: string + description: The street name + example: Moreelsepark + streetNumber: + type: string + description: The street number + example: "48" + additional: + type: array + description: Further details like building name, suite, apartment number, etc. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: On the other side of the road + postalCode: + type: string + description: Postal code + example: 3511 EP + city: + type: string + description: name of the city / locality + example: Utrecht + countryCode: + type: string + description: the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + example: NL + geolocation: + type: object + description: Geolocation of the entrance of this address (WGS84 coordinate reference system) + required: + - latitude + - longitude + properties: + latitude: + type: number + format: double + example: 52.089123 + longitude: + type: number + format: double + example: 5.113337 + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Association.yaml b/tests/e2e/open-education-api-v5/schemas/Association.yaml new file mode 100644 index 00000000..99879d48 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Association.yaml @@ -0,0 +1,3 @@ +allOf: + - $ref: '../schemas/AssociationId.yaml' + - $ref: '../schemas/AssociationProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/AssociationFull.yaml b/tests/e2e/open-education-api-v5/schemas/AssociationFull.yaml new file mode 100644 index 00000000..6f78db12 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/AssociationFull.yaml @@ -0,0 +1,26 @@ +# oneOf: +# - $ref: '../schemas/ComponentOfferingAssociation.yaml' +# - $ref: '../schemas/CourseOfferingAssociation.yaml' +# - $ref: '../schemas/ProgramOfferingAssociation.yaml' +oneOf: + - $ref: '../schemas/ProgramOfferingAssociation.yaml' + - $ref: '../schemas/CourseOfferingAssociation.yaml' + - $ref: '../schemas/ComponentOfferingAssociation.yaml' +properties: + person: + readOnly: true + oneOf: + - $ref: '../schemas/Identifier.yaml' + title: personId + - $ref: '../schemas/Person.yaml' + title: Person + offering: + oneOf: + - $ref: '../schemas/Identifier.yaml' + title: offeringId + - $ref: '../schemas/ComponentOffering.yaml' + title: ComponentOffering + - $ref: '../schemas/CourseOffering.yaml' + title: CourseOffering + - $ref: '../schemas/ProgramOffering.yaml' + title: ProgramOffering \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/AssociationId.yaml b/tests/e2e/open-education-api-v5/schemas/AssociationId.yaml new file mode 100644 index 00000000..ddf56d18 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/AssociationId.yaml @@ -0,0 +1,11 @@ +type: object +properties: + associationId: + type: string + description: Unique id of this association + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + readOnly: true +required: + - associationId + \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/AssociationProperties.yaml b/tests/e2e/open-education-api-v5/schemas/AssociationProperties.yaml new file mode 100644 index 00000000..f0ee1b42 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/AssociationProperties.yaml @@ -0,0 +1,33 @@ +type: object +description: A relationship between a person object and an offering +required: + - associationType + - role + - state +properties: + associationType: + type: string + description: The type of this association + enum: + - programOfferingAssociation + - courseOfferingAssociation + - componentOfferingAssociation + example: componentOfferingAssociation + readOnly: true + role: + $ref: '../enumerations/associationRole.yaml' + state: + $ref: '../enumerations/associationState.yaml' + readOnly: true + remoteState: + $ref: '../enumerations/remoteAssociationState.yaml' + writeOnly: true + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/AssociationWrite.yaml b/tests/e2e/open-education-api-v5/schemas/AssociationWrite.yaml new file mode 100644 index 00000000..918562ef --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/AssociationWrite.yaml @@ -0,0 +1,14 @@ +oneOf: + - $ref: '../schemas/ProgramOfferingAssociation.yaml' + - $ref: '../schemas/CourseOfferingAssociation.yaml' + - $ref: '../schemas/ComponentOfferingAssociation.yaml' +properties: + offering: + description: The offering this association is for + oneOf: + - $ref: '../schemas/ComponentOffering.yaml' + title: ComponentOffering + - $ref: '../schemas/CourseOffering.yaml' + title: CourseOffering + - $ref: '../schemas/ProgramOffering.yaml' + title: ProgramOffering diff --git a/tests/e2e/open-education-api-v5/schemas/Building.yaml b/tests/e2e/open-education-api-v5/schemas/Building.yaml new file mode 100644 index 00000000..f24c2a02 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Building.yaml @@ -0,0 +1,61 @@ +type: object +description: An object describing a building and the properties of a building. +required: + - buildingId + - name + - address + - primaryCode +properties: + buildingId: + type: string + description: Unique id of this building + format: uuid + example: 123e4567-e89b-12d3-a456-331214174000 + primaryCode: + description: The primary human readable identifier for this building. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: buildingId + code: '45' + abbreviation: + type: string + description: The abbreviation of the name of this building + maxLength: 256 + example: Bb + name: + type: array + description: The name of this building + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Beatrix building + description: + type: array + description: The description of this building. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: external rooms location for exams + address: + $ref: './Address.yaml' + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + example: + - codeType: bagId + code: '0344100000139910' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Component.yaml b/tests/e2e/open-education-api-v5/schemas/Component.yaml new file mode 100644 index 00000000..e403f338 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Component.yaml @@ -0,0 +1,150 @@ +type: object +description: A component is a part of a course +required: + - componentId + - componentType + - name + - teachingLanguage + - abbreviation + - primaryCode +properties: + componentId: + type: string + description: Unique id of this component + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + readOnly: true + primaryCode: + description: The primary human readable identifier for this component. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: componentCode + code: INFOMQNM-WRKCLG-1 + readOnly: true + componentType: + $ref: '../enumerations/componentType.yaml' + name: + type: array + description: The name of this component + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Written test for INFOMQNM + abbreviation: + type: string + description: The abbreviation of this component + maxLength: 256 + example: Test-INFOMQNM + modeOfDelivery: + $ref: '../enumerations/modesOfDelivery.yaml' + duration: + type: string + description: The duration of this component. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339. + pattern: '^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$' + example: P1DT30H4S + description: + type: array + description: The description of this component. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: > + 'Prove executable knowledge of research methods, including: + Acquire knowledge of HCI research paradigms + Able to design suitable research studies (e.g., choose between within and between subject designs) + Define/apply/design metrics and scales + Define/produce materials (e.g., stimuli and questionnaires) + Define protocols for research studies + Understands and take in account concepts of reliability and validity + Analyze and improve methods and analysis of published scientific articles + Able to deliver scientific reports + + Prove executable knowledge of ­­­statistics, including: + Handle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates) + Data preparation (e.g., coding and feature selection) + Reason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors) + Select an appropriate sampling method (e.g., stratified) + Perform parametric tests (e.g., repeated measures (M)ANOVA) + Perform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)' + teachingLanguage: + type: string + description: The (primary) teaching language in which this component is given, should be a three-letter language code as specified by ISO 639-2. + minLength: 3 + maxLength: 3 + pattern: "^[a-z]{3}$" + example: nld + learningOutcomes: + type: array + description: Statements that describe the knowledge or skills students should acquire by the end of a particular course (ECTS-learningoutcome). + items: + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms.' + enrollment: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: The extra information that is provided for enrollment + example: + - language: en-GB + value: enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation. + resources: + type: array + description: An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources) + items: + type: string + example: ['book to be announced', 'on-line resource x'] + assessment: + type: array + description: A description of the way exams for this course are taken (ECTS-assessment method and criteria). + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Exam on campus + addresses: + type: array + description: Addresses for this component + items: + $ref: './Address.yaml' + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + course: + description: | + The course of which this component is a part. [`expandable`](#tag/course_model) + By default only the `courseId` (a string) is returned. If the client requested an expansion of `course` the full course object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: courseId + - $ref: './Course.yaml' + title: Course object + organization: + description: | + The organization which provides this component. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ComponentOffering.yaml b/tests/e2e/open-education-api-v5/schemas/ComponentOffering.yaml new file mode 100644 index 00000000..912ba213 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ComponentOffering.yaml @@ -0,0 +1,80 @@ +allOf: + - $ref: './Offering.yaml' + - type: object + required: + - startDateTime + - endDateTime + properties: + startDateTime: + type: string + description: The moment on which this offering starts, RFC3339 (date-time) + format: date-time + example: 2020-12-15 + endDateTime: + type: string + description: The moment on which this offering ends, RFC3339 (date-time) + format: date-time + example: 2020-12-16 + enrollStartDate: + type: string + description: The first day on which a student can enroll for this course. + format: date + enrollEndDate: + type: string + description: The last day on which a student can enroll for this course. + format: date + resultWeight: + type: integer + description: The result weight of this offering + minimum: 0 + maximum: 100 + example: 100 + addresses: + type: array + description: Addresses for this offering + items: + $ref: './Address.yaml' + priceInformation: + type: array + description: Price information for this offering. + items: + $ref: './Cost.yaml' + room: + $ref: './Room.yaml' + component: + description: | + The component that is offered in this componentoffering. [`expandable`](#tag/component_model) + By default only the `componentId` (a string) is returned. If the client requested an expansion of `component` the full component object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: componentId + - $ref: './Component.yaml' + title: Component object + courseOffering: + description: | + The courseoffering where this componentoffering is related to. [`expandable`](#tag/course_offering_model) + By default only the `courseOfferingId` (a string) is returned. If the client requested an expansion of `courseOffering` the full courseOffering object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: courseOfferingId + - $ref: './CourseOffering.yaml' + title: CourseOffering object + organization: + description: | + The organization that manages this componentoffering. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + academicSession: + description: | + The academicsession during which this componentoffering takes place. [`expandable`](#tag/academic_session_model) + By default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: AcademicSession object + diff --git a/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociation.yaml b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociation.yaml new file mode 100644 index 00000000..6150c047 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociation.yaml @@ -0,0 +1,6 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './ComponentResult.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpandable.yaml b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpandable.yaml new file mode 100644 index 00000000..740689c2 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpandable.yaml @@ -0,0 +1,8 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './ComponentResult.yaml' + person: + $ref: './PersonId.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpanded.yaml new file mode 100644 index 00000000..000970bb --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ComponentOfferingAssociationExpanded.yaml @@ -0,0 +1,16 @@ +allOf: + - $ref: '../schemas/ComponentOfferingAssociation.yaml' +properties: + person: + readOnly: true + oneOf: + - $ref: '../schemas/Identifier.yaml' + title: personId + - $ref: '../schemas/Person.yaml' + title: Person + offering: + oneOf: + - $ref: '../schemas/Identifier.yaml' + title: offeringId + - $ref: '../schemas/ComponentOffering.yaml' + title: ComponentOffering diff --git a/tests/e2e/open-education-api-v5/schemas/ComponentResult.yaml b/tests/e2e/open-education-api-v5/schemas/ComponentResult.yaml new file mode 100644 index 00000000..9eececac --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ComponentResult.yaml @@ -0,0 +1,13 @@ +allOf: + - $ref: './Result.yaml' + - type: object + required: + - weight + properties: + weight: + type: integer + description: The weight to 100 as total for this offering in the course + format: int32 + minimum: 0 + maximum: 100 + example: 100 diff --git a/tests/e2e/open-education-api-v5/schemas/Consumer.yaml b/tests/e2e/open-education-api-v5/schemas/Consumer.yaml new file mode 100644 index 00000000..01bb21b2 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Consumer.yaml @@ -0,0 +1,9 @@ +type: object +description: Object for communicating data to a specific consumer (destination). This object has no relationship with the `consumer` query parameter. +required: + - consumerKey +properties: + consumerKey: + description: The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://open-education-api.github.io/specification/#/consumers) for more information. + type: string +additionalProperties: true diff --git a/tests/e2e/open-education-api-v5/schemas/Cost.yaml b/tests/e2e/open-education-api-v5/schemas/Cost.yaml new file mode 100644 index 00000000..7855e2c5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Cost.yaml @@ -0,0 +1,38 @@ +type: object +required: + - costType +properties: + costType: + $ref: '../enumerations/costType.yaml' + amount: + type: string + pattern: '^\d+(?:\.\d+)?$' + description: The total amount of the cost as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma. + example: '340.84' + vatAmount: + type: string + pattern: '^\d+(?:\.\d+)?$' + description: The part of the cost that is VAT, as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma. + example: '40' + amountWithoutVat: + type: string + pattern: '^\d+(?:\.\d+)?$' + description: The part of the cost that is non-VAT. as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma. + example: '300.84' + currency: + type: string + description: The currency this cost is in. Should correspond to one of the currency codes from ISO 4217. + example: EUR + displayAmount: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: An array of optional pre-formatted strings in different locales. Clients can choose to use this string instead of rendering their own based on the current locale of the user. + example: + - language: nl-NL + value: '€380,84' + - language: en-US + value: '$401.17' + ext: + $ref: './Ext.yaml' +additionalProperties: false diff --git a/tests/e2e/open-education-api-v5/schemas/Course.yaml b/tests/e2e/open-education-api-v5/schemas/Course.yaml new file mode 100644 index 00000000..92fbaf50 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Course.yaml @@ -0,0 +1,12 @@ +allOf: + - $ref: '../schemas/CourseId.yaml' + - $ref: '../schemas/CourseProperties.yaml' + - properties: + validFrom: + description: The first day this course is valid (inclusive). + type: string + format: date + validTo: + description: The day this course ceases to be valid (e.g. exclusive). + type: string + format: date diff --git a/tests/e2e/open-education-api-v5/schemas/CourseExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/CourseExpanded.yaml new file mode 100644 index 00000000..085bb5bf --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseExpanded.yaml @@ -0,0 +1,10 @@ +allOf: + - $ref: './Course.yaml' + - type: object + description: These properties are only present when explicitly included + properties: + timelineOverrides: + description: Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past. + type: array + items: + $ref: './TimelineOverrideCourse.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/CourseId.yaml b/tests/e2e/open-education-api-v5/schemas/CourseId.yaml new file mode 100644 index 00000000..5192d659 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseId.yaml @@ -0,0 +1,11 @@ +type: object +description: An object describing the metadata of a course +required: + - courseId +properties: + courseId: + type: string + description: Unique id of this course + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + readOnly: true diff --git a/tests/e2e/open-education-api-v5/schemas/CourseOffering.yaml b/tests/e2e/open-education-api-v5/schemas/CourseOffering.yaml new file mode 100644 index 00000000..c63f9e39 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseOffering.yaml @@ -0,0 +1,85 @@ +allOf: + - $ref: './Offering.yaml' + - type: object + required: + - modeOfStudy + - startDate + - endDate + properties: + startDate: + type: string + description: The moment on which this offering starts, RFC3339 (full-date) + format: date + example: 2019-08-21 + endDate: + type: string + description: The moment on which this offering ends, RFC3339 (full-date) + format: date + example: 2019-10-23 + enrollStartDate: + type: string + description: The first day on which a student can enroll for this course. + format: date + example: 2019-05-01 + enrollEndDate: + type: string + description: The last day on which a student can enroll for this course. + format: date + example: 2019-08-01 + flexibleEntryPeriodStart: + type: string + description: If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`. + format: date + flexibleEntryPeriodEnd: + type: string + description: If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`. + format: date + addresses: + type: array + description: Addresses for this offering + items: + $ref: './Address.yaml' + priceInformation: + type: array + description: Price information for this offering. + items: + $ref: './Cost.yaml' + course: + description: | + The course that is offered in this courseoffering. [`expandable`](#tag/course_model) + By default only the `courseId` (a string) is returned. If the client requested an expansion of `course` the full course object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: courseId + - $ref: './Course.yaml' + title: Course object + programOffering: + description: | + The programoffering where this courseoffering is related to. [`expandable`](#tag/program_offering_model) + By default only the `programOfferingId` (a string) is returned. If the client requested an expansion of `programOffering` the full programOffering object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: programOfferingId + - $ref: './ProgramOffering.yaml' + title: ProgramOffering object + organization: + description: | + The organization that manages this courseoffering. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + academicSession: + description: | + The academicsession during which this courseoffering takes place. [`expandable`](#tag/academic_session_model) + By default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: AcademicSession object + + + diff --git a/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociation.yaml b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociation.yaml new file mode 100644 index 00000000..a7588873 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociation.yaml @@ -0,0 +1,6 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './CourseResult.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpandable.yaml b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpandable.yaml new file mode 100644 index 00000000..f6a6cf3c --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpandable.yaml @@ -0,0 +1,8 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './CourseResult.yaml' + person: + $ref: './PersonId.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpanded.yaml new file mode 100644 index 00000000..ee61c618 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseOfferingAssociationExpanded.yaml @@ -0,0 +1,13 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './CourseResult.yaml' + person: + description: The person this association is to + $ref: './Person.yaml' + offering: + description: The offering this association is for + $ref: './Offering.yaml' + \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/CourseProperties.yaml b/tests/e2e/open-education-api-v5/schemas/CourseProperties.yaml new file mode 100644 index 00000000..638e7197 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseProperties.yaml @@ -0,0 +1,172 @@ +type: object +description: An object describing the metadata of a course +required: + - name + - abbreviation + - description + - teachingLanguage + - level + - primaryCode +properties: + primaryCode: + description: The primary human readable identifier for this course. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + readOnly: true + name: + type: array + description: The name of this course (ECTS-title) + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Academic and Professional Writing + abbreviation: + type: string + description: The abbreviation or internal code used to identify this course (ECTS-code) + maxLength: 256 + example: INFOMQNM + studyLoad: + $ref: './StudyLoadDescriptor.yaml' + modeOfDelivery: + $ref: '../enumerations/modesOfDelivery.yaml' + duration: + type: string + description: The duration of this course. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339. + pattern: '^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$' + example: P1DT30H4S + firstStartDate: + type: string + description: The date when participants can follow this course for the first time. + format: date + description: + type: array + description: The description of this course (ECTS-description). + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'As with all empirical sciences, to assure valid outcomes, HCI studies heavily rely on research methods and statistics. This holds for the design of user interfaces, personalized recommender systems, and interaction paradigms for the internet of things. This course prepares you to do so by learning you to collect data, design experiments, and analyze the results. By the end of the course, you will have a detailed understanding of how to select and apply quantitative research methods and analysis to address virtually all HCI challenges. Quantitative research and data analysis will be taught in the context of state-of-the-art HCI challenges. Lectures will be alternated with hands-on learning, including work with predefined datasets (e.g., addressing facial features, cognitive load, and emotion). Additionally, students will set up their own research (e.g., using eye tracking). Data processing and analysis will be executed using R.' + teachingLanguage: + type: string + description: The (primary) teaching language in which this course is given, should be a three-letter language code as specified by ISO 639-2. + minLength: 3 + maxLength: 3 + pattern: "^[a-z]{3}$" + example: nld + fieldsOfStudy: + type: string + description: Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf. + maxLength: 4 + example: '0732' + learningOutcomes: + type: array + description: Statements that describe the knowledge or skills students should acquire by the end of a particular course (ECTS-learningoutcome). + items: + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms.' + admissionRequirements: + type: array + description: This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students. + example: + - language: en-GB + value: Students need to be enrolled at qualifying institutions of higher education that participate in this alliance + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + qualificationRequirements: + type: array + description: Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + level: + $ref: '../enumerations/level.yaml' + enrollment: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: The extra information that is provided for enrollment + example: + - language: en-GB + value: enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation. + resources: + type: array + description: An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources) + items: + type: string + example: ['book to be announced', 'on-line resource x'] + assessment: + type: array + description: A description of the way exams for this course are taken (ECTS-assessment method and criteria). + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Exam on campus + link: + type: string + description: URL of the course's website + format: uri + maxLength: 2048 + example: https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM + educationSpecification: + description: The educationSpecification of which this course is a more concrete implementation. [`expandable`](#tag/education_specification_model) + oneOf: + - $ref: './Identifier.yaml' + title: educationSpecificationId + - $ref: './EducationSpecification.yaml' + title: EducationSpecification + addresses: + type: array + description: Addresses for this course + items: + $ref: './Address.yaml' + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/RIO/V1/examples/Course.yaml' + ext: + $ref: './Ext.yaml' + programs: + description: The program of which this course is a part of. This object is [`expandable`](#tag/program_model) + type: array # array is used because of implementation of alliances in program where courses can be part of regular education and alliances + items: + oneOf: + - $ref: './Identifier.yaml' + title: programId + - $ref: './Program.yaml' + title: Program object + coordinators: + description: The person(s) responsible for this course. This object is [`expandable`](#tag/person_model) + type: array + items: + oneOf: + - $ref: './Identifier.yaml' + title: personId + - $ref: './Person.yaml' + title: Person object + organization: + description: | + The organization that manages this group. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object diff --git a/tests/e2e/open-education-api-v5/schemas/CourseResult.yaml b/tests/e2e/open-education-api-v5/schemas/CourseResult.yaml new file mode 100644 index 00000000..ddd0fba3 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/CourseResult.yaml @@ -0,0 +1,8 @@ +allOf: + - $ref: './Result.yaml' + - type: object + required: + - studyLoad + properties: + studyLoad: + $ref: './StudyLoadDescriptor.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/EducationSpecification.yaml b/tests/e2e/open-education-api-v5/schemas/EducationSpecification.yaml new file mode 100644 index 00000000..edc532aa --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/EducationSpecification.yaml @@ -0,0 +1,12 @@ +allOf: + - $ref: '../schemas/EducationSpecificationId.yaml' + - $ref: '../schemas/EducationSpecificationProperties.yaml' + - properties: + validFrom: + description: The first day this EducationSpecification is valid (inclusive). + type: string + format: date + validTo: + description: The day this EducationSpecification ceases to be valid (e.g. exclusive). + type: string + format: date diff --git a/tests/e2e/open-education-api-v5/schemas/EducationSpecificationExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationExpanded.yaml new file mode 100644 index 00000000..409dfb85 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationExpanded.yaml @@ -0,0 +1,10 @@ +allOf: + - $ref: '../schemas/EducationSpecification.yaml' + - type: object + title: With timelineOverrides + properties: + timelineOverrides: + description: Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past. + type: array + items: + $ref: '../schemas/TimelineOverrideEducationSpecification.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/EducationSpecificationId.yaml b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationId.yaml new file mode 100644 index 00000000..dd31240b --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationId.yaml @@ -0,0 +1,9 @@ +type: object +properties: + educationSpecificationId: + type: string + description: Unique id for this education specification + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 +required: + - educationSpecificationId diff --git a/tests/e2e/open-education-api-v5/schemas/EducationSpecificationProperties.yaml b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationProperties.yaml new file mode 100644 index 00000000..5b703d5a --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/EducationSpecificationProperties.yaml @@ -0,0 +1,112 @@ +type: object +description: | + The specification of an education object. This specification allows for other education objects to be derived from it. + It is used to aggregate education objects from a supplying institution. + It clusters programs to a main educationSpecification that is used in registries such as RIO. +required: + - primaryCode + - educationSpecificationType + - name +properties: + primaryCode: + description: | + The primary human readable identifier for the entity. + This will often take the form of a human readable code as defined by the institution or region + $ref: './IdentifierEntry.yaml' + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + example: + - codeType: crohoCreboCode + code: '1234123' + educationSpecificationType: + $ref: '../enumerations/educationSpecificationType.yaml' + name: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: The name of this education specification + example: + - language: en-GB + value: Bachelor Chemical technology + abbreviation: + type: string + description: The abbreviation of this program + maxLength: 256 + example: B Scheikundige Technologie + description: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: The description of this program. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation. + example: + - language: en-GB + value: program that is a place holder for all courses that are made available for student mobility + formalDocument: + $ref: '../enumerations/formalDocument.yaml' + level: + $ref: '../enumerations/level.yaml' + sector: + $ref: '../enumerations/sector.yaml' + levelOfQualification: + $ref: '../enumerations/levelOfQualification.yaml' + fieldsOfStudy: + type: string + description: Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf. + maxLength: 4 + example: '0732' + studyLoad: + $ref: './StudyLoadDescriptor.yaml' + learningOutcomes: + type: array + description: Statements that describe the knowledge or skills students should acquire by the end of a particular course or program (ECTS-learningoutcome). + items: + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'Executable knowledge of Chemical technology, including: Acquire knowledge of research paradigms.' + link: + type: string + description: URL of the program's website + format: uri + maxLength: 2048 + example: https://bijvak.nl + parent: + description: The educationSpecification that is the parent of this educationSpecification if it exists. [`expandable`](#tag/education_specification_model) + oneOf: + - $ref: './Identifier.yaml' + title: educationSpecificationId + - $ref: './EducationSpecification.yaml' + title: EducationSpecification + children: + type: array + description: The EducationSpecifications that have this EducationSpecification as their parent. [`expandable`](#tag/education_specification_model) + items: + oneOf: + - $ref: './Identifier.yaml' + title: educationSpecificationId + - $ref: './EducationSpecification.yaml' + title: EducationSpecification + organization: + description: | + The organization that manages this group. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/RIO/V1/examples/EducationSpecification.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorBadRequest.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorBadRequest.yaml new file mode 100644 index 00000000..efe9aa1f --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorBadRequest.yaml @@ -0,0 +1,5 @@ +description: Bad request +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorForbidden.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorForbidden.yaml new file mode 100644 index 00000000..e3b4ac73 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorForbidden.yaml @@ -0,0 +1,5 @@ +description: Forbidden +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorInternalServerError.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorInternalServerError.yaml new file mode 100644 index 00000000..c6f3809a --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorInternalServerError.yaml @@ -0,0 +1,5 @@ +description: Internal Server Error +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorMethodNotAllowed.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorMethodNotAllowed.yaml new file mode 100644 index 00000000..23adf76f --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorMethodNotAllowed.yaml @@ -0,0 +1,5 @@ +description: Method not allowed +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorNotFound.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorNotFound.yaml new file mode 100644 index 00000000..778f4d92 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorNotFound.yaml @@ -0,0 +1,5 @@ +description: Not Found +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorTooManyRequests.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorTooManyRequests.yaml new file mode 100644 index 00000000..7e510147 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorTooManyRequests.yaml @@ -0,0 +1,5 @@ +description: Too many requests +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/ErrorUnauthorized.yaml b/tests/e2e/open-education-api-v5/schemas/ErrorUnauthorized.yaml new file mode 100644 index 00000000..beb48d3f --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ErrorUnauthorized.yaml @@ -0,0 +1,5 @@ +description: Unauthorized +content: + application/problem+json: + schema: + $ref: 'Problem.yaml' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/Ext.yaml b/tests/e2e/open-education-api-v5/schemas/Ext.yaml new file mode 100644 index 00000000..d6501ad7 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Ext.yaml @@ -0,0 +1,2 @@ +type: object +description: Object for additional non-standard attributes diff --git a/tests/e2e/open-education-api-v5/schemas/Group.yaml b/tests/e2e/open-education-api-v5/schemas/Group.yaml new file mode 100644 index 00000000..d08cb9ef --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Group.yaml @@ -0,0 +1,81 @@ +type: object +description: | + A group is simply a collection of persons. Groups can be used to accommodate various usecases. + + Groups MAY optionally have a relation to an Offering, however the meaning of such relations is left unspecified and is left up to the implementer. +required: + - groupId + - groupType + - name + - primaryCode +properties: + groupId: + type: string + description: Unique id for this group + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + primaryCode: + description: The primary human readable identifier for this group. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: groupCode + code: group-abc987 + groupType: + $ref: '../enumerations/groupType.yaml' + name: + type: array + description: The name of this group + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: statistics students + description: + type: array + description: The description of this group + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: The group of students that follow statistics classes + startDate: + type: string + description: The day on which this group starts being active, RFC3339 (full-date) + format: date + example: '2020-08-17' + endDate: + type: string + description: The day on which this group ends being active, RFC3339 (full-date) + format: date + example: '2020-12-18' + personCount: + type: number + description: The number of persons that are member of this group + format: int32 + minimum: 0 + example: 183 + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + organization: + description: | + The organization that manages this group. [`expandable`](.#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Expanded organization + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/GroupExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/GroupExpanded.yaml new file mode 100644 index 00000000..eaae9742 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/GroupExpanded.yaml @@ -0,0 +1,9 @@ +allOf: + - $ref: './Group.yaml' + - type: object + description: These properties are only present when explicitly included. This allows for categorizing of groups + properties: + organization: + allOf: # Use allOf to make sure description renders + - $ref: './Organization.yaml' + - description: The organization providing this group diff --git a/tests/e2e/open-education-api-v5/schemas/Identifier.yaml b/tests/e2e/open-education-api-v5/schemas/Identifier.yaml new file mode 100644 index 00000000..c9a73649 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Identifier.yaml @@ -0,0 +1,3 @@ +type: string +description: An identifier of another resource. +format: uuid \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/IdentifierEntry.yaml b/tests/e2e/open-education-api-v5/schemas/IdentifierEntry.yaml new file mode 100644 index 00000000..06d8dda5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/IdentifierEntry.yaml @@ -0,0 +1,14 @@ +type: object +properties: + codeType: + $ref: '../enumerations/codeType.yaml' + code: + description: Human readable value for the code/identifier + type: string +required: + - codeType + - code +additionalProperties: false +example: + codeType: 'identifier' + code: '1234qwe12' \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/LanguageTypedString.yaml b/tests/e2e/open-education-api-v5/schemas/LanguageTypedString.yaml new file mode 100644 index 00000000..17dbbd94 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/LanguageTypedString.yaml @@ -0,0 +1,13 @@ +type: object +description: A String with an associated language code. +properties: + language: + description: The language used in the described entity. A string formatted according to RFC3066. + type: string + pattern: "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$" + value: + description: String to describe the entity. + type: string +example: + language: en-GB + value: program that is a place holder for all courses that are made available for student mobility diff --git a/tests/e2e/open-education-api-v5/schemas/NewsFeed.yaml b/tests/e2e/open-education-api-v5/schemas/NewsFeed.yaml new file mode 100644 index 00000000..20a144a2 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/NewsFeed.yaml @@ -0,0 +1,52 @@ +type: object +description: A placeholder or collection of news items +required: + - newsFeedId + - newsFeedType + - name + - description +properties: + newsFeedId: + type: string + description: Unique id for this news feed + format: uuid + example: 123e4567-e89b-12d3-a456-134564174222 + newsFeedType: + type: string + description: The type of the object this news feed relates to + enum: + - organization + - program + - course + - component + - person + - building + - room + example: room + name: + type: array + description: The name for this news feed + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: room Bb 4.35 news + description: + type: array + description: The description of this news feed. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: all information on what happens in room Bb 4.35 + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/NewsItem.yaml b/tests/e2e/open-education-api-v5/schemas/NewsItem.yaml new file mode 100644 index 00000000..113a46cd --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/NewsItem.yaml @@ -0,0 +1,83 @@ +type: object +description: A newsitem contains the message and metadata of that message +required: + - newsItemId + - name +properties: + newsItemId: + type: string + description: Unique id for this news item + format: uuid + example: 123e4567-e89b-12d3-a456-122564174000 + newsItemType: + $ref: '../enumerations/newsItemType.yaml' + name: + type: array + description: The name for this news item + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Room Bb 4.35 will be un available from 2020-09-29 until 2020-09-30 + authors: + type: array + description: The authors of the article with this news item + items: + type: string + maxLength: 256 + example: ['admin@universiteitvanharderwijk.nl'] + image: + type: string + description: The url containing the address of the image belonging to this news item + format: uri + maxLength: 2048 + example: https://upload.wikimedia.org/wikipedia/commons/4/44/Antu_emblem-unavailable.svg + link: + type: string + description: The url containing the address of the article belonging to this news item + format: uri + maxLength: 2048 + example: https://www.universiteitvanharderwijk.nl/cms/ruimtegebrek + content: + type: array + description: The content of this news item. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'The room Bb 4.35 will be under maintenance' + newsFeeds: + description: The newsFeeds where this item can be found. [`expandable`](#tag/news_feed_model) + type: array + items: + oneOf: + - $ref: './Identifier.yaml' + title: newsFeedId + - $ref: './NewsFeed.yaml' + title: NewsFeed + validFrom: + type: string + description: The moment from which this news item is valid, RFC3339 (date-time) + format: date-time + example: 2020-09-28T08:30:00.000Z + validUntil: + type: string + description: The moment until which this news item is valid, RFC3339 (date-time) + format: date-time + example: 2020-09-30T20:00:00.000Z + lastModified: + type: string + description: The moment on which this news item was updated, RFC3339 (date-time) + format: date-time + example: 2020-09-28T00:00:00.000Z + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Offering.yaml b/tests/e2e/open-education-api-v5/schemas/Offering.yaml new file mode 100644 index 00000000..89126b6f --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Offering.yaml @@ -0,0 +1,3 @@ +allOf: + - $ref: '../schemas/OfferingId.yaml' + - $ref: '../schemas/OfferingProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/OfferingId.yaml b/tests/e2e/open-education-api-v5/schemas/OfferingId.yaml new file mode 100644 index 00000000..d2f56481 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/OfferingId.yaml @@ -0,0 +1,11 @@ +type: object +description: ID of Either a program, course or component offering which descrbes the program, course or offering in time +required: + - offeringId +properties: + offeringId: + type: string + description: Unique id of this offering + format: uuid + example: 123e4567-e89b-12d3-a456-134564174000 + readOnly: true diff --git a/tests/e2e/open-education-api-v5/schemas/OfferingIdAndType.yaml b/tests/e2e/open-education-api-v5/schemas/OfferingIdAndType.yaml new file mode 100644 index 00000000..6fb07c98 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/OfferingIdAndType.yaml @@ -0,0 +1,11 @@ +type: object +description: ID and type of Either a program, course or component offering which descrbes the program, course or offering in time +required: + - offeringId +properties: + offeringId: + $ref: '../schemas/OfferingId.yaml' + offeringType: + $ref: '../enumerations/offeringType.yaml' + + diff --git a/tests/e2e/open-education-api-v5/schemas/OfferingProperties.yaml b/tests/e2e/open-education-api-v5/schemas/OfferingProperties.yaml new file mode 100644 index 00000000..2a2842bd --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/OfferingProperties.yaml @@ -0,0 +1,128 @@ +type: object +description: Either a program, course or component offering which descrbes the program, course or offering in time +required: + - primaryCode + - offeringType + - name + - description + - teachingLanguage + - resultExpected +properties: + primaryCode: + description: The primary human readable identifier for this offering. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: offeringCode + code: INFOMQNM-20FS + readOnly: true + offeringType: + type: string + description: The type of this offering + enum: + - program + - course + - component + example: component + academicSession: + $ref: './AcademicSession.yaml' + name: + type: array + description: The name of this offering + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Final written test for INFOMQNM for fall semseter 2020 + abbreviation: + type: string + description: The abbreviation or internal code used to identify this offering + maxLength: 256 + example: Test-INFOMQNM-20FS + description: + type: array + description: The description of this offering. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: | + 'Prove in writing knowledge of research methods, including: + Acquire knowledge of HCI research paradigms + Able to design suitable research studies (e.g., choose between within and between subject designs) + Define/apply/design metrics and scales + Define/produce materials (e.g., stimuli and questionnaires) + Define protocols for research studies + Understands and take in account concepts of reliability and validity + Analyze and improve methods and analysis of published scientific articles + Able to deliver scientific reports + Prove in writing knowledge of ­­­statistics, including: + Handle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates) + Data preparation (e.g., coding and feature selection) + Reason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors) + Select an appropriate sampling method (e.g., stratified) + Perform parametric tests (e.g., repeated measures (M)ANOVA) + Perform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)' + teachingLanguage: + type: string + description: The (primary) teaching language in which this offering is given, should be a three-letter language code as specified by ISO 639-2. + minLength: 3 + maxLength: 3 + pattern: "^[a-z]{3}$" + example: nld + modeOfDelivery: + $ref: '../enumerations/modesOfDelivery.yaml' + maxNumberStudents: + type: number + description: The maximum number of students allowed to enroll for this offering + format: int32 + minimum: 0 + example: 200 + enrolledNumberStudents: + type: number + description: The number of students that have already enrolled for this offering + format: int32 + minimum: 0 + example: 150 + pendingNumberStudents: + type: number + description: The number of students that have a pending enrollment request for this offering + format: int32 + minimum: 0 + example: 50 + minNumberStudents: + type: number + description: The minimum number of students needed for this offering to proceed + format: int32 + minimum: 0 + example: 15 + resultExpected: + type: boolean + description: | + resultExpected, previously knwon as isLineItem is used so the specific instance of the object is identified as being an element that CAN contain “grade” information. + Offerings do not always have to result in a grade or an other type of result. + If there is a result expected from a programOffering/courseOffering/componentOffering the is resultExpected field should parse true + example: true + resultValueType: + $ref: '../enumerations/resultValueType.yaml' + link: + type: string + description: URL of this offering's webpage. + format: uri + maxLength: 2048 + example: https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/RIO/V1/examples/Offering.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Organization.yaml b/tests/e2e/open-education-api-v5/schemas/Organization.yaml new file mode 100644 index 00000000..5797f1be --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Organization.yaml @@ -0,0 +1,104 @@ +type: object +description: A description of a group of people working together to achieve a goal +required: + - organizationId + - organizationType + - name + - shortName + - primaryCode +properties: + organizationId: + type: string + description: Unique id of this organization + format: uuid + example: 123e4567-e89b-12d3-a456-123514174000 + readOnly: true + primaryCode: + description: The primary human readable identifier for the organization. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: orgId + code: Org01-Root + readOnly: true + organizationType: + $ref: '../enumerations/organizationType.yaml' + name: + type: array + description: The name of the organization + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: nl-NL + value: Coöperatie SURF U.A. + shortName: + type: string + description: Short name of the organization + maxLength: 256 + example: SURF + description: + type: array + description: Any general description of the organization should clearly mention the type of higher education organization, especially in the case of a binary system. In Dutch; universiteit (university) or hogeschool (university of applied sciences). + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: nl-NL + value: SURF is een coöperatieve vereniging van Nederlandse onderwijs- en onderzoeksinstellingen waarin de leden hun krachten bundelen. De leden zijn eigenaar van SURF. + addresses: + type: array + description: Addresses of this organization + items: + $ref: './Address.yaml' + link: + type: string + description: URL of the organization's website + format: uri + maxLength: 2048 + example: https://surf.nl + logo: + type: string + description: Logo of this organization + format: uri + maxLength: 2048 + example: https://www.surf.nl/themes/surf/logo.svg + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + minItems: 1 + items: + $ref: './IdentifierEntry.yaml' + example: + - codeType: brin + code: 00AA + - codeType: kvk + code: '12345678' + parent: + description: | + The organizational unit which is the parent of this organization. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + children: + type: array + description: | + All the organizational units for which this organization is the parent. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + items: + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Pagination.yaml b/tests/e2e/open-education-api-v5/schemas/Pagination.yaml new file mode 100644 index 00000000..f3650fa6 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Pagination.yaml @@ -0,0 +1,32 @@ +type: object +required: + - pageSize + - pageNumber + - hasPreviousPage + - hasNextPage + - items +properties: + pageSize: + type: integer + format: int32 + description: The number of items per page + example: 10 + pageNumber: + type: integer + format: int32 + description: The current page number + example: 1 + minimum: 1 + hasPreviousPage: + type: boolean + description: Whether there is a previous page + example: false + hasNextPage: + type: boolean + description: Whether there is a previous page + example: true + totalPages: + type: integer + format: int32 + description: Total number of pages + example: 8 diff --git a/tests/e2e/open-education-api-v5/schemas/Person.yaml b/tests/e2e/open-education-api-v5/schemas/Person.yaml new file mode 100644 index 00000000..5647c2e5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Person.yaml @@ -0,0 +1,3 @@ +allOf: + - $ref: '../schemas/PersonId.yaml' + - $ref: '../schemas/PersonProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/PersonId.yaml b/tests/e2e/open-education-api-v5/schemas/PersonId.yaml new file mode 100644 index 00000000..d7ed81a6 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/PersonId.yaml @@ -0,0 +1,11 @@ +type: object +# description: ID of a person that has a relationship with this institution +properties: + personId: + type: string + description: Unique id of this person + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 +required: + - personId + \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/PersonProperties.yaml b/tests/e2e/open-education-api-v5/schemas/PersonProperties.yaml new file mode 100644 index 00000000..400e0929 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/PersonProperties.yaml @@ -0,0 +1,154 @@ +type: object +description: A person that has a relationship with this institution +required: + - givenName + - surname + - displayName + - affiliations + - mail + - primaryCode + - activeEnrollment +properties: + primaryCode: + description: The primary human readable identifier for the person. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: studentNumber + code: 0000000 + # Returned by GET, not used in POST/PUT/PATCH + readOnly: true + givenName: + type: string + description: The first name of this person + maxLength: 256 + example: Maartje + surnamePrefix: + type: string + description: The prefix of the family name of this person + example: van + surname: + type: string + description: The family name of this person + maxLength: 256 + example: Damme + displayName: + type: string + description: The name of this person which will be displayed + maxLength: 256 + example: Maartje van Damme + initials: + type: string + description: The initials of this person + example: MCW + activeEnrollment: + type: boolean + description: Whether this person has an active enrollment. + example: false + dateOfBirth: + type: string + description: The date of birth of this person, RFC3339 (full-date) + format: date + example: '2003-09-30' + cityOfBirth: + type: string + description: The city of birth of this person + example: Utrecht + countryOfBirth: + type: string + description: The country of birth of this person the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + example: NL + nationality: + type: string + description: The nationality of this person the nationality according to https://gist.github.com/zspine/2365808 + example: Dutch + dateOfNationality: + type: string + description: The date of nationality of this person, RFC3339 (full-date) + format: date + example: '2003-09-30' + affiliations: + $ref: '../enumerations/personAffiliations.yaml' + mail: + type: string + description: The primary e-mailaddress of this person + format: email + maxLength: 256 + example: vandamme.mcw@universiteitvanharderwijk.nl + secondaryMail: + type: string + description: The secondary e-mailaddress of this person + format: email + maxLength: 256 + example: poekie@xyz.nl + telephoneNumber: + type: string + description: The telephone number of this person + maxLength: 256 + example: +31 123 456 789 + mobileNumber: + type: string + description: The mobile number of this person + maxLength: 256 + example: +31 612 345 678 + photoSocial: + type: string + description: The url of the informal picture of this person + format: uri + maxLength: 2048 + example: https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Placeholder_female_superhero_c.png/203px-Placeholder_female_superhero_c.png + photoOfficial: + type: string + description: The url of the official picture of this person + format: uri + maxLength: 2048 + example: https://upload.wikimedia.org/wikipedia/commons/6/66/Johannes_Vermeer_%281632-1675%29_-_The_Girl_With_The_Pearl_Earring_%281665%29.jpg + gender: + $ref: '../enumerations/gender.yaml' + titlePrefix: + type: string + description: A title prefix to be used for this person + example: drs + titleSuffix: + type: string + description: A title suffix to be used for this person + example: BSc + office: + type: string + description: The name of the office where this person is located + address: + $ref: './Address.yaml' + ICEName: + type: string + description: Full name of In Case of Emergency contact + maxLength: 256 + example: Janne + ICEPhoneNumber: + type: string + description: Phone number of In Case of Emergency contact + maxLength: 256 + example: +31 623 456 789 + ICERelation: + $ref: '../enumerations/ICERelationType.yaml' + languageOfChoice: + type: array + description: The language(s) of choice for this person, RFC3066 + items: + type: string + example: nl-NL + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + example: + - codeType: nationalIdentityNumber + code: '00000' + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/PostResponse.yaml b/tests/e2e/open-education-api-v5/schemas/PostResponse.yaml new file mode 100644 index 00000000..ca6b7e4a --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/PostResponse.yaml @@ -0,0 +1,18 @@ +type: object +description: A system message as a response to a POST message +required: + - message +properties: + message: + description: information displayed to user + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Your enrollment was partly succesful, you have been placed on the waitinglist + redirect: + description: URL where additional information can be found e.g. by use of deeplink + type: string + format: uri \ No newline at end of file diff --git a/tests/e2e/open-education-api-v5/schemas/Problem.yaml b/tests/e2e/open-education-api-v5/schemas/Problem.yaml new file mode 100644 index 00000000..f1460c50 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Problem.yaml @@ -0,0 +1,17 @@ +type: object +description: A system message including the error code and an explanation +required: + - status + - title +properties: + status: + type: string + description: The HTTP status code + example: '404' + title: + type: string + description: A short, human-readable summary of the problem type + example: Resource not found + detail: + type: string + description: A human-readable explanation specific to this occurrence of the problem diff --git a/tests/e2e/open-education-api-v5/schemas/Program.yaml b/tests/e2e/open-education-api-v5/schemas/Program.yaml new file mode 100644 index 00000000..d2170d0c --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Program.yaml @@ -0,0 +1,12 @@ +allOf: + - $ref: '../schemas/ProgramId.yaml' + - $ref: '../schemas/ProgramProperties.yaml' + - properties: + validFrom: + description: The first day this program is valid (inclusive). + type: string + format: date + validTo: + description: The day this program ceases to be valid (e.g. exclusive). + type: string + format: date diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramExpanded.yaml new file mode 100644 index 00000000..88f681d7 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramExpanded.yaml @@ -0,0 +1,10 @@ +allOf: + - $ref: './Program.yaml' + - type: object + description: These properties are only present when explicitly included. This allows for creating and displaying structures of programs + properties: + timelineOverrides: + description: Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past. + type: array + items: + $ref: './TimelineOverrideProgram.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramId.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramId.yaml new file mode 100644 index 00000000..726364b1 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramId.yaml @@ -0,0 +1,11 @@ +type: object +description: A collection of courses that lead to a certifiable learning outcome +required: + - programId +properties: + programId: + type: string + description: Unique id for this program + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + readOnly: true diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramOffering.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramOffering.yaml new file mode 100644 index 00000000..279aeaf5 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramOffering.yaml @@ -0,0 +1,74 @@ +allOf: + - $ref: './Offering.yaml' + - type: object + required: + - modeOfStudy + - startDate + - endDate + properties: + startDate: + type: string + description: The moment on which this offering starts, RFC3339 (full-date) + format: date + example: 2019-08-21 + endDate: + type: string + description: The moment on which this offering ends, RFC3339 (full-date) + format: date + example: 2023-06-15 + enrollStartDate: + type: string + description: The first day on which a student can enroll for this program. + format: date + example: 2019-05-01 + enrollEndDate: + type: string + description: The last day on which a student can enroll for this program. + format: date + example: 2019-08-01 + flexibleEntryPeriodStart: + type: string + description: If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`. + format: date + flexibleEntryPeriodEnd: + type: string + description: If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`. + format: date + addresses: + type: array + description: Addresses for this offering + items: + $ref: './Address.yaml' + priceInformation: + type: array + description: Price information for this offering. + items: + $ref: './Cost.yaml' + minItems: 1 + program: + description: | + The Program that is offered in this programoffering. [`expandable`](#tag/program_model) + By default only the `programId` (a string) is returned. If the client requested an expansion of `program` the full program object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: programId + - $ref: './Program.yaml' + title: Program object + organization: + description: | + The organization that manages this programeoffering. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + academicSession: + description: | + The academicsession during which this programoffering takes place. [`expandable`](#tag/academic_session_model) + By default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: academicSessionId + - $ref: './AcademicSession.yaml' + title: AcademicSession object diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociation.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociation.yaml new file mode 100644 index 00000000..b750379f --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociation.yaml @@ -0,0 +1,6 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './ProgramResult.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpandable.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpandable.yaml new file mode 100644 index 00000000..5954b7f7 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpandable.yaml @@ -0,0 +1,9 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './ProgramResult.yaml' + person: + $ref: './PersonId.yaml' + diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpanded.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpanded.yaml new file mode 100644 index 00000000..e2e478d1 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramOfferingAssociationExpanded.yaml @@ -0,0 +1,12 @@ +allOf: + - $ref: './Association.yaml' + - type: object + properties: + result: + $ref: './ProgramResult.yaml' + person: + description: The person this association is to + $ref: './Person.yaml' + offering: + description: The offering this association is for + $ref: './Offering.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramProperties.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramProperties.yaml new file mode 100644 index 00000000..879efd4b --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramProperties.yaml @@ -0,0 +1,195 @@ +type: object +description: A collection of courses that lead to a certifiable learning outcome +required: + - programType + - name + - abbreviation + - description + - primaryCode + - teachingLanguage +properties: + primaryCode: + description: The primary human readable identifier for the program. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: programCode + code: BIO + readOnly: true + programType: + $ref: '../enumerations/programType.yaml' + name: + description: The name of this program + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Biology + abbreviation: + type: string + description: The abbreviation of this program + maxLength: 256 + example: BIO + description: + type: array + description: The description of this program + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: The study of life + teachingLanguage: + type: string + description: The (primary) teaching language in which this program is given, should be a three-letter language code as specified by ISO 639-2. + minLength: 3 + maxLength: 3 + pattern: "^[a-z]{3}$" + example: nld + studyLoad: + $ref: './StudyLoadDescriptor.yaml' + qualificationAwarded: + $ref: '../enumerations/qualificationAwarded.yaml' + modeOfStudy: + $ref: '../enumerations/modeOfStudy.yaml' + modeOfDelivery: + $ref: '../enumerations/modesOfDelivery.yaml' + duration: + type: string + description: The duration of this program. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339. + pattern: '^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$' + example: P1DT30H4S + firstStartDate: + type: string + description: The date when participants can follow this program for the first time. + format: date + levelOfQualification: + $ref: '../enumerations/levelOfQualification.yaml' + level: + $ref: '../enumerations/level.yaml' + sector: + $ref: '../enumerations/sector.yaml' + fieldsOfStudy: + type: string + description: Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf. + maxLength: 4 + example: '0732' + enrollment: + type: array + items: + $ref: './LanguageTypedString.yaml' + description: The extra information that is provided for enrollment + example: + - language: en-GB + value: enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation. + resources: + type: array + description: An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources) + items: + type: string + example: ['book to be announced', 'on-line resource x'] + learningOutcomes: + type: array + description: List of learning outcomes at program level. It is advisable to limit the number of learning outcomes to approximately 20. It is also advisable to make sure that the program learning outcomes in the course catalogue correspond with those on the Diploma Supplement. + items: + type: array + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: 'Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms.' + assessment: + type: array + description: A description of the way exams for this course are taken (ECTS-assessment method and criteria). + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Exam on campus + admissionRequirements: + type: array + description: This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students. + example: + - language: en-GB + value: Students need to be enrolled at qualifying institutions of higher education that participate in this alliance + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + qualificationRequirements: + type: array + description: Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + link: + type: string + description: URL of the program's website + format: uri + maxLength: 2048 + example: https://bijvak.nl + educationSpecification: + description: The educationSpecification of which this program is a more concrete implementation. [`expandable`](#tag/education_specification_model) + oneOf: + - $ref: './Identifier.yaml' + title: educationSpecificationId + - $ref: './EducationSpecification.yaml' + title: EducationSpecification + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + example: + - codeType: crohoCreboCode + code: '59312' + addresses: + type: array + description: Addresses for this program + items: + $ref: './Address.yaml' + parent: + description: Parent program of which the current program is a child. This object is [`expandable`](#tag/program_model) + oneOf: + - $ref: './Identifier.yaml' + title: programId + - $ref: './Program.yaml' + title: Expanded Program + children: + type: array + description: Programs which are a part of this program (e.g specializations). This object is [`expandable`](#tag/program_model) + items: + oneOf: + - $ref: './Identifier.yaml' + title: programId + - $ref: './Program.yaml' + title: Expanded Program + coordinators: + description: The person(s) responsible for this program. This object is [`expandable`](#tag/person_model) + type: array + items: + oneOf: + - $ref: './Identifier.yaml' + title: personId + - $ref: './Person.yaml' + title: Person object + organization: + description: | + The organization providing this program. [`expandable`](#tag/organization_model) + By default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: organizationId + - $ref: './Organization.yaml' + title: Organization object + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/RIO/V1/examples/Program.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/ProgramResult.yaml b/tests/e2e/open-education-api-v5/schemas/ProgramResult.yaml new file mode 100644 index 00000000..a3f169e9 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/ProgramResult.yaml @@ -0,0 +1,8 @@ +allOf: + - $ref: './Result.yaml' + - type: object + required: + - studyLoad + properties: + studyLoad: + $ref: './StudyLoadDescriptor.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Result.yaml b/tests/e2e/open-education-api-v5/schemas/Result.yaml new file mode 100644 index 00000000..0e905e37 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Result.yaml @@ -0,0 +1,25 @@ +type: object +description: A result as part of an association +required: + - state + - resultDate +properties: + state: + $ref: '../enumerations/resultState.yaml' +# added state based on request by CACI + pass: + $ref: '../enumerations/passState.yaml' + comment: + type: string + description: The comment on this result + score: + type: string + description: The score of this program/course/component association (based on resultValueType in offering) + example: '9' + resultDate: + type: string + description: The date this result has been published, RFC3339 (full-date) + format: date + example: 2020-09-28 + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Room.yaml b/tests/e2e/open-education-api-v5/schemas/Room.yaml new file mode 100644 index 00000000..d90382a1 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Room.yaml @@ -0,0 +1,100 @@ +type: object +description: An area within a building where education can take place +required: + - roomId + - roomType + - name + - primaryCode +properties: + roomId: + type: string + description: Unique id for this room + format: uuid + example: 123e4567-e89b-12d3-a456-332114174000 + primaryCode: + description: The primary human readable identifier for the room. This is often the source identifier as defined by the institution. + $ref: './IdentifierEntry.yaml' + example: + codeType: roomCode + code: Bb4.54 + roomType: + $ref: '../enumerations/roomType.yaml' + abbreviation: + type: string + description: The abbreviation of the name of this room + maxLength: 256 + example: Bb4.54 + name: + type: array + description: The name of this room + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: Beatrix building room 4.54 + description: + type: array + description: The description of this room. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation. + minItems: 1 + items: + $ref: './LanguageTypedString.yaml' + example: + - language: en-GB + value: External education and exam room 4.54 + totalSeats: + type: integer + format: int32 + description: The total number of seats located in the room + example: 300 + availableSeats: + type: integer + format: int32 + description: The total number of available (=non-reserved) seats in the room + example: 200 + floor: + type: string + description: The floor on which this room is located + example: '4' + wing: + type: string + description: The wing in which this room is located + example: None + geolocation: + type: object + description: Geolocation of the entrance of this room (WGS84 coordinate reference system) + required: + - latitude + - longitude + properties: + latitude: + type: number + format: double + example: 52.088255 + longitude: + type: number + format: double + example: 5.106669 + otherCodes: + type: array + description: An array of additional human readable codes/identifiers for the entity being described. + items: + $ref: './IdentifierEntry.yaml' + building: + description: | + The building in which the room is located. [`expandable`](#tag/building_model) + By default only the `buildingId` (a string) is returned. If the client requested an expansion of `building` the full building object should be returned. + oneOf: + - $ref: './Identifier.yaml' + title: buildingId + - $ref: './Building.yaml' + title: Building object + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/Service.yaml b/tests/e2e/open-education-api-v5/schemas/Service.yaml new file mode 100644 index 00000000..4eee321e --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/Service.yaml @@ -0,0 +1,34 @@ +type: object +description: A metadataset providing details on the provider of this OOAPI implementation +required: + - contactEmail + - specification + - documentation +properties: + contactEmail: + type: string + description: Contact e-mail address of the service owner + format: email + maxLength: 256 + example: admin@universiteitvanharderwijk.nl + specification: + type: string + description: URL of the API specification (YAML or JSON, compliant with [Open API Specification v3](https://github.com/OAI/OpenAPI-Specification/)) + format: uri + maxLength: 2048 + example: https://rawgit.com/open-education-api/specification/v3/docs.html#tag/course-offerings/paths/~1course-offerings/get + documentation: + type: string + description: URL of the API documentation, including general terms and privacy statement + format: uri + maxLength: 2048 + example: https://open-education-api.github.io/specification/v4/docs.html + consumers: + description: The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism. + type: array + items: + $ref: './Consumer.yaml' + example: + $ref: '../consumers/TEST/V1/examples/TestConsumer.yaml' + ext: + $ref: './Ext.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/StudyLoadDescriptor.yaml b/tests/e2e/open-education-api-v5/schemas/StudyLoadDescriptor.yaml new file mode 100644 index 00000000..3bbc5a86 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/StudyLoadDescriptor.yaml @@ -0,0 +1,26 @@ +type: object +description: The amount of effort to complete this education in the specified unit. +properties: + studyLoadUnit: + description: | + The unit in which the studyload is specfied + - contacttime: CONTACTUUR amount of time spent in classes + - ects: ECTS_PUNT European Credit Transfer System + - sbu: SBU studentloadhours + - sp: STUDIEPUNT studentpoints + - hour: UUR hours + type: string + enum: + - contacttime + - ects + - sbu + - sp + - hour + example: ects + value: + description: The amount of load depicted in numbers + type: number + example: 3 +example: + studyLoadUnit: ects + value: 3 diff --git a/tests/e2e/open-education-api-v5/schemas/TimelineOverrideCourse.yaml b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideCourse.yaml new file mode 100644 index 00000000..3c99d457 --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideCourse.yaml @@ -0,0 +1,18 @@ +type: object +required: + - validFrom + - course +description: A timeline override of the course. +properties: + validFrom: + type: string + description: The day on which this timelineOverride starts (inclusive), RFC3339 (date) + format: date + example: '2021-09-01' + validTo: + type: string + description: The day on which this timelineOverride ends (exclusive), RFC3339 (date) + format: date + example: '2022-08-31' + course: + $ref: './CourseProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/TimelineOverrideEducationSpecification.yaml b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideEducationSpecification.yaml new file mode 100644 index 00000000..b332943a --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideEducationSpecification.yaml @@ -0,0 +1,18 @@ +type: object +description: A timeline override of the EducationSpecification. +required: + - validFrom + - educationSpecification +properties: + validFrom: + type: string + description: The day on which this timelineOverride starts (inclusive), RFC3339 (date) + format: date + example: '2021-09-01' + validTo: + type: string + description: The day on which this timelineOverride ends (exclusive), RFC3339 (date) + format: date + example: '2022-08-31' + educationSpecification: + $ref: './EducationSpecificationProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/schemas/TimelineOverrideProgram.yaml b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideProgram.yaml new file mode 100644 index 00000000..85678f6a --- /dev/null +++ b/tests/e2e/open-education-api-v5/schemas/TimelineOverrideProgram.yaml @@ -0,0 +1,18 @@ +type: object +description: A time-line override of the program. +required: + - validFrom + - program +properties: + validFrom: + type: string + description: The day on which this timelineOverride starts (inclusive), RFC3339 (date) + format: date + example: '2021-09-01' + validTo: + type: string + description: The day on which this timelineOverride ends (exclusive), RFC3339 (date) + format: date + example: '2022-08-31' + program: + $ref: './ProgramProperties.yaml' diff --git a/tests/e2e/open-education-api-v5/spec.yaml b/tests/e2e/open-education-api-v5/spec.yaml new file mode 100644 index 00000000..36821de4 --- /dev/null +++ b/tests/e2e/open-education-api-v5/spec.yaml @@ -0,0 +1,355 @@ +openapi: "3.0.3" +info: + version: "5.0.0" + title: Open Education API + description: | + OpenAPI (fka Swagger) specification for the Open Education API. + +
+ + OOAPI information model that feeds OOAPI specification + +
OOAPI information model that feeds OOAPI specification (click to enlage)
+
+ + The model provides an overview of how the objects on which the API is specified are related. The overarching concept educations is not found in the in the end points of the API. The smaller concepts of programOffering, courseOffering and conceptOffering are all found in the offering endpoint. The different types of association can all be found in the association endpoint. + + The original file for this model can be found here + + The program relations object is not found as a separate endpoint but relations between programs can be found within the program endpoint by expanding that endpoint. + + Information about earlier meetings and presentations can be found here + + Information on the EDU-API model that was also used for this api is shown here + + + + x-logo: + url: ../logo.png + +servers: + - url: http://demo01.eduapi.nl/v5 + description: SURF demo implementation + +tags: + - name: service metadata + description: The service API provides additional metadata needed to make the OOAPI fit for this organization. + - name: academic sessions + description: The academic sessions API provides information about the different time periods a program can be offered. + - name: associations + description: | + The associations API provides information about the association between an offering and a person (e.g. students, lecturers, etc). + Associations can be posted between institutions This requires information details on the offering and the persons. + To allow for this information a complete person object and offering object can be part of the API. + The structure is explained in the following model: + + + + + + + + + + + + + + + + + + + + + +
offering
studentexternal
internalPOST /associations/external/me gets student details from .wellknown at home institution. It passes offering details (provided by external institution) to the home institution so the home institution can create a placeholder for the offering and its results. +
externalno support needed
+ Direct update of current information: PATCH /associations/{associationId} + This call is currently limited to passing results and a remote state. For future use other association resource information could be passed. + More information on the support for student mobility can be found + here + + - name: buildings + description: The building API provides a building that is currently used by the organization. Including all location details. + - name: courses + description: The courses API provides a self-contained and formally structured learning experience. Aimed at providing learning outcomes to students. Usually placed in the context of a program. + - name: components + description: The components API provides information about components being part of parent courses. + - name: education specifications + description: | + The education specification API provides information on the specification of an education object. + This specification allows for other education objects to be derived from it. + It is used to aggregate education objects from a supplying institution. + It clusters programs to a main educationSpecification that is used in registries such as RIO. + - name: groups + description: The groups API provides information about groups that are related to organizations, persons and offerings. Groups of students that are related to an offering are typically used for rostering. The rostering application assigns students based on these groups. For example, class 1b will be assigned to the course offering on monday morning. Not all groups are related to an offering. A group of people can also be a team that is working on a task outside the OOAPI scope. These can be teams of students, but also teams of employees. + - name: news + description: The news API provides news feeds and items regarding a specific subject. + - name: offerings + description: The offerings API provides information about offerings which have a global timeframe, e.g. a period to which students can enroll. + - name: organizations + description: The organizations API provides the organizations that are responsible for the execution and recognition of education. + - name: persons + description: The persons API provides information about persons related to an organization. + - name: programs + description: The programs API provides a coherent set of educational components, aimed at the realization of competences or objectives in the field of knowledge, insight, attitudes and skills that the person who completes the program must have. + - name: rooms + description: The rooms API provides the part of a building where an activity can take place. Including detail information on the resources available, number of seats, etc. (Updated continuously) + + - name: service_model + x-displayName: Service + description: | + + - name: education_specification_model + x-displayName: EducationSpecification + description: | + + - name: program_model + x-displayName: Program + description: | + + - name: course_model + x-displayName: Course + description: | + + - name: component_model + x-displayName: Component + description: | + + - name: program_offering_model + x-displayName: ProgramOffering + description: | + + - name: course_offering_model + x-displayName: CourseOffering + description: | + + - name: component_offering_model + x-displayName: ComponentOffering + description: | + + - name: association_model + x-displayName: Association + description: | + + - name: person_model + x-displayName: Person + description: | + + - name: group_model + x-displayName: Group + description: | + + - name: academic_session_model + x-displayName: AcademicSession + description: | + + - name: organization_model + x-displayName: Organization + description: | + + - name: building_model + x-displayName: Building + description: | + + - name: room_model + x-displayName: Room + description: | + + - name: news_feed_model + x-displayName: NewsFeed + description: | + + - name: news_item_model + x-displayName: NewsItem + description: | + + +x-tagGroups: + - name: Requests and respones + tags: + - service metadata + - academic sessions + - associations + - buildings + - courses + - components + - education specifications + - groups + - news + - offerings + - organizations + - persons + - programs + - rooms + - name: Models + tags: + - service_model + - academic_session_model + - association_model + - building_model + - component_model + - component_offering_model + - course_model + - course_offering_model + - education_specification_model + - group_model + - news_feed_model + - news_item_model + - organization_model + - person_model + - program_model + - program_offering_model + - room_model + +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + openId: + type: openIdConnect + openIdConnectUrl: https://example.nl/.well-known/openid-configuration + schemas: + # allOf: + # - $ref: 'schemas/Service.yaml' + # - $ref: schemas/AcademicSession.yaml + # - $ref: schemas/Building.yaml + # - $ref: schemas/Component.yaml + # - $ref: schemas/ComponentOffering.yaml + # - $ref: schemas/Course.yaml + # - $ref: schemas/CourseOffering.yaml + # - $ref: schemas/EducationSpecification.yaml + # - $ref: schemas/Group.yaml + # - $ref: schemas/NewsFeed.yaml + # - $ref: schemas/NewsItem.yaml + # - $ref: schemas/Organization.yaml + # - $ref: schemas/Person.yaml + # - $ref: schemas/Program.yaml + # - $ref: schemas/ProgramOffering.yaml + # - $ref: schemas/Room.yaml + # - $ref: schemas/AssociationFull.yaml + +paths: + /: + $ref: paths/Service.yaml + /persons: + $ref: paths/PersonCollection.yaml + /persons/me: + $ref: paths/PersonMe.yaml + /persons/{personId}: + $ref: paths/PersonInstance.yaml + /persons/{personId}/associations: + $ref: paths/PersonAssociationCollection.yaml + /persons/{personId}/groups: + $ref: paths/PersonGroupCollection.yaml + /organizations: + $ref: paths/OrganizationCollection.yaml + /organizations/{organizationId}: + $ref: paths/OrganizationInstance.yaml + /organizations/{organizationId}/programs: + $ref: paths/OrganizationProgramCollection.yaml + /organizations/{organizationId}/courses: + $ref: paths/OrganizationCourseCollection.yaml + /organizations/{organizationId}/components: + $ref: paths/OrganizationComponentCollection.yaml + /organizations/{organizationId}/offerings: + $ref: paths/OrganizationOfferingCollection.yaml + /organizations/{organizationId}/groups: + $ref: paths/OrganizationGroupCollection.yaml + /organizations/{organizationId}/education-specifications: + $ref: paths/OrganizationEducationSpecificationCollection.yaml + /academic-sessions: + $ref: paths/AcademicSessionCollection.yaml + /academic-sessions/{academicSessionId}: + $ref: paths/AcademicSessionInstance.yaml + /academic-sessions/{academicSessionId}/offerings: + $ref: paths/AcademicSessionOfferingCollection.yaml + /programs: + $ref: paths/ProgramCollection.yaml + /programs/{programId}: + $ref: paths/ProgramInstance.yaml + /programs/{programId}/programs: + $ref: paths/ProgramProgramCollection.yaml + /programs/{programId}/courses: + $ref: paths/ProgramCourseCollection.yaml + /programs/{programId}/offerings: + $ref: paths/ProgramOfferingCollection.yaml + /courses: + $ref: paths/CourseCollection.yaml + /courses/{courseId}: + $ref: paths/CourseInstance.yaml + /courses/{courseId}/components: + $ref: paths/CourseComponentCollection.yaml + /courses/{courseId}/offerings: + $ref: paths/CourseOfferingCollection.yaml + /components/{componentId}: + $ref: paths/ComponentInstance.yaml + /components/{componentId}/offerings: + $ref: paths/ComponentOfferingCollection.yaml + /offerings/{offeringId}: + $ref: paths/OfferingInstance.yaml + /offerings/{offeringId}/associations: + $ref: paths/OfferingAssociationCollection.yaml + # /offerings/{offeringId}/associations/me: + # $ref: paths/OfferingAssociationInstanceMe.yaml + /offerings/{offeringId}/groups: + $ref: paths/OfferingGroupCollection.yaml + /associations/{associationId}: + $ref: paths/AssociationInstance.yaml + # /associations/me: + # $ref: paths/AssociationInstanceMe.yaml + /associations/external/me: + $ref: paths/AssociationInstanceExternalMe.yaml + /buildings: + $ref: paths/BuildingCollection.yaml + /buildings/{buildingId}: + $ref: paths/BuildingInstance.yaml + /buildings/{buildingId}/rooms: + $ref: paths/BuildingRoomCollection.yaml + /rooms: + $ref: paths/RoomCollection.yaml + /rooms/{roomId}: + $ref: paths/RoomInstance.yaml + /news-feeds: + $ref: paths/NewsFeedCollection.yaml + /news-feeds/{newsFeedId}: + $ref: paths/NewsFeedInstance.yaml + /news-feeds/{newsFeedId}/news-items: + $ref: paths/NewsFeedItemCollection.yaml + /news-items/{newsItemId}: + $ref: paths/NewsItemInstance.yaml + /education-specifications: + $ref: paths/EducationSpecificationCollection.yaml + /education-specifications/{educationSpecificationId}: + $ref: paths/EducationSpecificationInstance.yaml + /education-specifications/{educationSpecificationId}/education-specifications: + $ref: paths/EducationSpecificationEducationSpecificationCollection.yaml + /education-specifications/{educationSpecificationId}/courses: + $ref: paths/EducationSpecificationCourseCollection.yaml + /education-specifications/{educationSpecificationId}/programs: + $ref: paths/EducationSpecificationProgramCollection.yaml + /groups: + $ref: paths/GroupCollection.yaml + /groups/{groupId}: + $ref: paths/GroupInstance.yaml + /groups/{groupId}/persons: + $ref: paths/GroupPersonCollection.yaml diff --git a/tests/e2e/openapi.yml b/tests/e2e/openapi.yml new file mode 100644 index 00000000..3bbd4542 --- /dev/null +++ b/tests/e2e/openapi.yml @@ -0,0 +1,2757 @@ +openapi: 3.0.3 +info: + title: API Platform's demo + description: |- + This is a demo application of the [API Platform](https://api-platform.com) framework. + [Its source code](https://github.com/api-platform/demo) includes various examples, check it out! + You may also be interested by [the GraphQL entrypoint](/graphql). + [A PWA](/) and [an admin](/admin) are consuming this API. + version: 1.0.0 +servers: + - url: / + description: '' +paths: + /books: + get: + operationId: getBookCollection + tags: + - Book + responses: + '200': + description: Book collection + content: + application/ld+json: + schema: + type: object + properties: + hydra:member: + type: array + items: + $ref: '#/components/schemas/Book.jsonld-book.read' + hydra:totalItems: + type: integer + minimum: 0 + hydra:view: + type: object + properties: + '@id': + type: string + format: iri-reference + '@type': + type: string + hydra:first: + type: string + format: iri-reference + hydra:last: + type: string + format: iri-reference + hydra:previous: + type: string + format: iri-reference + hydra:next: + type: string + format: iri-reference + hydra:search: + type: object + properties: + '@type': + type: string + hydra:template: + type: string + hydra:variableRepresentation: + type: string + hydra:mapping: + type: array + items: + type: object + properties: + '@type': + type: string + variable: + type: string + property: + type: string + nullable: true + required: + type: boolean + required: + - hydra:member + application/hal+json: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + application/vnd.api+json: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + text/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + application/x-yaml: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + text/csv: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + text/html: + schema: + type: array + items: + $ref: '#/components/schemas/Book-book.read' + summary: Retrieves the collection of Book resources. + description: Retrieves the collection of Book resources. + parameters: + - name: page + in: query + description: The collection page number + required: false + deprecated: false + allowEmptyValue: true + schema: + type: integer + default: 1 + style: form + explode: false + allowReserved: false + - name: archived + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: boolean + style: form + explode: false + allowReserved: false + - name: order[id] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[title] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[author] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[isbn] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[publicationDate] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: properties[] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: array + items: + type: string + style: form + explode: true + allowReserved: false + - name: title + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + style: form + explode: false + allowReserved: false + - name: author + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + style: form + explode: false + allowReserved: false + deprecated: false + post: + operationId: postBookCollection + tags: + - Book + responses: + '201': + description: Book resource created + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld-book.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/csv: + schema: + $ref: '#/components/schemas/Book-book.read' + text/html: + schema: + $ref: '#/components/schemas/Book-book.read' + links: + GetBookItem: + operationId: getBookItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /books/{id}`. + '400': + description: Invalid input + '422': + description: Unprocessable entity + summary: Creates a Book resource. + description: Creates a Book resource. + parameters: [] + requestBody: + description: The new Book resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Book' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book' + application/json: + schema: + $ref: '#/components/schemas/Book' + application/xml: + schema: + $ref: '#/components/schemas/Book' + text/xml: + schema: + $ref: '#/components/schemas/Book' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book' + text/csv: + schema: + $ref: '#/components/schemas/Book' + text/html: + schema: + $ref: '#/components/schemas/Book' + required: true + deprecated: false + parameters: [] + /books/{id}: + get: + operationId: getBookItem + tags: + - Book + responses: + '200': + description: Book resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld-book.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/csv: + schema: + $ref: '#/components/schemas/Book-book.read' + text/html: + schema: + $ref: '#/components/schemas/Book-book.read' + '404': + description: Resource not found + summary: Retrieves a Book resource. + description: Retrieves a Book resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: false + put: + operationId: putBookItem + tags: + - Book + responses: + '200': + description: Book resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld-book.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/csv: + schema: + $ref: '#/components/schemas/Book-book.read' + text/html: + schema: + $ref: '#/components/schemas/Book-book.read' + links: + GetBookItem: + operationId: getBookItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /books/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Replaces the Book resource. + description: Replaces the Book resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Book resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Book' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book' + application/json: + schema: + $ref: '#/components/schemas/Book' + application/xml: + schema: + $ref: '#/components/schemas/Book' + text/xml: + schema: + $ref: '#/components/schemas/Book' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book' + text/csv: + schema: + $ref: '#/components/schemas/Book' + text/html: + schema: + $ref: '#/components/schemas/Book' + required: true + deprecated: false + delete: + operationId: deleteBookItem + tags: + - Book + responses: + '204': + description: Book resource deleted + '404': + description: Resource not found + summary: Removes the Book resource. + description: Removes the Book resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: false + patch: + operationId: patchBookItem + tags: + - Book + responses: + '200': + description: Book resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld-book.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/json: + schema: + $ref: '#/components/schemas/Book-book.read' + application/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/xml: + schema: + $ref: '#/components/schemas/Book-book.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book-book.read' + text/csv: + schema: + $ref: '#/components/schemas/Book-book.read' + text/html: + schema: + $ref: '#/components/schemas/Book-book.read' + links: + GetBookItem: + operationId: getBookItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /books/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Updates the Book resource. + description: Updates the Book resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Book resource + content: + application/merge-patch+json: + schema: + $ref: '#/components/schemas/Book' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book' + required: true + deprecated: false + parameters: [] + /books/{id}/generate-cover: + put: + operationId: generate_coverBookItem + tags: + - Book + responses: + '204': + description: Book resource updated + content: + application/ld+json: + schema: {} + application/hal+json: + schema: {} + application/vnd.api+json: + schema: {} + application/json: + schema: {} + application/xml: + schema: {} + text/xml: + schema: {} + application/x-yaml: + schema: {} + text/csv: + schema: {} + text/html: + schema: {} + links: + GetBookItem: + operationId: getBookItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /books/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Replaces the Book resource. + description: Replaces the Book resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Book resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Book.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Book' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Book' + application/json: + schema: + $ref: '#/components/schemas/Book' + application/xml: + schema: + $ref: '#/components/schemas/Book' + text/xml: + schema: + $ref: '#/components/schemas/Book' + application/x-yaml: + schema: + $ref: '#/components/schemas/Book' + text/csv: + schema: + $ref: '#/components/schemas/Book' + text/html: + schema: + $ref: '#/components/schemas/Book' + required: true + deprecated: false + parameters: [] + /books/{id}/reviews: + get: + operationId: api_books_reviews_get_subresourceBookSubresource + tags: + - Review + - Book + responses: + '200': + description: Book resource + content: + application/ld+json: + schema: + type: object + properties: + hydra:member: + type: array + items: + $ref: '#/components/schemas/Review.jsonld-review.read' + hydra:totalItems: + type: integer + minimum: 0 + hydra:view: + type: object + properties: + '@id': + type: string + format: iri-reference + '@type': + type: string + hydra:first: + type: string + format: iri-reference + hydra:last: + type: string + format: iri-reference + hydra:previous: + type: string + format: iri-reference + hydra:next: + type: string + format: iri-reference + hydra:search: + type: object + properties: + '@type': + type: string + hydra:template: + type: string + hydra:variableRepresentation: + type: string + hydra:mapping: + type: array + items: + type: object + properties: + '@type': + type: string + variable: + type: string + property: + type: string + nullable: true + required: + type: boolean + required: + - hydra:member + application/hal+json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + summary: Retrieves a Book resource. + description: Retrieves a Book resource. + parameters: + - name: id + in: path + description: Book identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + - name: page + in: query + description: The collection page number + required: false + deprecated: false + allowEmptyValue: true + schema: + type: integer + default: 1 + style: form + explode: false + allowReserved: false + - name: order[id] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[publicationDate] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: book + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + style: form + explode: false + allowReserved: false + - name: book[] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: array + items: + type: string + style: form + explode: true + allowReserved: false + deprecated: false + parameters: [] + /parchments: + get: + operationId: getParchmentCollection + tags: + - Parchment + responses: + '200': + description: Parchment collection + content: + application/ld+json: + schema: + type: object + properties: + hydra:member: + type: array + items: + $ref: '#/components/schemas/Parchment.jsonld' + hydra:totalItems: + type: integer + minimum: 0 + hydra:view: + type: object + properties: + '@id': + type: string + format: iri-reference + '@type': + type: string + hydra:first: + type: string + format: iri-reference + hydra:last: + type: string + format: iri-reference + hydra:previous: + type: string + format: iri-reference + hydra:next: + type: string + format: iri-reference + hydra:search: + type: object + properties: + '@type': + type: string + hydra:template: + type: string + hydra:variableRepresentation: + type: string + hydra:mapping: + type: array + items: + type: object + properties: + '@type': + type: string + variable: + type: string + property: + type: string + nullable: true + required: + type: boolean + required: + - hydra:member + application/hal+json: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + type: array + items: + $ref: '#/components/schemas/Parchment' + summary: Retrieves the collection of Parchment resources. + description: Retrieves the collection of Parchment resources. + parameters: + - name: page + in: query + description: The collection page number + required: false + deprecated: false + allowEmptyValue: true + schema: + type: integer + default: 1 + style: form + explode: false + allowReserved: false + deprecated: true + post: + operationId: postParchmentCollection + tags: + - Parchment + responses: + '201': + description: Parchment resource created + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + links: + GetParchmentItem: + operationId: getParchmentItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /parchments/{id}`. + '400': + description: Invalid input + '422': + description: Unprocessable entity + summary: Creates a Parchment resource. + description: Creates a Parchment resource. + parameters: [] + requestBody: + description: The new Parchment resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + required: true + deprecated: true + parameters: [] + /parchments/{id}: + get: + operationId: getParchmentItem + tags: + - Parchment + responses: + '200': + description: Parchment resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + '404': + description: Resource not found + summary: Retrieves a Parchment resource. + description: Retrieves a Parchment resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: true + put: + operationId: putParchmentItem + tags: + - Parchment + responses: + '200': + description: Parchment resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + links: + GetParchmentItem: + operationId: getParchmentItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /parchments/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Replaces the Parchment resource. + description: Replaces the Parchment resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Parchment resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + required: true + deprecated: true + delete: + operationId: deleteParchmentItem + tags: + - Parchment + responses: + '204': + description: Parchment resource deleted + '404': + description: Resource not found + summary: Removes the Parchment resource. + description: Removes the Parchment resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: true + patch: + operationId: patchParchmentItem + tags: + - Parchment + responses: + '200': + description: Parchment resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Parchment.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + application/json: + schema: + $ref: '#/components/schemas/Parchment' + application/xml: + schema: + $ref: '#/components/schemas/Parchment' + text/xml: + schema: + $ref: '#/components/schemas/Parchment' + application/x-yaml: + schema: + $ref: '#/components/schemas/Parchment' + text/csv: + schema: + $ref: '#/components/schemas/Parchment' + text/html: + schema: + $ref: '#/components/schemas/Parchment' + links: + GetParchmentItem: + operationId: getParchmentItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /parchments/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Updates the Parchment resource. + description: Updates the Parchment resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Parchment resource + content: + application/merge-patch+json: + schema: + $ref: '#/components/schemas/Parchment' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Parchment' + required: true + deprecated: true + parameters: [] + /reviews: + get: + operationId: getReviewCollection + tags: + - Review + responses: + '200': + description: Review collection + content: + application/ld+json: + schema: + type: object + properties: + hydra:member: + type: array + items: + $ref: '#/components/schemas/Review.jsonld-review.read' + hydra:totalItems: + type: integer + minimum: 0 + hydra:view: + type: object + properties: + '@id': + type: string + format: iri-reference + '@type': + type: string + hydra:first: + type: string + format: iri-reference + hydra:last: + type: string + format: iri-reference + hydra:previous: + type: string + format: iri-reference + hydra:next: + type: string + format: iri-reference + hydra:search: + type: object + properties: + '@type': + type: string + hydra:template: + type: string + hydra:variableRepresentation: + type: string + hydra:mapping: + type: array + items: + type: object + properties: + '@type': + type: string + variable: + type: string + property: + type: string + nullable: true + required: + type: boolean + required: + - hydra:member + application/hal+json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + type: array + items: + $ref: '#/components/schemas/Review-review.read' + summary: Retrieves the collection of Review resources. + description: Retrieves the collection of Review resources. + parameters: + - name: page + in: query + description: The collection page number + required: false + deprecated: false + allowEmptyValue: true + schema: + type: integer + default: 1 + style: form + explode: false + allowReserved: false + - name: order[id] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: order[publicationDate] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + style: form + explode: false + allowReserved: false + - name: book + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: string + style: form + explode: false + allowReserved: false + - name: book[] + in: query + description: '' + required: false + deprecated: false + allowEmptyValue: true + schema: + type: array + items: + type: string + style: form + explode: true + allowReserved: false + deprecated: false + post: + operationId: postReviewCollection + tags: + - Review + responses: + '201': + description: Review resource created + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + $ref: '#/components/schemas/Review-review.read' + links: + GetReviewItem: + operationId: getReviewItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /reviews/{id}`. + '400': + description: Invalid input + '422': + description: Unprocessable entity + summary: Creates a Review resource. + description: Creates a Review resource. + parameters: [] + requestBody: + description: The new Review resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.write' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.write' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.write' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.write' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.write' + text/html: + schema: + $ref: '#/components/schemas/Review-review.write' + required: true + deprecated: false + parameters: [] + /reviews/{id}: + get: + operationId: getReviewItem + tags: + - Review + responses: + '200': + description: Review resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + $ref: '#/components/schemas/Review-review.read' + '404': + description: Resource not found + summary: Retrieves a Review resource. + description: Retrieves a Review resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: false + put: + operationId: putReviewItem + tags: + - Review + responses: + '200': + description: Review resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + $ref: '#/components/schemas/Review-review.read' + links: + GetReviewItem: + operationId: getReviewItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /reviews/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Replaces the Review resource. + description: Replaces the Review resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Review resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.write' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.write' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.write' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.write' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.write' + text/html: + schema: + $ref: '#/components/schemas/Review-review.write' + required: true + deprecated: false + delete: + operationId: deleteReviewItem + tags: + - Review + responses: + '204': + description: Review resource deleted + '404': + description: Resource not found + summary: Removes the Review resource. + description: Removes the Review resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: false + patch: + operationId: patchReviewItem + tags: + - Review + responses: + '200': + description: Review resource updated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Review.jsonld-review.read' + application/hal+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/json: + schema: + $ref: '#/components/schemas/Review-review.read' + application/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/xml: + schema: + $ref: '#/components/schemas/Review-review.read' + application/x-yaml: + schema: + $ref: '#/components/schemas/Review-review.read' + text/csv: + schema: + $ref: '#/components/schemas/Review-review.read' + text/html: + schema: + $ref: '#/components/schemas/Review-review.read' + links: + GetReviewItem: + operationId: getReviewItem + parameters: + id: $response.body#/id + description: The `id` value returned in the response can be used as the `id` parameter in `GET /reviews/{id}`. + '400': + description: Invalid input + '404': + description: Resource not found + '422': + description: Unprocessable entity + summary: Updates the Review resource. + description: Updates the Review resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + requestBody: + description: The updated Review resource + content: + application/merge-patch+json: + schema: + $ref: '#/components/schemas/Review-review.write' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Review-review.write' + required: true + deprecated: false + parameters: [] + /stats: + get: + operationId: get + tags: + - Stats + responses: + '200': + content: + application/json: + schema: + type: object + properties: + books_count: + type: integer + example: 997 + topbooks_count: + type: integer + example: 101 + summary: Retrieves the number of books and top books (legacy endpoint). + description: '' + parameters: [] + deprecated: false + parameters: [] + /top_books: + get: + operationId: getTopBookCollection + tags: + - TopBook + responses: + '200': + description: TopBook collection + content: + application/ld+json: + schema: + type: object + properties: + hydra:member: + type: array + items: + $ref: '#/components/schemas/TopBook.jsonld' + hydra:totalItems: + type: integer + minimum: 0 + hydra:view: + type: object + properties: + '@id': + type: string + format: iri-reference + '@type': + type: string + hydra:first: + type: string + format: iri-reference + hydra:last: + type: string + format: iri-reference + hydra:previous: + type: string + format: iri-reference + hydra:next: + type: string + format: iri-reference + hydra:search: + type: object + properties: + '@type': + type: string + hydra:template: + type: string + hydra:variableRepresentation: + type: string + hydra:mapping: + type: array + items: + type: object + properties: + '@type': + type: string + variable: + type: string + property: + type: string + nullable: true + required: + type: boolean + required: + - hydra:member + application/hal+json: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + application/vnd.api+json: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + text/xml: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + application/x-yaml: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + text/csv: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + text/html: + schema: + type: array + items: + $ref: '#/components/schemas/TopBook' + summary: Retrieves the collection of TopBook resources. + description: Retrieves the collection of TopBook resources. + parameters: + - name: page + in: query + description: The collection page number + required: false + deprecated: false + allowEmptyValue: true + schema: + type: integer + default: 1 + style: form + explode: false + allowReserved: false + deprecated: false + parameters: [] + /top_books/{id}: + get: + operationId: getTopBookItem + tags: + - TopBook + responses: + '200': + description: TopBook resource + content: + application/ld+json: + schema: + $ref: '#/components/schemas/TopBook.jsonld' + application/hal+json: + schema: + $ref: '#/components/schemas/TopBook' + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TopBook' + application/json: + schema: + $ref: '#/components/schemas/TopBook' + application/xml: + schema: + $ref: '#/components/schemas/TopBook' + text/xml: + schema: + $ref: '#/components/schemas/TopBook' + application/x-yaml: + schema: + $ref: '#/components/schemas/TopBook' + text/csv: + schema: + $ref: '#/components/schemas/TopBook' + text/html: + schema: + $ref: '#/components/schemas/TopBook' + '404': + description: Resource not found + summary: Retrieves a TopBook resource. + description: Retrieves a TopBook resource. + parameters: + - name: id + in: path + description: Resource identifier + required: true + deprecated: false + allowEmptyValue: false + schema: + type: string + style: simple + explode: false + allowReserved: false + deprecated: false + parameters: [] +components: + schemas: + Book: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + properties: + isbn: + description: The ISBN of the book. + externalDocs: + url: https://schema.org/isbn + type: string + nullable: true + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + description: + description: A description of the item. + externalDocs: + url: https://schema.org/description + type: string + author: + description: The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. + externalDocs: + url: https://schema.org/author + type: string + publicationDate: + description: The date on which the CreativeWork was created or the item was added to a DataFeed. + externalDocs: + url: https://schema.org/dateCreated + type: string + format: date-time + reviews: + description: The book's reviews. + externalDocs: + url: https://schema.org/reviews + type: array + items: + $ref: '#/components/schemas/Review' + cover: + writeOnly: true + description: The book's cover base64 encoded. + type: string + nullable: true + archivedAt: + writeOnly: true + type: string + format: date-time + nullable: true + required: + - title + - description + - author + - publicationDate + Book-book.read: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + properties: + isbn: + description: The ISBN of the book. + externalDocs: + url: https://schema.org/isbn + type: string + nullable: true + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + description: + description: A description of the item. + externalDocs: + url: https://schema.org/description + type: string + author: + description: The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. + externalDocs: + url: https://schema.org/author + type: string + publicationDate: + description: The date on which the CreativeWork was created or the item was added to a DataFeed. + externalDocs: + url: https://schema.org/dateCreated + type: string + format: date-time + reviews: + description: The book's reviews. + externalDocs: + url: https://schema.org/reviews + type: array + items: + $ref: '#/components/schemas/Review-book.read' + required: + - title + - description + - author + - publicationDate + Book-review.read: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + required: + - title + properties: + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + Book.jsonld: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + isbn: + description: The ISBN of the book. + externalDocs: + url: https://schema.org/isbn + type: string + nullable: true + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + description: + description: A description of the item. + externalDocs: + url: https://schema.org/description + type: string + author: + description: The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. + externalDocs: + url: https://schema.org/author + type: string + publicationDate: + description: The date on which the CreativeWork was created or the item was added to a DataFeed. + externalDocs: + url: https://schema.org/dateCreated + type: string + format: date-time + reviews: + description: The book's reviews. + externalDocs: + url: https://schema.org/reviews + type: array + items: + $ref: '#/components/schemas/Review.jsonld' + cover: + writeOnly: true + description: The book's cover base64 encoded. + type: string + nullable: true + archivedAt: + writeOnly: true + type: string + format: date-time + nullable: true + required: + - title + - description + - author + - publicationDate + Book.jsonld-book.read: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + isbn: + description: The ISBN of the book. + externalDocs: + url: https://schema.org/isbn + type: string + nullable: true + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + description: + description: A description of the item. + externalDocs: + url: https://schema.org/description + type: string + author: + description: The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. + externalDocs: + url: https://schema.org/author + type: string + publicationDate: + description: The date on which the CreativeWork was created or the item was added to a DataFeed. + externalDocs: + url: https://schema.org/dateCreated + type: string + format: date-time + reviews: + description: The book's reviews. + externalDocs: + url: https://schema.org/reviews + type: array + items: + $ref: '#/components/schemas/Review.jsonld-book.read' + required: + - title + - description + - author + - publicationDate + Book.jsonld-review.read: + type: object + description: '' + externalDocs: + url: https://schema.org/Book + required: + - title + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + title: + description: The title of the book. + externalDocs: + url: https://schema.org/name + type: string + Parchment: + type: object + deprecated: true + properties: + id: + readOnly: true + type: string + format: uuid + nullable: true + title: + description: The title of the book. + type: string + description: + description: A description of the item. + type: string + required: + - title + - description + Parchment.jsonld: + type: object + deprecated: true + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + id: + readOnly: true + type: string + format: uuid + nullable: true + title: + description: The title of the book. + type: string + description: + description: A description of the item. + type: string + required: + - title + - description + Review: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + $ref: '#/components/schemas/Book' + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + Review-book.read: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + properties: + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + Review-review.read: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + $ref: '#/components/schemas/Book-review.read' + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + Review-review.write: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + type: string + format: iri-reference + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + Review.jsonld: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + $ref: '#/components/schemas/Book.jsonld' + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + Review.jsonld-book.read: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + Review.jsonld-review.read: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + $ref: '#/components/schemas/Book.jsonld-review.read' + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + Review.jsonld-review.write: + type: object + description: A review of an item - for example, of a restaurant, movie, or store. + externalDocs: + url: http://schema.org/Review + required: + - body + - rating + - book + properties: + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + body: + description: The actual body of the review. + externalDocs: + url: http://schema.org/reviewBody + type: string + rating: + description: A rating. + type: integer + letter: + description: 'DEPRECATED (use rating now): A letter to rate the book.' + deprecated: true + type: string + nullable: true + book: + description: The item that is being reviewed/rated. + externalDocs: + url: http://schema.org/itemReviewed + type: string + format: iri-reference + author: + description: The author of the review. + externalDocs: + url: http://schema.org/author + type: string + nullable: true + publicationDate: + description: Publication date of the review. + type: string + format: date-time + nullable: true + TopBook: + type: object + description: This entity represents a "most borrowed book" in a given a given French library. + properties: + id: + type: integer + title: + type: string + author: + type: string + part: + type: string + place: + type: string + borrowCount: + type: integer + TopBook.jsonld: + type: object + description: This entity represents a "most borrowed book" in a given a given French library. + properties: + '@id': + readOnly: true + type: string + '@type': + readOnly: true + type: string + '@context': + readOnly: true + oneOf: + - type: string + - type: object + properties: + '@vocab': + type: string + hydra: + type: string + enum: + - http://www.w3.org/ns/hydra/core# + required: + - '@vocab' + - hydra + additionalProperties: true + id: + type: integer + title: + type: string + author: + type: string + part: + type: string + place: + type: string + borrowCount: + type: integer + responses: {} + parameters: {} + examples: {} + requestBodies: {} + headers: {} + securitySchemes: + apiKey: + type: apiKey + description: Value for the Authorization header parameter. + name: Authorization + in: header +security: + - apiKey: [] +tags: [] diff --git a/tests/e2e/openapi_ref.yml b/tests/e2e/openapi_ref.yml new file mode 100644 index 00000000..915c4a4c --- /dev/null +++ b/tests/e2e/openapi_ref.yml @@ -0,0 +1,800 @@ +openapi: 3.0.2 +info: + title: Swagger Petstore - OpenAPI 3.0 + description: |- + This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about + Swagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach! + You can now help us improve the API whether it's by making changes to the definition itself or to the code. + That way, with time, we can improve the API in general, and expose some of the new features in OAS3. + + Some useful links: + - [The Pet Store repository](https://github.com/swagger-api/swagger-petstore) + - [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml) + termsOfService: http://swagger.io/terms/ + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.11 +externalDocs: + description: Find out more about Swagger + url: http://swagger.io +servers: + - url: /api/v3 +tags: + - name: pet + description: Everything about your Pets + externalDocs: + description: Find out more + url: http://swagger.io + - name: store + description: Access to Petstore orders + externalDocs: + description: Find out more about our store + url: http://swagger.io + - name: user + description: Operations about user +paths: + /pet: + put: + tags: + - pet + summary: Update an existing pet + description: Update an existing pet by Id + operationId: updatePet + requestBody: + description: Update an existent pet in the store + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Pet' + required: true + responses: + '200': + description: Successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + '405': + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + post: + tags: + - pet + summary: Add a new pet to the store + description: Add a new pet to the store + operationId: addPet + requestBody: + description: Create a new pet in the store + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Pet' + required: true + responses: + '200': + description: Successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '405': + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + /pet/findByStatus: + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: false + explode: true + schema: + type: string + default: available + enum: + - available + - pending + - sold + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + /pet/findByTags: + get: + tags: + - pet + summary: Finds Pets by tags + description: Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + operationId: findPetsByTags + parameters: + - name: tags + in: query + description: Tags to filter by + required: false + explode: true + schema: + type: array + items: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + /pet/{petId}: + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + security: + - api_key: [] + - petstore_auth: + - write:pets + - read:pets + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + format: int64 + - name: name + in: query + description: Name of pet that needs to be updated + schema: + type: string + - name: status + in: query + description: Status of pet that needs to be updated + schema: + type: string + responses: + '405': + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + delete: + tags: + - pet + summary: Deletes a pet + description: '' + operationId: deletePet + parameters: + - name: api_key + in: header + description: '' + required: false + schema: + type: string + - name: petId + in: path + description: Pet id to delete + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + /pet/{petId}/uploadImage: + post: + tags: + - pet + summary: uploads an image + description: '' + operationId: uploadFile + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + schema: + type: integer + format: int64 + - name: additionalMetadata + in: query + description: Additional Metadata + required: false + schema: + type: string + requestBody: + content: + application/octet-stream: + schema: + type: string + format: binary + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + security: + - petstore_auth: + - write:pets + - read:pets + /store/inventory: + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + additionalProperties: + type: integer + format: int32 + security: + - api_key: [] + /store/order: + post: + tags: + - store + summary: Place an order for a pet + description: Place a new order in the store + operationId: placeOrder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Order' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + '405': + description: Invalid input + /store/order/{orderId}: + get: + tags: + - store + summary: Find purchase order by ID + description: For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of order that needs to be fetched + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found + delete: + tags: + - store + summary: Delete purchase order by ID + description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid ID supplied + '404': + description: Order not found + /user: + post: + tags: + - user + summary: Create user + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + description: Created user object + content: + application/json: + schema: + $ref: '#/components/schemas/User' + application/xml: + schema: + $ref: '#/components/schemas/User' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/User' + responses: + default: + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/User' + application/xml: + schema: + $ref: '#/components/schemas/User' + /user/createWithList: + post: + tags: + - user + summary: Creates list of users with given input array + description: Creates list of users with given input array + operationId: createUsersWithListInput + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + responses: + '200': + description: Successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/User' + application/json: + schema: + $ref: '#/components/schemas/User' + default: + description: successful operation + /user/login: + get: + tags: + - user + summary: Logs user into the system + description: '' + operationId: loginUser + parameters: + - name: username + in: query + description: The user name for login + required: false + schema: + type: string + - name: password + in: query + description: The password for login in clear text + required: false + schema: + type: string + responses: + '200': + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + schema: + type: integer + format: int32 + X-Expires-After: + description: date in UTC when token expires + schema: + type: string + format: date-time + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + '400': + description: Invalid username/password supplied + /user/logout: + get: + tags: + - user + summary: Logs out current logged in user session + description: '' + operationId: logoutUser + parameters: [] + responses: + default: + description: successful operation + /user/{username}: + get: + tags: + - user + summary: Get user by user name + description: '' + operationId: getUserByName + parameters: + - name: username + in: path + description: 'The name that needs to be fetched. Use user1 for testing. ' + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/User' + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Invalid username supplied + '404': + description: User not found + put: + tags: + - user + summary: Update user + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + schema: + type: string + requestBody: + description: Update an existent user in the store + content: + application/json: + schema: + $ref: '#/components/schemas/User' + application/xml: + schema: + $ref: '#/components/schemas/User' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/User' + responses: + default: + description: successful operation + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid username supplied + '404': + description: User not found +components: + schemas: + Order: + type: object + properties: + id: + type: integer + format: int64 + example: 10 + petId: + type: integer + format: int64 + example: 198772 + quantity: + type: integer + format: int32 + example: 7 + shipDate: + type: string + format: date-time + status: + type: string + description: Order Status + example: approved + enum: + - placed + - approved + - delivered + complete: + type: boolean + xml: + name: order + Customer: + type: object + properties: + id: + type: integer + format: int64 + example: 100000 + username: + type: string + example: fehguy + address: + type: array + xml: + name: addresses + wrapped: true + items: + $ref: '#/components/schemas/Address' + xml: + name: customer + Address: + type: object + properties: + street: + type: string + example: 437 Lytton + city: + type: string + example: Palo Alto + state: + type: string + example: CA + zip: + type: string + example: '94301' + xml: + name: address + Category: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + name: + type: string + example: Dogs + xml: + name: category + User: + type: object + properties: + id: + type: integer + format: int64 + example: 10 + username: + type: string + example: theUser + firstName: + type: string + example: John + lastName: + type: string + example: James + email: + type: string + example: john@email.com + password: + type: string + example: '12345' + phone: + type: string + example: '12345' + userStatus: + type: integer + description: User Status + format: int32 + example: 1 + xml: + name: user + Tag: + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: tag + Pet: + required: + - name + - photoUrls + type: object + properties: + id: + type: integer + format: int64 + example: 10 + name: + type: string + example: doggie + category: + $ref: '#/components/schemas/Category' + photoUrls: + type: array + xml: + wrapped: true + items: + type: string + xml: + name: photoUrl + tags: + type: array + xml: + wrapped: true + items: + $ref: '#/components/schemas/Tag' + status: + type: string + description: pet status in the store + enum: + - available + - pending + - sold + xml: + name: pet + ApiResponse: + type: object + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string + xml: + name: '##default' + requestBodies: + Pet: + description: Pet object that needs to be added to the store + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + UserArray: + description: List of user object + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + securitySchemes: + petstore_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: https://petstore3.swagger.io/oauth/authorize + scopes: + write:pets: modify pets in your account + read:pets: read your pets + api_key: + type: apiKey + name: api_key + in: header diff --git a/tests/e2e/original/App/OpenApi/Entity/AcademicSession.php b/tests/e2e/original/App/OpenApi/Entity/AcademicSession.php new file mode 100644 index 00000000..1e591ce7 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/AcademicSession.php @@ -0,0 +1,270 @@ +id; + } + + public function getAcademicSessionId(): AcademicSession + { + return $this->academicSessionId; + } + + public function setAcademicSessionType(string $academicSessionType): void + { + $this->academicSessionType = $academicSessionType; + } + + public function getAcademicSessionType(): string + { + return $this->academicSessionType; + } + + public function setPrimaryCode(string $primaryCode): void + { + $this->primaryCode = $primaryCode; + } + + public function getPrimaryCode(): string + { + return $this->primaryCode; + } + + public function addName(string $name): void + { + $this->name[] = $name; + } + + public function removeName(string $name): void + { + if (false !== $key = array_search($name, $this->name, true)) { + unset($this->name[$key]); + } + } + + public function getName(): array + { + return $this->name; + } + + public function setStartDate(\DateTimeInterface $startDate): void + { + $this->startDate = $startDate; + } + + public function getStartDate(): \DateTimeInterface + { + return $this->startDate; + } + + public function setEndDate(\DateTimeInterface $endDate): void + { + $this->endDate = $endDate; + } + + public function getEndDate(): \DateTimeInterface + { + return $this->endDate; + } + + public function setParent(string $parent): void + { + $this->parent = $parent; + } + + public function getParent(): string + { + return $this->parent; + } + + public function addChild(string $child): void + { + $this->children[] = $child; + } + + public function removeChild(string $child): void + { + if (false !== $key = array_search($child, $this->children, true)) { + unset($this->children[$key]); + } + } + + /** + * @return (uuid|object)[] + */ + public function getChildren(): array + { + return $this->children; + } + + public function setYear(string $year): void + { + $this->year = $year; + } + + public function getYear(): string + { + return $this->year; + } + + public function addOtherCode(string $otherCode): void + { + $this->otherCodes[] = $otherCode; + } + + public function removeOtherCode(string $otherCode): void + { + if (false !== $key = array_search($otherCode, $this->otherCodes, true)) { + unset($this->otherCodes[$key]); + } + } + + public function getOtherCodes(): array + { + return $this->otherCodes; + } + + public function addConsumer(string $consumer): void + { + $this->consumers[] = $consumer; + } + + public function removeConsumer(string $consumer): void + { + if (false !== $key = array_search($consumer, $this->consumers, true)) { + unset($this->consumers[$key]); + } + } + + public function getConsumers(): array + { + return $this->consumers; + } + + public function setExt(string $ext): void + { + $this->ext = $ext; + } + + public function getExt(): string + { + return $this->ext; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Association.php b/tests/e2e/original/App/OpenApi/Entity/Association.php new file mode 100644 index 00000000..c1c52a39 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Association.php @@ -0,0 +1,192 @@ +id; + } + + public function getAssociationId(): Association + { + return $this->associationId; + } + + public function getAssociationType(): string + { + return $this->associationType; + } + + public function setRole(string $role): void + { + $this->role = $role; + } + + public function getRole(): string + { + return $this->role; + } + + public function setState(string $state): void + { + $this->state = $state; + } + + public function getState(): string + { + return $this->state; + } + + public function setRemoteState(string $remoteState): void + { + $this->remoteState = $remoteState; + } + + public function getRemoteState(): string + { + return $this->remoteState; + } + + public function addConsumer(string $consumer): void + { + $this->consumers[] = $consumer; + } + + public function removeConsumer(string $consumer): void + { + if (false !== $key = array_search($consumer, $this->consumers, true)) { + unset($this->consumers[$key]); + } + } + + public function getConsumers(): array + { + return $this->consumers; + } + + public function setExt(string $ext): void + { + $this->ext = $ext; + } + + public function getExt(): string + { + return $this->ext; + } + + public function setResult(string $result): void + { + $this->result = $result; + } + + public function getResult(): string + { + return $this->result; + } + + public function getPerson(): Person + { + return $this->person; + } + + public function setOffering(Offering $offering): void + { + $this->offering = $offering; + } + + public function getOffering(): Offering + { + return $this->offering; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Book.php b/tests/e2e/original/App/OpenApi/Entity/Book.php new file mode 100644 index 00000000..0a85996b --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Book.php @@ -0,0 +1,196 @@ + the book's reviews + * + * @see https://schema.org/reviews + */ + #[ORM\OneToMany(targetEntity: 'App\OpenApi\Entity\Review', mappedBy: 'book')] + #[ORM\JoinTable(name: 'book_review_reviews')] + #[ORM\InverseJoinColumn(nullable: false, unique: true)] + #[ApiProperty(types: ['https://schema.org/reviews'])] + #[Assert\NotNull] + private Collection $reviews; + + /** + * The book's cover base64 encoded. + */ + #[ORM\Column(type: 'text', nullable: true)] + #[ApiProperty] + private ?string $cover = null; + + #[ORM\Column(type: 'datetime', nullable: true)] + #[ApiProperty] + #[Assert\Type(\DateTimeInterface::class)] + private ?\DateTimeInterface $archivedAt = null; + + public function __construct() + { + $this->reviews = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function setIsbn(?string $isbn): void + { + $this->isbn = $isbn; + } + + public function getIsbn(): ?string + { + return $this->isbn; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getTitle(): string + { + return $this->title; + } + + public function setDescription(string $description): void + { + $this->description = $description; + } + + public function getDescription(): string + { + return $this->description; + } + + public function setAuthor(string $author): void + { + $this->author = $author; + } + + public function getAuthor(): string + { + return $this->author; + } + + public function setPublicationDate(\DateTimeInterface $publicationDate): void + { + $this->publicationDate = $publicationDate; + } + + public function getPublicationDate(): \DateTimeInterface + { + return $this->publicationDate; + } + + public function addReview(Review $review): void + { + $this->reviews[] = $review; + } + + public function removeReview(Review $review): void + { + $this->reviews->removeElement($review); + } + + /** + * @return Collection + */ + public function getReviews(): Collection + { + return $this->reviews; + } + + public function setCover(?string $cover): void + { + $this->cover = $cover; + } + + public function setArchivedAt(?\DateTimeInterface $archivedAt): void + { + $this->archivedAt = $archivedAt; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Order.php b/tests/e2e/original/App/OpenApi/Entity/Order.php new file mode 100644 index 00000000..3739099a --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Order.php @@ -0,0 +1,110 @@ +id; + } + + public function setPetId(Pet $petId): void + { + $this->petId = $petId; + } + + public function getPetId(): Pet + { + return $this->petId; + } + + public function setQuantity(int $quantity): void + { + $this->quantity = $quantity; + } + + public function getQuantity(): int + { + return $this->quantity; + } + + public function setShipDate(\DateTimeInterface $shipDate): void + { + $this->shipDate = $shipDate; + } + + public function getShipDate(): \DateTimeInterface + { + return $this->shipDate; + } + + public function setStatus(OrderStatus $status): void + { + $this->status = $status; + } + + public function getStatus(): OrderStatus + { + return $this->status; + } + + public function setComplete(bool $complete): void + { + $this->complete = $complete; + } + + public function getComplete(): bool + { + return $this->complete; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Parchment.php b/tests/e2e/original/App/OpenApi/Entity/Parchment.php new file mode 100644 index 00000000..df60b915 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Parchment.php @@ -0,0 +1,67 @@ +id; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getTitle(): string + { + return $this->title; + } + + public function setDescription(string $description): void + { + $this->description = $description; + } + + public function getDescription(): string + { + return $this->description; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Pet.php b/tests/e2e/original/App/OpenApi/Entity/Pet.php new file mode 100644 index 00000000..e7b46b7b --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Pet.php @@ -0,0 +1,126 @@ +id; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getName(): string + { + return $this->name; + } + + public function setCategory(string $category): void + { + $this->category = $category; + } + + public function getCategory(): string + { + return $this->category; + } + + public function addPhotoUrl(string $photoUrl): void + { + $this->photoUrls[] = $photoUrl; + } + + public function removePhotoUrl(string $photoUrl): void + { + if (false !== $key = array_search($photoUrl, $this->photoUrls, true)) { + unset($this->photoUrls[$key]); + } + } + + /** + * @return string[] + */ + public function getPhotoUrls(): array + { + return $this->photoUrls; + } + + public function addTag(string $tag): void + { + $this->tags[] = $tag; + } + + public function removeTag(string $tag): void + { + if (false !== $key = array_search($tag, $this->tags, true)) { + unset($this->tags[$key]); + } + } + + public function getTags(): array + { + return $this->tags; + } + + public function setStatus(PetStatus $status): void + { + $this->status = $status; + } + + public function getStatus(): PetStatus + { + return $this->status; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/Review.php b/tests/e2e/original/App/OpenApi/Entity/Review.php new file mode 100644 index 00000000..fc9e2c0e --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/Review.php @@ -0,0 +1,150 @@ +id; + } + + public function setBody(string $body): void + { + $this->body = $body; + } + + public function getBody(): string + { + return $this->body; + } + + public function setRating(int $rating): void + { + $this->rating = $rating; + } + + public function getRating(): int + { + return $this->rating; + } + + public function setLetter(?string $letter): void + { + $this->letter = $letter; + } + + public function getLetter(): ?string + { + return $this->letter; + } + + public function setBook(Book $book): void + { + $this->book = $book; + } + + public function getBook(): Book + { + return $this->book; + } + + public function setAuthor(?string $author): void + { + $this->author = $author; + } + + public function getAuthor(): ?string + { + return $this->author; + } + + public function setPublicationDate(?\DateTimeInterface $publicationDate): void + { + $this->publicationDate = $publicationDate; + } + + public function getPublicationDate(): ?\DateTimeInterface + { + return $this->publicationDate; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/TopBook.php b/tests/e2e/original/App/OpenApi/Entity/TopBook.php new file mode 100644 index 00000000..4e4bfab5 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/TopBook.php @@ -0,0 +1,105 @@ +id; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getTitle(): string + { + return $this->title; + } + + public function setAuthor(string $author): void + { + $this->author = $author; + } + + public function getAuthor(): string + { + return $this->author; + } + + public function setPart(string $part): void + { + $this->part = $part; + } + + public function getPart(): string + { + return $this->part; + } + + public function setPlace(string $place): void + { + $this->place = $place; + } + + public function getPlace(): string + { + return $this->place; + } + + public function setBorrowCount(int $borrowCount): void + { + $this->borrowCount = $borrowCount; + } + + public function getBorrowCount(): int + { + return $this->borrowCount; + } +} diff --git a/tests/e2e/original/App/OpenApi/Entity/User.php b/tests/e2e/original/App/OpenApi/Entity/User.php new file mode 100644 index 00000000..b5f3c01d --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Entity/User.php @@ -0,0 +1,137 @@ +id; + } + + public function setUsername(string $username): void + { + $this->username = $username; + } + + public function getUsername(): string + { + return $this->username; + } + + public function setFirstName(string $firstName): void + { + $this->firstName = $firstName; + } + + public function getFirstName(): string + { + return $this->firstName; + } + + public function setLastName(string $lastName): void + { + $this->lastName = $lastName; + } + + public function getLastName(): string + { + return $this->lastName; + } + + public function setEmail(string $email): void + { + $this->email = $email; + } + + public function getEmail(): string + { + return $this->email; + } + + public function setPassword(string $password): void + { + $this->password = $password; + } + + public function getPassword(): string + { + return $this->password; + } + + public function setPhone(string $phone): void + { + $this->phone = $phone; + } + + public function getPhone(): string + { + return $this->phone; + } + + public function setUserStatus(int $userStatus): void + { + $this->userStatus = $userStatus; + } + + public function getUserStatus(): int + { + return $this->userStatus; + } +} diff --git a/tests/e2e/original/App/OpenApi/Enum/OrderStatus.php b/tests/e2e/original/App/OpenApi/Enum/OrderStatus.php new file mode 100644 index 00000000..816dc159 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Enum/OrderStatus.php @@ -0,0 +1,33 @@ +id; + } +} diff --git a/tests/e2e/original/App/OpenApi/Enum/PetStatus.php b/tests/e2e/original/App/OpenApi/Enum/PetStatus.php new file mode 100644 index 00000000..053b2872 --- /dev/null +++ b/tests/e2e/original/App/OpenApi/Enum/PetStatus.php @@ -0,0 +1,33 @@ +id; + } +} diff --git a/tests/e2e/original/App/Schema/Entity/Brand.php b/tests/e2e/original/App/Schema/Entity/Brand.php new file mode 100644 index 00000000..ee7d16fd --- /dev/null +++ b/tests/e2e/original/App/Schema/Entity/Brand.php @@ -0,0 +1,67 @@ +id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setSlogan(?string $slogan): void + { + $this->slogan = $slogan; + } + + public function getSlogan(): ?string + { + return $this->slogan; + } +} diff --git a/tests/e2e/original/App/Schema/Entity/ContactPoint.php b/tests/e2e/original/App/Schema/Entity/ContactPoint.php new file mode 100644 index 00000000..a74dce5b --- /dev/null +++ b/tests/e2e/original/App/Schema/Entity/ContactPoint.php @@ -0,0 +1,46 @@ +id; + } + + public function setTelephone(?string $telephone): void + { + $this->telephone = $telephone; + } + + public function getTelephone(): ?string + { + return $this->telephone; + } +} diff --git a/tests/e2e/original/App/Schema/Entity/Person.php b/tests/e2e/original/App/Schema/Entity/Person.php new file mode 100644 index 00000000..1c5c4682 --- /dev/null +++ b/tests/e2e/original/App/Schema/Entity/Person.php @@ -0,0 +1,286 @@ +|null a sibling of the person + * + * @see https://schema.org/siblings + */ + #[ORM\ManyToMany(targetEntity: 'App\Schema\Entity\Person')] + #[ORM\JoinTable(name: 'person_person_siblings')] + #[ORM\InverseJoinColumn(name: 'sibling_person_id', unique: true)] + #[ApiProperty(types: ['https://schema.org/siblings'])] + private ?Collection $siblings = null; + + /** + * Of a \[\[Person\]\], and less typically of an \[\[Organization\]\], to indicate a topic that is known about - suggesting possible expertise but not implying it. We do not distinguish skill levels here, or relate this to educational content, events, objectives or \[\[JobPosting\]\] descriptions. + * + * @see https://schema.org/knowsAbout + */ + #[ORM\OneToOne(targetEntity: 'App\Schema\Entity\Thing')] + #[ORM\JoinColumn(nullable: false)] + #[ApiProperty(types: ['https://schema.org/knowsAbout'])] + #[Assert\NotNull] + private Thing $knowsAbout; + + /** + * @see _:customColumn + */ + #[ORM\Column(type: 'decimal', nullable: true, precision: 5, scale: 1, options: ['comment' => 'my comment'])] + private ?string $customColumn = null; + + public function __construct() + { + $this->siblings = new ArrayCollection(); + } + + public function setFamilyName(?string $familyName): void + { + $this->familyName = $familyName; + } + + public function getFamilyName(): ?string + { + return $this->familyName; + } + + public function setGivenName(?string $givenName): void + { + $this->givenName = $givenName; + } + + public function getGivenName(): ?string + { + return $this->givenName; + } + + public function setAdditionalName(?string $additionalName): void + { + $this->additionalName = $additionalName; + } + + public function getAdditionalName(): ?string + { + return $this->additionalName; + } + + public function setGender(string $gender): void + { + $this->gender = $gender; + } + + public function getGender(): string + { + return $this->gender; + } + + public function setAddress(PostalAddress $address): void + { + $this->address = $address; + } + + public function getAddress(): PostalAddress + { + return $this->address; + } + + public function setBirthDate(?\DateTimeInterface $birthDate): void + { + $this->birthDate = $birthDate; + } + + public function getBirthDate(): ?\DateTimeInterface + { + return $this->birthDate; + } + + public function setTelephone(?string $telephone): void + { + $this->telephone = $telephone; + } + + public function getTelephone(): ?string + { + return $this->telephone; + } + + public function setEmail(?string $email): void + { + $this->email = $email; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setUrl(?string $url): void + { + $this->url = $url; + } + + public function getUrl(): ?string + { + return $this->url; + } + + public function addSibling(Person $sibling): void + { + $this->siblings[] = $sibling; + } + + public function removeSibling(Person $sibling): void + { + $this->siblings->removeElement($sibling); + } + + /** + * @return Collection|null + */ + public function getSiblings(): Collection + { + return $this->siblings; + } + + public function setKnowsAbout(Thing $knowsAbout): void + { + $this->knowsAbout = $knowsAbout; + } + + public function getKnowsAbout(): Thing + { + return $this->knowsAbout; + } + + public function setCustomColumn(?string $customColumn): void + { + $this->customColumn = $customColumn; + } + + public function getCustomColumn(): ?string + { + return $this->customColumn; + } +} diff --git a/tests/e2e/original/App/Schema/Entity/PostalAddress.php b/tests/e2e/original/App/Schema/Entity/PostalAddress.php new file mode 100644 index 00000000..5ec70411 --- /dev/null +++ b/tests/e2e/original/App/Schema/Entity/PostalAddress.php @@ -0,0 +1,114 @@ +addressCountry = $addressCountry; + } + + public function getAddressCountry(): ?string + { + return $this->addressCountry; + } + + public function setAddressLocality(?string $addressLocality): void + { + $this->addressLocality = $addressLocality; + } + + public function getAddressLocality(): ?string + { + return $this->addressLocality; + } + + public function setAddressRegion(?string $addressRegion): void + { + $this->addressRegion = $addressRegion; + } + + public function getAddressRegion(): ?string + { + return $this->addressRegion; + } + + public function setPostalCode(?string $postalCode): void + { + $this->postalCode = $postalCode; + } + + public function getPostalCode(): ?string + { + return $this->postalCode; + } + + public function setStreetAddress(?string $streetAddress): void + { + $this->streetAddress = $streetAddress; + } + + public function getStreetAddress(): ?string + { + return $this->streetAddress; + } +} diff --git a/tests/e2e/original/App/Schema/Entity/Thing.php b/tests/e2e/original/App/Schema/Entity/Thing.php new file mode 100644 index 00000000..93dfb3fa --- /dev/null +++ b/tests/e2e/original/App/Schema/Entity/Thing.php @@ -0,0 +1,49 @@ + Thing::class, 'person' => Person::class])] +class Thing +{ + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'AUTO')] + #[ORM\Column(type: 'integer')] + private ?int $id = null; + + /** + * The name of the item. + * + * @see https://schema.org/name + */ + #[ORM\Column(type: 'text', nullable: true)] + #[ApiProperty(types: ['https://schema.org/name'])] + private ?string $name = null; + + public function getId(): ?int + { + return $this->id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } +} diff --git a/tests/e2e/original/App/Schema/Enum/GenderType.php b/tests/e2e/original/App/Schema/Enum/GenderType.php new file mode 100644 index 00000000..cbe6dbe4 --- /dev/null +++ b/tests/e2e/original/App/Schema/Enum/GenderType.php @@ -0,0 +1,21 @@ +.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('http://github.com/fonts/glyphicons-halflings-regular.eot');src:url('http://github.com/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('http://github.com/fonts/glyphicons-halflings-regular.woff') format('woff'),url('http://github.com/fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('http://github.com/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.846;color:#666666;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2196f3;text-decoration:none}a:hover,a:focus{color:#0a6ebd;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:23px;margin-bottom:23px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:#444444}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#bbbbbb}h1,.h1,h2,.h2,h3,.h3{margin-top:23px;margin-bottom:11.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:11.5px;margin-bottom:11.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:56px}h2,.h2{font-size:45px}h3,.h3{font-size:34px}h4,.h4{font-size:24px}h5,.h5{font-size:20px}h6,.h6{font-size:14px}p{margin:0 0 11.5px}.lead{margin-bottom:23px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#ffe0b2;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#bbbbbb}.text-primary{color:#2196f3}a.text-primary:hover{color:#0c7cd5}.text-success{color:#4caf50}a.text-success:hover{color:#3d8b40}.text-info{color:#9c27b0}a.text-info:hover{color:#771e86}.text-warning{color:#ff9800}a.text-warning:hover{color:#cc7a00}.text-danger{color:#e51c23}a.text-danger:hover{color:#b9151b}.bg-primary{color:#fff;background-color:#2196f3}a.bg-primary:hover{background-color:#0c7cd5}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#e1bee7}a.bg-info:hover{background-color:#d099d9}.bg-warning{background-color:#ffe0b2}a.bg-warning:hover{background-color:#ffcb7f}.bg-danger{background-color:#f9bdbb}a.bg-danger:hover{background-color:#f5908c}.page-header{padding-bottom:10.5px;margin:46px 0 23px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:11.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:23px}dt,dd{line-height:1.846}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #bbbbbb}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11.5px 23px;margin:0 0 23px;font-size:16.25px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.846;color:#bbbbbb}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:23px;font-style:normal;line-height:1.846}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:11px;margin:0 0 11.5px;font-size:12px;line-height:1.846;word-break:break-all;word-wrap:break-word;color:#212121;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:3px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#bbbbbb;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:23px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.846;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#e1bee7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#d8abe0}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#ffe0b2}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ffd699}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f9bdbb}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#f7a6a4}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:17.25px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:23px;font-size:19.5px;line-height:inherit;color:#212121;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.846;color:#666666}.form-control{display:block;width:100%;height:37px;padding:6px 16px;font-size:13px;line-height:1.846;color:#666666;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#bbbbbb;opacity:1}.form-control:-ms-input-placeholder{color:#bbbbbb}.form-control::-webkit-input-placeholder{color:#bbbbbb}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:transparent;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:37px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:23px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-lg,select.form-group-lg .form-control{height:45px;line-height:45px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:46.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:37px;height:37px;line-height:37px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#4caf50}.has-success .form-control{border-color:#4caf50;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#3d8b40;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94}.has-success .input-group-addon{color:#4caf50;border-color:#4caf50;background-color:#dff0d8}.has-success .form-control-feedback{color:#4caf50}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ff9800}.has-warning .form-control{border-color:#ff9800;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#cc7a00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166}.has-warning .input-group-addon{color:#ff9800;border-color:#ff9800;background-color:#ffe0b2}.has-warning .form-control-feedback{color:#ff9800}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#e51c23}.has-error .form-control{border-color:#e51c23;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#b9151b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c}.has-error .input-group-addon{color:#e51c23;border-color:#e51c23;background-color:#f9bdbb}.has-error .form-control-feedback{color:#e51c23}.has-feedback label~.form-control-feedback{top:28px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a6a6a6}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 16px;font-size:13px;line-height:1.846;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#666666;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#666666;background-color:#ffffff;border-color:#eeeeee}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#666666;background-color:#e6e6e6;border-color:#cfcfcf}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#ffffff;border-color:#eeeeee}.btn-default .badge{color:#ffffff;background-color:#666666}.btn-primary{color:#ffffff;background-color:#2196f3;border-color:transparent}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#2196f3;border-color:transparent}.btn-primary .badge{color:#2196f3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#4caf50;border-color:transparent}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#4caf50;border-color:transparent}.btn-success .badge{color:#4caf50;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9c27b0;border-color:transparent}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#9c27b0;border-color:transparent}.btn-info .badge{color:#9c27b0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff9800;border-color:transparent}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#ff9800;border-color:transparent}.btn-warning .badge{color:#ff9800;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e51c23;border-color:transparent}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e51c23;border-color:transparent}.btn-danger .badge{color:#e51c23;background-color:#ffffff}.btn-link{color:#2196f3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0a6ebd;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#bbbbbb;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.846;color:#666666;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#141414;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2196f3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#bbbbbb}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.846;color:#bbbbbb;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:3px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 16px;font-size:13px;font-weight:normal;line-height:1;color:#666666;text-align:center;background-color:transparent;border:1px solid transparent;border-radius:3px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#bbbbbb}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#bbbbbb;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#2196f3}.nav .nav-divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.846;border:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#666666;background-color:transparent;border:1px solid transparent;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:3px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2196f3}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:64px;margin-bottom:23px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:3px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;visibility:visible !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20.5px 15px;font-size:17px;line-height:23px;height:64px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15px;margin-bottom:15px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:10.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:23px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:23px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:20.5px;padding-bottom:20.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:13.5px;margin-bottom:13.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:13.5px;margin-bottom:13.5px}.navbar-btn.btn-sm{margin-top:17px;margin-bottom:17px}.navbar-btn.btn-xs{margin-top:21px;margin-bottom:21px}.navbar-text{margin-top:20.5px;margin-bottom:20.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:transparent}.navbar-default .navbar-brand{color:#666666}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#212121;background-color:transparent}.navbar-default .navbar-text{color:#bbbbbb}.navbar-default .navbar-nav>li>a{color:#666666}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#212121}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#666666}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#666666}.navbar-default .navbar-link:hover{color:#212121}.navbar-default .btn-link{color:#666666}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#212121}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2196f3;border-color:transparent}.navbar-inverse .navbar-brand{color:#b2dbfb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#bbbbbb}.navbar-inverse .navbar-nav>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#0c84e4}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#0c7cd5;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#b2dbfb}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#b2dbfb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:23px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#bbbbbb}.pagination{display:inline-block;padding-left:0;margin:23px 0;border-radius:3px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 16px;line-height:1.846;text-decoration:none;color:#2196f3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#0a6ebd;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#2196f3;border-color:#2196f3;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#bbbbbb;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:23px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#bbbbbb;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#bbbbbb}.label-default[href]:hover,.label-default[href]:focus{background-color:#a2a2a2}.label-primary{background-color:#2196f3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#0c7cd5}.label-success{background-color:#4caf50}.label-success[href]:hover,.label-success[href]:focus{background-color:#3d8b40}.label-info{background-color:#9c27b0}.label-info[href]:hover,.label-info[href]:focus{background-color:#771e86}.label-warning{background-color:#ff9800}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc7a00}.label-danger{background-color:#e51c23}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#b9151b}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#bbbbbb;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2196f3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#f9f9f9}.jumbotron h1,.jumbotron .h1{color:#444444}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#e0e0e0}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:23px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2196f3}.thumbnail .caption{padding:9px;color:#666666}.alert{padding:15px;margin-bottom:23px;border:1px solid transparent;border-radius:3px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#4caf50}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#3d8b40}.alert-info{background-color:#e1bee7;border-color:#cba4dd;color:#9c27b0}.alert-info hr{border-top-color:#c191d6}.alert-info .alert-link{color:#771e86}.alert-warning{background-color:#ffe0b2;border-color:#ffc599;color:#ff9800}.alert-warning hr{border-top-color:#ffb67f}.alert-warning .alert-link{color:#cc7a00}.alert-danger{background-color:#f9bdbb;border-color:#f7a4af;color:#e51c23}.alert-danger hr{border-top-color:#f58c9a}.alert-danger .alert-link{color:#b9151b}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:23px;margin-bottom:23px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:23px;color:#ffffff;text-align:center;background-color:#2196f3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4caf50}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9c27b0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff9800}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e51c23}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}a.list-group-item{color:#555555}a.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#bbbbbb;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#bbbbbb}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2196f3;border-color:#2196f3}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e3f2fd}.list-group-item-success{color:#4caf50;background-color:#dff0d8}a.list-group-item-success{color:#4caf50}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#4caf50;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#4caf50;border-color:#4caf50}.list-group-item-info{color:#9c27b0;background-color:#e1bee7}a.list-group-item-info{color:#9c27b0}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#9c27b0;background-color:#d8abe0}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#9c27b0;border-color:#9c27b0}.list-group-item-warning{color:#ff9800;background-color:#ffe0b2}a.list-group-item-warning{color:#ff9800}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#ff9800;background-color:#ffd699}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#ff9800;border-color:#ff9800}.list-group-item-danger{color:#e51c23;background-color:#f9bdbb}a.list-group-item-danger{color:#e51c23}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#e51c23;background-color:#f7a6a4}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#e51c23;border-color:#e51c23}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:23px;background-color:#ffffff;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:2px;border-top-left-radius:2px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:23px}.panel-group .panel{margin-bottom:0;border-radius:3px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#212121;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#212121}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2196f3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2196f3;border-color:#2196f3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2196f3}.panel-primary>.panel-heading .badge{color:#2196f3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2196f3}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#4caf50;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#4caf50}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#cba4dd}.panel-info>.panel-heading{color:#9c27b0;background-color:#e1bee7;border-color:#cba4dd}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#cba4dd}.panel-info>.panel-heading .badge{color:#e1bee7;background-color:#9c27b0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#cba4dd}.panel-warning{border-color:#ffc599}.panel-warning>.panel-heading{color:#ff9800;background-color:#ffe0b2;border-color:#ffc599}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffc599}.panel-warning>.panel-heading .badge{color:#ffe0b2;background-color:#ff9800}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffc599}.panel-danger{border-color:#f7a4af}.panel-danger>.panel-heading{color:#e51c23;background-color:#f9bdbb;border-color:#f7a4af}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f7a4af}.panel-danger>.panel-heading .badge{color:#f9bdbb;background-color:#e51c23}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f7a4af}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f9f9f9;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:normal;line-height:1;color:#000000;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid transparent;min-height:16.846px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.846}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid transparent}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#727272;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#727272}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#727272}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1.846;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,0);border-top-color:rgba(0,0,0,0.075);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0.075)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0.075);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,0);border-left-color:rgba(0,0,0,0.075)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.3);box-shadow:0 1px 2px rgba(0,0,0,0.3)}.navbar-brand{font-size:24px}.navbar-inverse .form-control{color:#fff}.navbar-inverse .form-control::-moz-placeholder{color:#b2dbfb;opacity:1}.navbar-inverse .form-control:-ms-input-placeholder{color:#b2dbfb}.navbar-inverse .form-control::-webkit-input-placeholder{color:#b2dbfb}.navbar-inverse .form-control[type=text]{-webkit-box-shadow:inset 0 -1px 0 #b2dbfb;box-shadow:inset 0 -1px 0 #b2dbfb}.navbar-inverse .form-control[type=text]:focus{-webkit-box-shadow:inset 0 -2px 0 #fff;box-shadow:inset 0 -2px 0 #fff}.navbar-nav>li>.dropdown-menu{margin-top:2px}.btn-default{background-image:-webkit-radial-gradient(circle, #fff 80%, #f0f0f0 81%);background-image:-o-radial-gradient(circle, #fff 80%, #f0f0f0 81%);background-image:radial-gradient(circle, #fff 80%, #f0f0f0 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-default:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#f0f0f0}.btn-default:active{background-color:#f0f0f0;background-image:-webkit-radial-gradient(circle, #f0f0f0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #f0f0f0 10%, #fff 11%);background-image:radial-gradient(circle, #f0f0f0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn-primary{background-image:-webkit-radial-gradient(circle, #2196f3 80%, #0d87e9 81%);background-image:-o-radial-gradient(circle, #2196f3 80%, #0d87e9 81%);background-image:radial-gradient(circle, #2196f3 80%, #0d87e9 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-primary:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#0d87e9}.btn-primary:active{background-color:#0d87e9;background-image:-webkit-radial-gradient(circle, #0d87e9 10%, #2196f3 11%);background-image:-o-radial-gradient(circle, #0d87e9 10%, #2196f3 11%);background-image:radial-gradient(circle, #0d87e9 10%, #2196f3 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn-success{background-image:-webkit-radial-gradient(circle, #4caf50 80%, #439a46 81%);background-image:-o-radial-gradient(circle, #4caf50 80%, #439a46 81%);background-image:radial-gradient(circle, #4caf50 80%, #439a46 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-success:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#439a46}.btn-success:active{background-color:#439a46;background-image:-webkit-radial-gradient(circle, #439a46 10%, #4caf50 11%);background-image:-o-radial-gradient(circle, #439a46 10%, #4caf50 11%);background-image:radial-gradient(circle, #439a46 10%, #4caf50 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn-info{background-image:-webkit-radial-gradient(circle, #9c27b0 80%, #862197 81%);background-image:-o-radial-gradient(circle, #9c27b0 80%, #862197 81%);background-image:radial-gradient(circle, #9c27b0 80%, #862197 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-info:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#862197}.btn-info:active{background-color:#862197;background-image:-webkit-radial-gradient(circle, #862197 10%, #9c27b0 11%);background-image:-o-radial-gradient(circle, #862197 10%, #9c27b0 11%);background-image:radial-gradient(circle, #862197 10%, #9c27b0 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn-warning{background-image:-webkit-radial-gradient(circle, #ff9800 80%, #e08600 81%);background-image:-o-radial-gradient(circle, #ff9800 80%, #e08600 81%);background-image:radial-gradient(circle, #ff9800 80%, #e08600 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-warning:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#e08600}.btn-warning:active{background-color:#e08600;background-image:-webkit-radial-gradient(circle, #e08600 10%, #ff9800 11%);background-image:-o-radial-gradient(circle, #e08600 10%, #ff9800 11%);background-image:radial-gradient(circle, #e08600 10%, #ff9800 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn-danger{background-image:-webkit-radial-gradient(circle, #e51c23 80%, #cb171e 81%);background-image:-o-radial-gradient(circle, #e51c23 80%, #cb171e 81%);background-image:radial-gradient(circle, #e51c23 80%, #cb171e 81%);background-repeat:no-repeat;-webkit-background-size:200% 200%;background-size:200%;background-position:50%;-webkit-transition:background-size 2s;-o-transition:background-size 2s;transition:background-size 2s}.btn-danger:hover{-webkit-background-size:100% 100%;background-size:100%;border-color:#cb171e}.btn-danger:active{background-color:#cb171e;background-image:-webkit-radial-gradient(circle, #cb171e 10%, #e51c23 11%);background-image:-o-radial-gradient(circle, #cb171e 10%, #e51c23 11%);background-image:radial-gradient(circle, #cb171e 10%, #e51c23 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 2px rgba(0,0,0,0.3);box-shadow:2px 2px 2px rgba(0,0,0,0.3)}.btn{text-transform:uppercase;border-right:none;border-bottom:none;-webkit-box-shadow:1px 1px 2px rgba(0,0,0,0.3);box-shadow:1px 1px 2px rgba(0,0,0,0.3);-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-link:hover,.btn-link:focus{color:#2196f3;text-decoration:none}.btn-default.disabled{border:1px solid #eeeeee}body{-webkit-font-smoothing:antialiased;letter-spacing:.1px;text-rendering:optimizeLegibility}p{margin:0 0 1em}input,button{-webkit-font-smoothing:antialiased;letter-spacing:.1px;text-rendering:optimizeLegibility}a{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}textarea,textarea.form-control,input.form-control,input[type=text],input[type=password],input[type=email],input[type=number],[type=text].form-control,[type=password].form-control,[type=email].form-control,[type=tel].form-control{padding:0;border:none;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px}textarea:focus,textarea.form-control:focus,input.form-control:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=number]:focus,[type=text].form-control:focus,[type=password].form-control:focus,[type=email].form-control:focus,[type=tel].form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3}textarea[disabled],textarea.form-control[disabled],input.form-control[disabled],input[type=text][disabled],input[type=password][disabled],input[type=email][disabled],input[type=number][disabled],[type=text].form-control[disabled],[type=password].form-control[disabled],[type=email].form-control[disabled],[type=tel].form-control[disabled],textarea[readonly],textarea.form-control[readonly],input.form-control[readonly],input[type=text][readonly],input[type=password][readonly],input[type=email][readonly],input[type=number][readonly],[type=text].form-control[readonly],[type=password].form-control[readonly],[type=email].form-control[readonly],[type=tel].form-control[readonly]{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px dotted #ddd}select,select.form-control{border:0;border-radius:0;-webkit-appearance:none;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px;padding-left:0px}select:focus,select.form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3}.has-warning input,.has-warning .form-control,.has-warning input:focus,.has-warning .form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #ff9800;box-shadow:inset 0 -2px 0 #ff9800}.has-error input,.has-error .form-control,.has-error input:focus,.has-error .form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #e51c23;box-shadow:inset 0 -2px 0 #e51c23}.has-success input,.has-success .form-control,.has-success input:focus,.has-success .form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #4caf50;box-shadow:inset 0 -2px 0 #4caf50}.nav-tabs>li>a{border:none;margin-right:0;color:#666666;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.nav-tabs>li>a:hover{background-color:transparent;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a{border:none;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a:hover{border:none;color:#2196f3}.nav-tabs>li.disabled>a{-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd}.nav-tabs.nav-justified>li>a,.nav-tabs.nav-justified>li>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover{border:none}.nav-tabs .dropdown-menu{margin-top:0}.dropdown-menu{border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.alert{border:none;color:#fff}.alert-success{background-color:#4caf50}.alert-info{background-color:#9c27b0}.alert-warning{background-color:#ff9800}.alert-danger{background-color:#e51c23}.alert a:not(.close),.alert .alert-link{color:#fff;font-weight:bold}.alert .close{color:#fff}.badge{padding:3px 6px 5px}.progress{position:relative;z-index:1;height:6px;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress-bar:last-child{border-radius:0 3px 3px 0}.progress-bar:last-child:before{display:block;content:'div::before';position:absolute;width:100%;height:100%;left:0;right:0;z-index:-1;background-color:#cae6fc}.progress-bar-success:last-child.progress-bar:before{background-color:#c7e7c8}.progress-bar-info:last-child.progress-bar:before{background-color:#edc9f3}.progress-bar-warning:last-child.progress-bar:before{background-color:#ffe0b3}.progress-bar-danger:last-child.progress-bar:before{background-color:#f28e92}.close{font-size:34px;font-weight:300;line-height:24px;opacity:0.6}.close:hover{opacity:1}.list-group-item{padding:15px}.list-group-item-text{color:#bbbbbb}.well{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.panel{border:none;border-radius:2px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.panel-heading{border-bottom:none}.panel-footer{border-top:none}.panel-success .panel-heading{background-color:#4caf50}.panel-success .panel-title{color:#fff}.panel-info .panel-heading{background-color:#9c27b0}.panel-info .panel-title{color:#fff}.panel-warning .panel-heading{background-color:#ff9800}.panel-warning .panel-title{color:#fff}.panel-danger .panel-heading{background-color:#e51c23}.panel-danger .panel-title{color:#fff}.popover{border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)} \ No newline at end of file diff --git a/website/css/highlight.dark.css b/website/css/highlight.dark.css deleted file mode 100644 index 50d57f4f..00000000 --- a/website/css/highlight.dark.css +++ /dev/null @@ -1,104 +0,0 @@ -/* - -Dark style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #444; - -webkit-text-size-adjust: none; -} - -.hljs-keyword, -.hljs-literal, -.hljs-change, -.hljs-winutils, -.hljs-flow, -.nginx .hljs-title, -.tex .hljs-special { - color: white; -} - -.hljs, -.hljs-subst { - color: #ddd; -} - -.hljs-string, -.hljs-title, -.hljs-type, -.ini .hljs-title, -.hljs-tag .hljs-value, -.css .hljs-rules .hljs-value, -.hljs-preprocessor, -.hljs-pragma, -.ruby .hljs-symbol, -.ruby .hljs-symbol .hljs-string, -.ruby .hljs-class .hljs-parent, -.hljs-built_in, -.django .hljs-template_tag, -.django .hljs-variable, -.smalltalk .hljs-class, -.hljs-javadoc, -.ruby .hljs-string, -.django .hljs-filter .hljs-argument, -.smalltalk .hljs-localvars, -.smalltalk .hljs-array, -.hljs-attr_selector, -.hljs-pseudo, -.hljs-addition, -.hljs-stream, -.hljs-envvar, -.apache .hljs-tag, -.apache .hljs-cbracket, -.tex .hljs-command, -.hljs-prompt, -.coffeescript .hljs-attribute { - color: #d88; -} - -.hljs-comment, -.hljs-annotation, -.hljs-decorator, -.hljs-pi, -.hljs-doctype, -.hljs-deletion, -.hljs-shebang, -.apache .hljs-sqbracket, -.tex .hljs-formula { - color: #777; -} - -.hljs-keyword, -.hljs-literal, -.hljs-title, -.css .hljs-id, -.hljs-phpdoc, -.hljs-dartdoc, -.hljs-type, -.vbscript .hljs-built_in, -.rsl .hljs-built_in, -.smalltalk .hljs-class, -.diff .hljs-header, -.hljs-chunk, -.hljs-winutils, -.bash .hljs-variable, -.apache .hljs-tag, -.tex .hljs-special, -.hljs-request, -.hljs-status { - font-weight: bold; -} - -.coffeescript .javascript, -.javascript .xml, -.tex .hljs-formula, -.xml .javascript, -.xml .vbscript, -.xml .css, -.xml .hljs-cdata { - opacity: 0.5; -} diff --git a/website/css/main.css b/website/css/main.css deleted file mode 100644 index f1e0f7d4..00000000 --- a/website/css/main.css +++ /dev/null @@ -1,105 +0,0 @@ -html { - position: relative; - min-height: 100%; -} -body { - font-size: 19px; -} - -@media (min-width: 1200px) { - .container { - width: 970px; - } -} - -main { - margin-top: 90px; -} - -section { - margin-bottom: 120px; -} - -footer { - position: absolute; - bottom: 0; - width: 100%; - background-color: #f5f5f5; - padding: 25px 0; - font-size: 15px; - text-align: center; - text-transform: uppercase; - opacity: 0.6; - transition: opacity .2s ease; -} -footer:hover { - opacity: 1.0; - transition: opacity .2s ease; -} -footer p { - margin: 0; -} - -h3 { - font-size: 23px; -} - -li { - margin-bottom: 3px; -} - -#content img { - max-width: 100%; - padding: 4px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; -} - -header.navbar { - opacity: 0.9; -} -.navbar .navbar-brand { - font-size: 28px; - height: auto; - line-height: 40px; - margin-left: 20px; -} -.navbar .navbar-brand small { - font-size: 18px; - font-weight: 300; - margin-left: 10px; -} - -@media (min-width: 768px) { - #sidebar { - position:fixed; - margin-top: 30px; - } -} -@media (max-width: 960px) { - body { - font-size: 17px; - } - pre { - font-size: 12px; - } -} - -.page-header { - margin-top: 0; -} - -#sidebar .text-muted { - color: #bbbbbb; -} - -pre { - padding: 0; - border-radius: 4px; - margin: 15px; - font-size: 15px; -} -pre code { - border: none; -} diff --git a/website/default.twig b/website/default.twig deleted file mode 100644 index 752d9455..00000000 --- a/website/default.twig +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - {{ title }} - - - - - - - - - - -
-
- - {% if menu is defined %} - - - - {% endif %} - - - -
-
- - - - - - - - - - - -