openjd-cli 0.0.0__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. openjd_cli-0.4.1/.gitignore +23 -0
  2. {openjd-cli-0.0.0 → openjd_cli-0.4.1}/LICENSE +1 -27
  3. openjd_cli-0.4.1/NOTICE +1 -0
  4. openjd_cli-0.4.1/PKG-INFO +319 -0
  5. openjd_cli-0.4.1/README.md +292 -0
  6. openjd_cli-0.4.1/hatch.toml +37 -0
  7. openjd_cli-0.4.1/openjd/__main__.py +26 -0
  8. openjd_cli-0.4.1/openjd/cli/__init__.py +1 -0
  9. openjd_cli-0.4.1/openjd/cli/_check/__init__.py +18 -0
  10. openjd_cli-0.4.1/openjd/cli/_check/_check_command.py +52 -0
  11. openjd_cli-0.4.1/openjd/cli/_common/__init__.py +180 -0
  12. openjd_cli-0.4.1/openjd/cli/_common/_job_from_template.py +132 -0
  13. openjd_cli-0.4.1/openjd/cli/_common/_validation_utils.py +81 -0
  14. openjd_cli-0.4.1/openjd/cli/_create_argparser.py +30 -0
  15. openjd_cli-0.4.1/openjd/cli/_run/__init__.py +16 -0
  16. openjd_cli-0.4.1/openjd/cli/_run/_local_session/__init__.py +1 -0
  17. openjd_cli-0.4.1/openjd/cli/_run/_local_session/_actions.py +68 -0
  18. openjd_cli-0.4.1/openjd/cli/_run/_local_session/_logs.py +46 -0
  19. openjd_cli-0.4.1/openjd/cli/_run/_local_session/_session_manager.py +359 -0
  20. openjd_cli-0.4.1/openjd/cli/_run/_run_command.py +459 -0
  21. openjd_cli-0.4.1/openjd/cli/_schema/__init__.py +17 -0
  22. openjd_cli-0.4.1/openjd/cli/_schema/_schema_command.py +70 -0
  23. openjd_cli-0.4.1/openjd/cli/_summary/__init__.py +17 -0
  24. openjd_cli-0.4.1/openjd/cli/_summary/_summary_command.py +37 -0
  25. openjd_cli-0.4.1/openjd/cli/_summary/_summary_output.py +304 -0
  26. openjd_cli-0.4.1/openjd/cli/_version.py +16 -0
  27. openjd_cli-0.4.1/openjd/cli/py.typed +1 -0
  28. openjd_cli-0.4.1/pyproject.toml +209 -0
  29. openjd-cli-0.0.0/PKG-INFO +0 -7
  30. openjd-cli-0.0.0/README.md +0 -1
  31. openjd-cli-0.0.0/pyproject.toml +0 -12
  32. openjd-cli-0.0.0/setup.cfg +0 -4
  33. openjd-cli-0.0.0/src/openjd/cli/__init__.py +0 -0
  34. openjd-cli-0.0.0/src/openjd_cli.egg-info/PKG-INFO +0 -7
  35. openjd-cli-0.0.0/src/openjd_cli.egg-info/SOURCES.txt +0 -8
  36. openjd-cli-0.0.0/src/openjd_cli.egg-info/dependency_links.txt +0 -1
  37. openjd-cli-0.0.0/src/openjd_cli.egg-info/top_level.txt +0 -1
@@ -0,0 +1,23 @@
1
+ *~
2
+ *#
3
+ *.swp
4
+
5
+ *.DS_Store
6
+
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+
11
+ /.coverage
12
+ /.coverage.*
13
+ /.cache
14
+ /.pytest_cache
15
+ /.mypy_cache
16
+ /.ruff_cache
17
+ /.attach_pid*
18
+ /.venv
19
+
20
+ /doc/_apidoc/
21
+ /build
22
+ /dist
23
+ _version.py
@@ -1,3 +1,4 @@
1
+
1
2
  Apache License
2
3
  Version 2.0, January 2004
3
4
  http://www.apache.org/licenses/
@@ -172,30 +173,3 @@
172
173
  defend, and hold each Contributor harmless for any liability
173
174
  incurred by, or claims asserted against, such Contributor by reason
174
175
  of your accepting any such warranty or additional liability.
175
-
176
- END OF TERMS AND CONDITIONS
177
-
178
- APPENDIX: How to apply the Apache License to your work.
179
-
180
- To apply the Apache License to your work, attach the following
181
- boilerplate notice, with the fields enclosed by brackets "[]"
182
- replaced with your own identifying information. (Don't include
183
- the brackets!) The text should be enclosed in the appropriate
184
- comment syntax for the file format. We also recommend that a
185
- file or class name and description of purpose be included on the
186
- same "printed page" as the copyright notice for easier
187
- identification within third-party archives.
188
-
189
- Copyright [yyyy] [name of copyright owner]
190
-
191
- Licensed under the Apache License, Version 2.0 (the "License");
192
- you may not use this file except in compliance with the License.
193
- You may obtain a copy of the License at
194
-
195
- http://www.apache.org/licenses/LICENSE-2.0
196
-
197
- Unless required by applicable law or agreed to in writing, software
198
- distributed under the License is distributed on an "AS IS" BASIS,
199
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
- See the License for the specific language governing permissions and
201
- limitations under the License.
@@ -0,0 +1 @@
1
+ Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
@@ -0,0 +1,319 @@
1
+ Metadata-Version: 2.1
2
+ Name: openjd-cli
3
+ Version: 0.4.1
4
+ Summary: Provides a command-line interface for working with Open Job Description templates.
5
+ Project-URL: Homepage, https://github.com/OpenJobDescription/openjd-cli
6
+ Project-URL: Source, https://github.com/OpenJobDescription/openjd-cli
7
+ License-Expression: Apache-2.0
8
+ License-File: LICENSE
9
+ License-File: NOTICE
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Operating System :: MacOS
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Requires-Python: >=3.9
24
+ Requires-Dist: openjd-model==0.4.*
25
+ Requires-Dist: openjd-sessions==0.5.*
26
+ Description-Content-Type: text/markdown
27
+
28
+ ## Open Job Description - CLI
29
+
30
+ [![pypi](https://img.shields.io/pypi/v/openjd-cli.svg)](https://pypi.python.org/pypi/openjd-cli)
31
+
32
+ Open Job Description (OpenJD) is a flexible open specification for defining render jobs which are portable
33
+ between studios and render solutions. This package provides a command-line interface that can be used
34
+ to validate OpenJD templates, run OpenJD jobs locally, and more.
35
+
36
+ For more information about Open Job Description and our goals with it, please see the
37
+ Open Job Description [Wiki on GitHub](https://github.com/OpenJobDescription/openjd-specifications/wiki).
38
+
39
+ ## Compatibility
40
+
41
+ This library requires:
42
+
43
+ 1. Python 3.9 or higher;
44
+ 2. Linux, MacOS, or Windows operating system;
45
+ 3. On Linux/MacOS:
46
+ * `sudo`
47
+ 4. On Windows:
48
+ * PowerShell 5.x
49
+
50
+ **EXPERIMENTAL** Note that compatibility with the Windows operating system is currently in active development
51
+ and should be considered to be experimental. We recommend that this application not be used in Windows-based
52
+ production environments at this time. We will remove this notice when Windows compatibility is considered
53
+ sufficiently stable and secure for use in Windows-based production environments.
54
+
55
+ ## Versioning
56
+
57
+ This package's version follows [Semantic Versioning 2.0](https://semver.org/), but is still considered to be in its
58
+ initial development, thus backwards incompatible versions are denoted by minor version bumps. To help illustrate how
59
+ versions will increment during this initial development stage, they are described below:
60
+
61
+ 1. The MAJOR version is currently 0, indicating initial development.
62
+ 2. The MINOR version is currently incremented when backwards incompatible changes are introduced to the public API.
63
+ 3. The PATCH version is currently incremented when bug fixes or backwards compatible changes are introduced to the public API.
64
+
65
+ ## Contributing
66
+
67
+ We encourage all contributions to this package. Whether it's a bug report, new feature, correction, or additional
68
+ documentation, we greatly value feedback and contributions from our community.
69
+
70
+ Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for our contributing guidelines.
71
+
72
+ ## Commands
73
+
74
+ ### Getting Help
75
+
76
+ The main `openjd` command and all subcommands support a `--help` option to display
77
+ information on how to use the command.
78
+
79
+ ### `check`
80
+
81
+ Validates, or reports any syntax errors that appear in the schema of a Job Template file.
82
+
83
+ #### Arguments
84
+
85
+ |Name|Type|Required|Description|Example|
86
+ |---|---|---|---|---|
87
+ |`path`|path|yes|A path leading to a Job or Environment template file.|`/path/to/template.json`|
88
+ |`--output`|string|no|How to display the results of the command. Allowed values are `human-readable` (default), `json`, and `yaml`.|`--output json`, `--output yaml`|
89
+
90
+ #### Example
91
+ ```sh
92
+ $ openjd check /path/to/job.template.json
93
+
94
+ Template at '/path/to/job.template.json' passes validation checks!
95
+ ```
96
+
97
+ ### `summary`
98
+
99
+ Displays summary information about a sample Job or Step, and the Steps and Tasks therein. The user may provide parameters to
100
+ customize the Job, as parameters can have an impact on the amount of Steps and Tasks that a job consists of.
101
+
102
+ #### Arguments
103
+
104
+ |Name|Type|Required| Description |Example|
105
+ |---|---|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
106
+ |`path`|path|yes| A path leading to a Job template file. |`/path/to/job.template.json`|
107
+ |`--job-param`, `-p`|string, path|no| The values for the job template's parameters. Can be provided as key-value pairs, inline JSON string, or path(s) to a JSON or YAML document. If provided more than once then the given values are combined in the order that they appear. |`--job-param MyParam=5`, `-p file://parameter_file.json`, `-p '{"MyParam": "5"}'`|
108
+ |`--step`|string|no| The name of the Step to summarize. |`--step Step1`|
109
+ |`--output`|string|no| How to display the results of the command. Allowed values are `human-readable` (default), `json`, and `yaml`. |`--output json`, `--output yaml`|
110
+
111
+ #### Example
112
+ ```sh
113
+ $ openjd-cli summary /path/to/job.template.json \
114
+ --job-param JobName=SampleJob \
115
+ --job-param '{"FileToRender": "sample.blend"}' \
116
+ --job-param file://some_more_parameters.json
117
+
118
+ --- Summary for 'SampleJob' ---
119
+
120
+ Parameters:
121
+ - JobName (STRING): SampleJob
122
+ - FileToRender (PATH): sample.blend
123
+ - AnotherParameter (INT): 10
124
+
125
+ Total steps: 2
126
+ Total tasks: 15
127
+ Total environments: 0
128
+
129
+ --- Steps in 'SampleJob' ---
130
+
131
+ 1. 'Step1'
132
+ 1 Task parameter(s)
133
+ 10 total Tasks
134
+
135
+ 2. 'Step2'
136
+ 2 Task parameter(s)
137
+ 5 total Tasks
138
+ ```
139
+
140
+ ### `run`
141
+
142
+ Given a Job Template, Job Parameters, and optional Environment Templates this will run a set of the Tasks
143
+ from the constructed Job locally within an OpenJD Sesssion.
144
+
145
+ Please see [How Jobs Are Run](https://github.com/OpenJobDescription/openjd-specifications/wiki/How-Jobs-Are-Run) for
146
+ details on how Open Job Description's Jobs are run within Sessions.
147
+
148
+ #### Arguments
149
+
150
+ |Name|Type|Required| Description |Example|
151
+ |---|---|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
152
+ |`path`|path|yes| A path leading to a Job template file. |`/path/to/job.template.json`|
153
+ |`--step`|string|yes| The name of the Step to run in a local Session. |`--step Step1`|
154
+ |`--environment`|paths|no| Path to a file containing Environment Template definitions. Can be provided multiple times. |`--environment /path/to/env.template1.json --environment /path/to/env.template2.yaml`|
155
+ |`--job-param`, `-p`|string, path|no| The values for the job template's parameters. Can be provided as key-value pairs, inline JSON string, or as path(s) to a JSON or YAML document. If provided more than once then the given values are combined in the order that they appear. |`--job-param MyParam=5`, `-p file://parameter_file.json`, `-p '{"MyParam": "5"}'`|
156
+ |`--task-param`, `-tp`|string|no| Instructs the command to run a single task in a Session with the given value for one of the task parameters. The option must be provided once for each task parameter defined for the Step, with each instance providing the value for a different task parameter. Mutually exclusive with `--tasks` and `--maximum-tasks`. |`-tp MyParam=5 -tp MyOtherParam=Foo`|
157
+ |`--tasks`|string, path|no| Instructs the command to run one or more tasks for the Step in a Session. The argument must be either the filename of a JSON or YAML file containing an array of maps from task parameter name to value; or an inlined JSON string of the same. Mutually exclusive with `--task-param/-tp` and `--maximum-tasks`. |`--tasks '[{"MyParam": 5}]'`, `--tasks file://parameter_set_file.json`|
158
+ |`--maximum-tasks`|integer|no| A maximum number of Tasks to run from this Step. Unless present, the Session will run all Tasks defined in the Step's parameter space or the Task(s) selected by the `--task-param` or `--tasks` arguments. Mutually exclusive with `--task-param/-tp` and `--tasks`. |`--maximum-tasks 5`|
159
+ |`--run-dependencies`|flag|no| If present, runs all of a Step's dependencies in the Session prior to the Step itself. |`--run-dependencies`|
160
+ |`--path-mapping-rules`|string, path|no| The path mapping rules to apply to the template. Should be a JSON-formatted list of Open Job Description path mapping rules, provided as a string or a path to a JSON/YAML document prefixed with 'file://'. |`--path-mapping-rules [{"source_os": "Windows", "source_path": "C:\test", "destination_path": "/mnt/test"}]`, `--path-mapping-rules file://rules_file.json`|
161
+ |`--preserve`|flag|no| If present, the Session's working directory will not be deleted when the run is completed. |`--preserve`|
162
+ |`--verbose`|flag|no| If present, then verbose logging will be enabled in the Session's log. |`--verbose`|
163
+ |`--output`|string|no| How to display the results of the command. Allowed values are `human-readable` (default), `json`, and `yaml`. |`--output json`, `--output yaml`|
164
+
165
+ #### Example
166
+ ```sh
167
+ $ openjd-cli run /path/to/job.template.json --step Step1 \
168
+ --job-param PingServer=amazon.com \
169
+ --task-param PingCount=20 \
170
+ --task-param PingDelay=30
171
+
172
+ # ... Task logs accompanied by timestamps ...
173
+
174
+ --- Results of local session ---
175
+
176
+ Session ended successfully
177
+ Job: MyJob
178
+ Step: Step1
179
+ Duration: 1.0 seconds
180
+ Tasks run: 1
181
+
182
+ ```
183
+
184
+ ### `schema`
185
+ Returns the Open Job Description model as a JSON schema document body.
186
+
187
+ #### Arguments
188
+
189
+ |Name|Type|Required|Description|Example|
190
+ |---|---|---|---|---|
191
+ |`--version`|string|yes|The specification version to get the JSON schema for.|`--version jobtemplate-2023-09`|
192
+ |`--output`|string|no|How to display the results of the command. Allowed values are `human-readable` (default), `json`, and `yaml`.|`--output json`, `--output yaml`|
193
+
194
+ #### Example
195
+ ```sh
196
+ $ openjd-cli schema --version jobtemplate-2023-09
197
+
198
+ {
199
+ "title": "JobTemplate",
200
+ # ... JSON body corresponding to the Open Job Description model schema ...
201
+ }
202
+ ```
203
+
204
+ ## Downloading
205
+
206
+ You can download this package from:
207
+ - [PyPI](https://pypi.org/project/openjd-cli/)
208
+ - [GitHub releases](https://github.com/OpenJobDescription/openjd-cli/releases)
209
+
210
+ ### Verifying GitHub Releases
211
+
212
+ You can verify the authenticity of the release artifacts using the `gpg` command line tool.
213
+
214
+ 1) Download the desired release artifacts from the GitHub releases page. Make sure to download the corresponding PGP signature file (ending with `.sig`) as well.
215
+ For example, if you would like to verify your download of the wheel for version `1.2.3`, you should have the following files downloaded:
216
+ ```
217
+ openjd_cli-1.2.3-py3-none-any.whl
218
+ openjd_cli-1.2.3-py3-none-any.whl.sig
219
+ ```
220
+
221
+ 2) Install the `gpg` command line tool. The installation process varies by operating system. Please refer to the GnuPG website for instructions: https://gnupg.org/download/
222
+
223
+ 3) Save the following contents to a file called `openjobdescription-pgp.asc`:
224
+ ```
225
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
226
+
227
+ mQINBGXGjx0BEACdChrQ/nch2aYGJ4fxHNQwlPE42jeHECqTdlc1V/mug+7qN7Pc
228
+ C4NQk4t68Y72WX/NG49gRfpAxPlSeNt18c3vJ9/sWTukmonWYGK0jQGnDWjuVgFT
229
+ XtvJAAQBFilQXN8h779Th2lEuD4bQX+mGB7l60Xvh7vIehE3C4Srbp6KJXskPLPo
230
+ dz/dx7a+GXRiyYCYbGX4JziXSjQZRc0tIaxLn/GDm7VnXpdHcUk3qJitree61oC8
231
+ agtRHCH5s56E8wt8fXzyStElMkFIZsoLDlLp5lFqT81En9ho/+K6RLBkIj0mC8G7
232
+ BafpHKlxkrIgNK3pWACL93GE6xihqwkZMCAeqloVvkOTdfAKDHuDSEHwKxHG3cZ1
233
+ /e1YhtkPMVF+NMeoQavykUGVUT1bRoVNdk6bYsnbUjUI1A+JNf6MqvdRJyckZqEC
234
+ ylkBekBp/SFpFHvQkRCpfVizm2GSrjdZKgXpm1ZlQJyMRVzc/XPbqdSWhz52r3IC
235
+ eudwReHDc+6J5rs6tg3NbFfPVfCBMSqHlu1HRewWAllIp1+y6nfL4U3iEsUvZ1Y6
236
+ IV3defHIP3kNPU14ZWf3G5rvJDZrIRnjoWhDcaVmivmB/cSdDzphL5FovSI8dsPm
237
+ iU/JZGQb3EvZq+nl4pOiK32hETJ/fgCCzgUA3WqGeFNUNSI9KYZgBe6daQARAQAB
238
+ tDRPcGVuIEpvYiBEZXNjcmlwdGlvbiA8b3BlbmpvYmRlc2NyaXB0aW9uQGFtYXpv
239
+ bi5jb20+iQJXBBMBCABBFiEEvBcWYrv5OB7Tl2sZovDwWbzECYcFAmXGjx0DGy8E
240
+ BQkDwmcABQsJCAcCAiICBhUKCQgLAgMWAgECHgcCF4AACgkQovDwWbzECYcSHRAA
241
+ itPYx48xnJiT6tfnult9ZGivhcXhrMlvirVYOqEtRrt0l18sjr84K8mV71eqFwMx
242
+ GS7e4iQP6guqW9biQfMA5/Id8ZjE7jNbF0LUGsY6Ktj+yOlAbTR+x5qr7Svb7oEs
243
+ TMB/l9HBZ1WtIRzcUk9XYqzvYQr5TT997A63F28u32RchJ+5ECAz4g/p91aWxwVo
244
+ HIfN10sGzttoukJCzC10CZAVscJB+nnoUbB/o3bPak6GUxBHpMgomb0K5g4Z4fXY
245
+ 4AZ9jKFoLgNcExdwteiUdSEnRorZ5Ny8sP84lwJziD3wuamVUsZ1C/KiQJBGTp5e
246
+ LUY38J1oIwptw5fqjaAq2GQxEaIknWQ4fr3ZvNYUuGUt5FbHe5U5XF34gC8PK7v7
247
+ bT/7sVdZZzKFScDLfH5N36M5FrXfTaXsVbfrRoa2j7U0kndyVEZyJsKVAQ8vgwbJ
248
+ w/w2hKkyQLAg3l5yO5CHLGatsfSIzea4WoOAaroxiNtL9gzVXzqpw6qPEsH9hsws
249
+ HsPEQWXHmDQvFTNUU14qic1Vc5fyxCBXIAGAPBd20b+219XznJ5uBKUgtvnqcItj
250
+ nMYe6Btxh+pjrTA15X/p81z6sB7dkL1hPHfawLhCEzJbIPyyBTQYqY00/ap4Rj7t
251
+ kzSiyzBejniFfAZ6eYBWsej7uXUsVndBF1ggZynPTeE=
252
+ =iaEm
253
+ -----END PGP PUBLIC KEY BLOCK-----
254
+ ```
255
+
256
+ 4) Import the OpenPGP key for Open Job Description by running the following command:
257
+
258
+ ```
259
+ gpg --import --armor openjobdescription-pgp.asc
260
+ ```
261
+
262
+ 5) Determine whether to trust the OpenPGP key. Some factors to consider when deciding whether or not to trust the above key are:
263
+
264
+ - The internet connection you’ve used to obtain the GPG key from this website is secure
265
+ - The device that you are accessing this website on is secure
266
+
267
+ If you have decided to trust the OpenPGP key, then edit the key to trust with `gpg` like the following example:
268
+ ```
269
+ $ gpg --edit-key A2F0F059BCC40987
270
+ gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
271
+ This is free software: you are free to change and redistribute it.
272
+ There is NO WARRANTY, to the extent permitted by law.
273
+
274
+
275
+ pub 4096R/BCC40987 created: 2024-02-09 expires: 2026-02-08 usage: SCEA
276
+ trust: unknown validity: unknown
277
+ [ unknown] (1). Open Job Description <openjobdescription@amazon.com>
278
+
279
+ gpg> trust
280
+ pub 4096R/BCC40987 created: 2024-02-09 expires: 2026-02-08 usage: SCEA
281
+ trust: unknown validity: unknown
282
+ [ unknown] (1). Open Job Description <openjobdescription@amazon.com>
283
+
284
+ Please decide how far you trust this user to correctly verify other users' keys
285
+ (by looking at passports, checking fingerprints from different sources, etc.)
286
+
287
+ 1 = I don't know or won't say
288
+ 2 = I do NOT trust
289
+ 3 = I trust marginally
290
+ 4 = I trust fully
291
+ 5 = I trust ultimately
292
+ m = back to the main menu
293
+
294
+ Your decision? 5
295
+ Do you really want to set this key to ultimate trust? (y/N) y
296
+
297
+ pub 4096R/BCC40987 created: 2024-02-09 expires: 2026-02-08 usage: SCEA
298
+ trust: ultimate validity: unknown
299
+ [ unknown] (1). Open Job Description <openjobdescription@amazon.com>
300
+ Please note that the shown key validity is not necessarily correct
301
+ unless you restart the program.
302
+
303
+ gpg> quit
304
+ ```
305
+
306
+ 6) Verify the signature of the Open Job Description release via `gpg --verify`. The command for verifying the example files from step 1 would be:
307
+
308
+ ```
309
+ gpg --verify ./openjd_cli-1.2.3-py3-none-any.whl.sig ./openjd_cli-1.2.3-py3-none-any.whl
310
+ ```
311
+
312
+ ## Security
313
+
314
+ See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
315
+
316
+ ## License
317
+
318
+ This project is licensed under the Apache-2.0 License.
319
+