123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- Metadata-Version: 2.3
- Name: traitlets
- Version: 5.14.3
- Summary: Traitlets Python configuration system
- Project-URL: Homepage, https://github.com/ipython/traitlets
- Project-URL: Documentation, https://traitlets.readthedocs.io
- Project-URL: Source, https://github.com/ipython/traitlets
- Project-URL: Funding, https://numfocus.org
- Project-URL: Tracker, https://github.com/ipython/traitlets/issues
- Author-email: IPython Development Team <ipython-dev@python.org>
- License: BSD 3-Clause License
-
- - Copyright (c) 2001-, IPython Development Team
-
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- License-File: LICENSE
- Keywords: Interactive,Interpreter,Shell,Web
- Classifier: Framework :: IPython
- Classifier: Framework :: Jupyter
- Classifier: Intended Audience :: Developers
- Classifier: Intended Audience :: Science/Research
- Classifier: Intended Audience :: System Administrators
- Classifier: License :: OSI Approved :: BSD License
- Classifier: Programming Language :: Python
- Classifier: Programming Language :: Python :: 3
- Classifier: Typing :: Typed
- Requires-Python: >=3.8
- Provides-Extra: docs
- Requires-Dist: myst-parser; extra == 'docs'
- Requires-Dist: pydata-sphinx-theme; extra == 'docs'
- Requires-Dist: sphinx; extra == 'docs'
- Provides-Extra: test
- Requires-Dist: argcomplete>=3.0.3; extra == 'test'
- Requires-Dist: mypy>=1.7.0; extra == 'test'
- Requires-Dist: pre-commit; extra == 'test'
- Requires-Dist: pytest-mock; extra == 'test'
- Requires-Dist: pytest-mypy-testing; extra == 'test'
- Requires-Dist: pytest<8.2,>=7.0; extra == 'test'
- Description-Content-Type: text/markdown
- # Traitlets
- [![Tests](https://github.com/ipython/traitlets/actions/workflows/tests.yml/badge.svg)](https://github.com/ipython/traitlets/actions/workflows/tests.yml)
- [![Documentation Status](https://readthedocs.org/projects/traitlets/badge/?version=latest)](https://traitlets.readthedocs.io/en/latest/?badge=latest)
- [![Tidelift](https://tidelift.com/subscription/pkg/pypi-traitlets)](https://tidelift.com/badges/package/pypi/traitlets)
- | | |
- | ------------- | ------------------------------------ |
- | **home** | https://github.com/ipython/traitlets |
- | **pypi-repo** | https://pypi.org/project/traitlets/ |
- | **docs** | https://traitlets.readthedocs.io/ |
- | **license** | Modified BSD License |
- Traitlets is a pure Python library enabling:
- - the enforcement of strong typing for attributes of Python objects
- (typed attributes are called _"traits"_);
- - dynamically calculated default values;
- - automatic validation and coercion of trait attributes when attempting a
- change;
- - registering for receiving notifications when trait values change;
- - reading configuring values from files or from command line
- arguments - a distinct layer on top of traitlets, so you may use
- traitlets without the configuration machinery.
- Its implementation relies on the [descriptor](https://docs.python.org/howto/descriptor.html)
- pattern, and it is a lightweight pure-python alternative of the
- [_traits_ library](https://docs.enthought.com/traits/).
- Traitlets powers the configuration system of IPython and Jupyter
- and the declarative API of IPython interactive widgets.
- ## Installation
- For a local installation, make sure you have
- [pip installed](https://pip.pypa.io/en/stable/installing/) and run:
- ```bash
- pip install traitlets
- ```
- For a **development installation**, clone this repository, change into the
- `traitlets` root directory, and run pip:
- ```bash
- git clone https://github.com/ipython/traitlets.git
- cd traitlets
- pip install -e .
- ```
- ## Running the tests
- ```bash
- pip install "traitlets[test]"
- py.test traitlets
- ```
- ## Code Styling
- `traitlets` has adopted automatic code formatting so you shouldn't
- need to worry too much about your code style.
- As long as your code is valid,
- the pre-commit hook should take care of how it should look.
- To install `pre-commit` locally, run the following::
- ```
- pip install pre-commit
- pre-commit install
- ```
- You can invoke the pre-commit hook by hand at any time with::
- ```
- pre-commit run
- ```
- which should run any autoformatting on your code
- and tell you about any errors it couldn't fix automatically.
- You may also install [black integration](https://github.com/psf/black#editor-integration)
- into your text editor to format code automatically.
- If you have already committed files before setting up the pre-commit
- hook with `pre-commit install`, you can fix everything up using
- `pre-commit run --all-files`. You need to make the fixing commit
- yourself after that.
- Some of the hooks only run on CI by default, but you can invoke them by
- running with the `--hook-stage manual` argument.
- ## Usage
- Any class with trait attributes must inherit from `HasTraits`.
- For the list of available trait types and their properties, see the
- [Trait Types](https://traitlets.readthedocs.io/en/latest/trait_types.html)
- section of the documentation.
- ### Dynamic default values
- To calculate a default value dynamically, decorate a method of your class with
- `@default({traitname})`. This method will be called on the instance, and
- should return the default value. In this example, the `_username_default`
- method is decorated with `@default('username')`:
- ```Python
- import getpass
- from traitlets import HasTraits, Unicode, default
- class Identity(HasTraits):
- username = Unicode()
- @default('username')
- def _username_default(self):
- return getpass.getuser()
- ```
- ### Callbacks when a trait attribute changes
- When a trait changes, an application can follow this trait change with
- additional actions.
- To do something when a trait attribute is changed, decorate a method with
- [`traitlets.observe()`](https://traitlets.readthedocs.io/en/latest/api.html?highlight=observe#traitlets.observe).
- The method will be called with a single argument, a dictionary which contains
- an owner, new value, old value, name of the changed trait, and the event type.
- In this example, the `_num_changed` method is decorated with `` @observe(`num`) ``:
- ```Python
- from traitlets import HasTraits, Integer, observe
- class TraitletsExample(HasTraits):
- num = Integer(5, help="a number").tag(config=True)
- @observe('num')
- def _num_changed(self, change):
- print("{name} changed from {old} to {new}".format(**change))
- ```
- and is passed the following dictionary when called:
- ```Python
- {
- 'owner': object, # The HasTraits instance
- 'new': 6, # The new value
- 'old': 5, # The old value
- 'name': "foo", # The name of the changed trait
- 'type': 'change', # The event type of the notification, usually 'change'
- }
- ```
- ### Validation and coercion
- Each trait type (`Int`, `Unicode`, `Dict` etc.) may have its own validation or
- coercion logic. In addition, we can register custom cross-validators
- that may depend on the state of other attributes. For example:
- ```Python
- from traitlets import HasTraits, TraitError, Int, Bool, validate
- class Parity(HasTraits):
- value = Int()
- parity = Int()
- @validate('value')
- def _valid_value(self, proposal):
- if proposal['value'] % 2 != self.parity:
- raise TraitError('value and parity should be consistent')
- return proposal['value']
- @validate('parity')
- def _valid_parity(self, proposal):
- parity = proposal['value']
- if parity not in [0, 1]:
- raise TraitError('parity should be 0 or 1')
- if self.value % 2 != parity:
- raise TraitError('value and parity should be consistent')
- return proposal['value']
- parity_check = Parity(value=2)
- # Changing required parity and value together while holding cross validation
- with parity_check.hold_trait_notifications():
- parity_check.value = 1
- parity_check.parity = 1
- ```
- However, we **recommend** that custom cross-validators don't modify the state
- of the HasTraits instance.
- ## About the IPython Development Team
- The IPython Development Team is the set of all contributors to the IPython project.
- This includes all of the IPython subprojects.
- The core team that coordinates development on GitHub can be found here:
- https://github.com/jupyter/.
- ## Our Copyright Policy
- IPython uses a shared copyright model. Each contributor maintains copyright
- over their contributions to IPython. But, it is important to note that these
- contributions are typically only changes to the repositories. Thus, the IPython
- source code, in its entirety is not the copyright of any single person or
- institution. Instead, it is the collective copyright of the entire IPython
- Development Team. If individual contributors want to maintain a record of what
- changes/contributions they have specific copyright on, they should indicate
- their copyright in the commit message of the change, when they commit the
- change to one of the IPython repositories.
- With this in mind, the following banner should be used in any source code file
- to indicate the copyright and license terms:
- ```
- # Copyright (c) IPython Development Team.
- # Distributed under the terms of the Modified BSD License.
- ```
|