Build tree data model.
Project description
Tree builder
It's a python package which helps you to build a tree data model to generate configuration files like XML or JSON for example. It provides a xpath syntax like to apply values recursively on your building tree.
Prerequisites
- python 3.6 or higher
Installation
pip install treebuilder
Examples
Build a book store tree
We create a book store with 2 books and 2 copies of each. We also setup the lang as an attribute and a price for each of them.
import treebuilder as tb
builder = tb.TreeBuilder()
# Create 2 books in a bookstore
builder.expand('/bookstore/book/title', ['Sapiens', 'Harry Potter'])
# Set the lang to all books as attribute
builder.set('/bookstore/book/@lang', 'en')
# Set the price for each book
builder.nest('/bookstore/book/price', [39.95, 29.99])
# Duplicate each book to make 2 copies
builder.cross('/bookstore/book/copy_number', [1, 2])
builder.to_xml('bookstore.xml')
The output stored into bookstore.xml
file looks like:
<bookstore>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>1</copy_number>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>1</copy_number>
</book>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>2</copy_number>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>2</copy_number>
</book>
</bookstore>
The next parts of this example suppose that you call builder.to_xml('bookstore.xml')
to generate the output after each modification.
Set values with filter
We want now add the author for each book. Each book has its own author so we need to select a sub tree to apply the author.
builder.set('/bookstore/book[title=\'Harry Potter\']/author', 'J K. Rowling')
builder.set('/bookstore/book[title=Sapiens]/author', 'Y N. Harari')
Output
<bookstore>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>1</copy_number>
<author>Y N. Harari</author>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>1</copy_number>
<author>J K. Rowling</author>
</book>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>2</copy_number>
<author>Y N. Harari</author>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>2</copy_number>
<author>J K. Rowling</author>
</book>
</bookstore>
Set values in distinct sub trees
We want add a details section for a book where we will store addtional informations like the publish year.
builder.set('/bookstore/book[title=\'Harry Potter\']/details/published_year', '2005')
builder.set('/bookstore/book[title=Sapiens]/details/published_year', '2014')
Output
<bookstore>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>1</copy_number>
<author>Y N. Harari</author>
<details>
<published_year>2014</published_year>
</details>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>1</copy_number>
<author>J K. Rowling</author>
<details>
<published_year>2005</published_year>
</details>
</book>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>2</copy_number>
<author>Y N. Harari</author>
<details>
<published_year>2014</published_year>
</details>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>2</copy_number>
<author>J K. Rowling</author>
<details>
<published_year>2005</published_year>
</details>
</book>
</bookstore>
Expand values for distinct sub tree
Now we want to set the list of calient which has borrowed books Let's that there is 5 people which borrow Spaiens and 3 Harry Potter
builder.expand('/bookstore/book[title="Harry Potter"]/borrowers/borrower/name', [f'Client_{i+1}' for i in range(3)])
builder.expand('/bookstore/book[title=Sapiens]/borrowers/borrower/name', [f'Client_{i+1}' for i in range(5)])
Output
<bookstore>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>1</copy_number>
<author>Y N. Harari</author>
<details>
<published_year>2014</published_year>
</details>
<borrowers>
<borrower><name>Client_1</name></borrower>
<borrower><name>Client_3</name></borrower>
<borrower><name>Client_5</name></borrower>
</borrowers>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>1</copy_number>
<author>J K. Rowling</author>
<details>
<published_year>2005</published_year>
</details>
<borrowers>
<borrower><name>Client_1</name></borrower>
<borrower><name>Client_3</name></borrower>
</borrowers>
</book>
<book lang="en">
<title>Sapiens</title>
<price>39.95</price>
<copy_number>2</copy_number>
<author>Y N. Harari</author>
<details>
<published_year>2014</published_year>
</details>
<borrowers>
<borrower><name>Client_2</name></borrower>
<borrower><name>Client_4</name></borrower>
</borrowers>
</book>
<book lang="en">
<title>Harry Potter</title>
<price>29.99</price>
<copy_number>2</copy_number>
<author>J K. Rowling</author>
<details>
<published_year>2005</published_year>
</details>
<borrowers>
<borrower><name>Client_2</name></borrower>
</borrowers>
</book>
</bookstore>
...
Contributing
Issue tracker: https://github.com/fdieulle/treebuilder/issues
If you want to checkout the project and propose your own contribution, you will need to setup the project with the following steps:
Create a virtual environment:
python -m venv venv
Activate your virtual environment:
venv/Scripts/activate
Install package dependencies
pip install -r requirements.txt
License
This project is open source under the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file treebuilder-0.3.tar.gz
.
File metadata
- Download URL: treebuilder-0.3.tar.gz
- Upload date:
- Size: 9.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.7.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 835e6d5b576f680aea0aca14316c0bcb928591745cfaed557b620a92a9e5b6e9 |
|
MD5 | b7c653f47648474f577853c94c98cbbc |
|
BLAKE2b-256 | 89e4ab7d6dbf0512a0d8760d27676a559f008e3b99d84e5d4e229d3a4eac7d4d |
File details
Details for the file treebuilder-0.3-py3-none-any.whl
.
File metadata
- Download URL: treebuilder-0.3-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.7.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9fcdb84709937c0f3106d33523390d1742e4683de9ba162779651a3ac9ab69b9 |
|
MD5 | 9d3583d2b5b2a1b57249171661d397f7 |
|
BLAKE2b-256 | 38fd7bed518da9aff27a4e262d04102a94c4e017289ef75d32eee60a0415919b |