From 086667912987f277afc3de697c1b75165637125c Mon Sep 17 00:00:00 2001 From: Jochem Berends Date: Sun, 4 Jun 2017 22:23:13 +0200 Subject: [PATCH 1/4] #118 added instances() and instance() method to the part, refactored multiplicity --- pykechain/models/part.py | 90 ++++++++++++++----- requirements.txt | 3 + ...perties.test_get_instances_of_a_model.json | 1 + ...ances_of_an_instances_raises_notfound.json | 1 + ...s.test_get_single_instance_of_a_model.json | 1 + ...icity_model_raises_multiplefounderror.json | 1 + tests/test_parts.py | 27 ++++++ 7 files changed, 103 insertions(+), 21 deletions(-) create mode 100644 tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_a_model.json create mode 100644 tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_an_instances_raises_notfound.json create mode 100644 tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_model.json create mode 100644 tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_multiplicity_model_raises_multiplefounderror.json diff --git a/pykechain/models/part.py b/pykechain/models/part.py index da5d18c38..3d2a15770 100644 --- a/pykechain/models/part.py +++ b/pykechain/models/part.py @@ -4,7 +4,7 @@ from typing import Any, AnyStr # flake8: noqa from pykechain.enums import Multiplicity, Category -from pykechain.exceptions import NotFoundError, APIError +from pykechain.exceptions import NotFoundError, APIError, MultipleFoundError from pykechain.models.base import Base from pykechain.models.property import Property from pykechain.utils import find @@ -16,6 +16,35 @@ class Part(Base): :cvar category: The category of the part, either 'MODEL' or 'INSTANCE' (use `pykechain.enums.Category`) :cvar parent_id: The UUID of the parent of this part :cvar properties: The list of `pykechain.models.Property` objects belonging to this part. + :cvar multiplicity: The multiplicity of the part being one of the following options: ZERO_ONE, ONE, ZERO_MANY, + ONE_MANY, (reserved) M_N + + Examples + -------- + For the category property + + >>> bike = project.part('Bike') + >>> bike.category + 'INSTANCE' + + >>> bike_model = project.model('Bike') + >>> bike_model.category + 'MODEL' + + >>> bike_model == Category.MODEL + True + >>> bike == Category.INSTANCE + True + + For the multiplicity property + + >>> bike = project.models('Bike') + >>> bike.multiplicity + ONE_MANY + + >>> from pykechain.enums import Multiplicity + >>> bike.multiplicity == Multiplicity.ONE_MANY + True """ @@ -27,26 +56,7 @@ def __init__(self, json, **kwargs): self.category = json.get('category') self.parent_id = json['parent'].get('id') if 'parent' in json and json.get('parent') else None self.properties = [Property.create(p, client=self._client) for p in json['properties']] - - @property - def multiplicity(self): - """Return the multiplicity of a part. - - Multiplicity of a part is one of the following options: ZERO_ONE, ONE, ZERO_MANY, ONE_MANY, (reserved) M_N - Use `pykechain.enums.Multiplicity` to check for the correct multiplicity - - Examples - -------- - >>> bike = project.models('Bike') - >>> bike.multiplicity - ONE_MANY - - >>> from pykechain.enums import Multiplicity - >>> bike.multiplicity == Multiplicity.ONE_MANY - True - - """ - return self._json_data.get('multiplicity', None) + self.multiplicity = json.get('multiplicity', None) def property(self, name): # type: (str) -> Property @@ -148,6 +158,44 @@ def model(self): else: raise NotFoundError("Part {} has no model".format(self.name)) + def instances(self): + """ + Retrieve the instances of this `Part` as a `PartSet`. + + For instance, if you have a model part, you can get the list of instances that are created based on this + moodel. If there are no instances (only possible if the multiplicity is `Multiplicity.ZERO_MANY` than a + NotFoundError is returned + + :return: pykechain.models.PartSet + :raises: NotFoundError + + Example + ------- + >>> wheel_model = project.model('Wheel') + >>> wheel_instance_set = wheel_model.instances() + + """ + if self.category == Category.MODEL: + return self._client.parts(model=self, category=Category.INSTANCE) + else: + raise NotFoundError("Part {} has no instances or is not a model".format(self.name)) + + def instance(self): + """ + Retrieve the single (expected) instance of this 'Part' (of `Category.MODEL`) as a 'Part'. + + See `Part.instances()` method for documentation. + + :return: pykechain.models.Part + :raises: NotFoundError, MultipleFoundError + """ + instances_list = list(self.instances()) + if len(instances_list) == 1: + return instances_list[0] + else: + raise MultipleFoundError("Part {} has more than a single instance. " + "Use the `Part.instances()` method".format(self.name)) + def proxy_model(self): """ Retrieve the proxy model of this proxied `Part` as a `Part`. diff --git a/requirements.txt b/requirements.txt index dfb44de38..3fc48aea2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,3 +21,6 @@ tox==2.7.0 flake8==3.3.0 pydocstyle==2.0.0 mypy==0.511 + +# to fix connection issues +PyOpenSSL==17.0.0; python_version <= '2.7' \ No newline at end of file diff --git a/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_a_model.json b/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_a_model.json new file mode 100644 index 000000000..eb37307d9 --- /dev/null +++ b/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_a_model.json @@ -0,0 +1 @@ +{"http_interactions": [{"request": {"body": {"string": "", "encoding": "utf-8"}, "uri": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "method": "GET", "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Authorization": "Token ", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*"}}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "encoding": null}, "url": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "status": {"code": 200, "message": "OK"}, "headers": {"Connection": "keep-alive", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:08:06 GMT", "Server": "nginx/1.10.2", "X-Frame-Options": "SAMEORIGIN"}}, "recorded_at": "2017-06-04T20:08:19"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "uri": "/api/parts.json?category=MODEL&name=Wheel&bucket=40003527-1c2a-476a-8270-eb7572e69ee0&limit=100", "method": "GET", "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Authorization": "Token ", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*"}}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA8WUbU/bMBDHvwry65o2TuI4fdcB0yYBRaVs2iZU+eGyenWTKHYQVdXvvktLOqFNGy+YeJXcgy//351zW6KrtgxkHA1ICY/4UrbODUjdwIOtWt/bDfjWBTS/bYk1ZEzAaAFKjmiS6ZQmUWqoyFhGuclZliYxQKzIgLSNw+RlCLUfD4cr0EzW9nQFVC+lLU91tR6iY1jLJvjhS2qe/vBViYVLuQas/HkJ4NA04HVj62AxOCbo0EvrzGJdGXBHiL31i7CqoQkWDlCdgpdjPUjXwt/KbhZhU3cC319OJ/PFp8nl3QWeq/YK8Yvb3YD40LQ6tA30uTdPZ7vENtQtCsIUOMKeW3wGaDC+n4HIM6WEEbTIjaGJVowqnUaUJ0JAFidxKrJuBqU9zlXLAN+rZoOnr6bnF5dkN/h/7B+vX4v8tq5WOKgn7qIoYj3ijBZpLGgCglPFmaBMZ5CkWcy0Mm/JffZhMnsl8Jldn1yh9sZK1+OzTGmTR4KO8pzRhElFcyNGVAmtVV5kjKdvOvbXvPJz28DJfGn1qgR/vAAQmUjqgtOk4CiZ84hKEaU0ljrn8cgwVP7PDtz/wYkuJ723hcXQYZfczKbnd2fz/Y5xEKRy0GsEY5/Zzwl+Z+36PejaDt3G3faM7+wKerI0NjwBpWg0wv864Urg1eY51ZJxIcHwOIpxeGSN29jWzmobOvVfL2bTxdXk+ktHUJUBdyuuiXEhnYf9gB43fSOW0i98q47q/EHv7n73E3oI1tkMBgAA", "encoding": null}, "url": "/api/parts.json?category=MODEL&name=Wheel&bucket=40003527-1c2a-476a-8270-eb7572e69ee0&limit=100", "status": {"code": 200, "message": "OK"}, "headers": {"Connection": "keep-alive", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:08:06 GMT", "Server": "nginx/1.10.2", "X-Frame-Options": "SAMEORIGIN"}}, "recorded_at": "2017-06-04T20:08:19"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "uri": "/api/parts.json?category=INSTANCE&model=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "method": "GET", "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Authorization": "Token ", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*"}}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA+2W224bNxCGX8XYa1Pi+aA71XHQAIkdOEqLtjAEHoYV69UBewhiGHn3zMqWjLS+kIIYiIFeackluf98M5xfd1Vc96uumvDTagWf8WHV1/VptWngU1n37W7cQNvXHQ7/uqtKqiaVt1Q4mxNx3DAik5MkOJsIFxmA2kCNgOq06psaFy+6btNOxuMbiNxvyugGSFz4shrF9XKME+ONb7p2fMiZo3/a9QoPXvkl4MlX4JuT3xcANc4laGNTNl3BFZMKJ+Ki1Gm+XCeoB+nXp9X2uZrc7fbvtm5jghQtBE+JNFERyVQi1nBDdEJBSgoAEaovA5z1BpquwD2PQfzhRD75uscvazqyezmVdSYEmyzJLiUiY+AkRMWIltaCEVIoa6r9h2/n3e1mUP/67eV0Nv9t+vbjOb5dbyNHTXeose2aPnZ9A7u17x/2Dgv7btOjZFwCe5KvCv520OxgKJqZkT4RDV4SCdQRl50iwCwXXtjIGBsSvCr7oom+g7/XzS3ufnPxYTa9ODtHXN8JiMtHPDlnEanmJCthUYvVJGhuCY8GpDKCx5CewPPm4kfB+bBZ32C2H9DkYFWmOhBvPdYJFxiSipowya2nEoxR/jnRVNO6LMuqX1aPiLgJMTlmCXWOoyYfiEuWkmBjDC4brtVTFXT26/TqBzG6KsuTdxhmU/z+Rgkjk9Qer5CjGJdInHiVBHGSWob3i4HOz0lKjvgjImCJ+Zg1kVlj2rRmmECmiPDRaUETxyOf+ZLNSgMns0WJNyto9/XktOYqM0GUUgb7Dmjic/IkWpOsVMFb5Q6hdP30PM7Wvm1LLvj2vje+v7p89fFstu2ZNXQ+1LBTCql8M/42jv9GPKTldMgODDayb6y/lBvY91XFqHYSwdOM8QXpiAcFWKVMKmqVcdhKEOcSLaZs6hJLNwTw5/nV5fzd9OKPIYL1qkPDwPY0yb5uYZumz7c7HAvfzts+7NW193qHutkqiFzxzKkgIgAqsAjXc48NhCkB2TOnKD/WrQ45819u9brBMH4SuzoQyUuxqwTaSxuwG2SNhaYENpmMWKzBQC0IkfmRdnUcoJ/YrlKIAtCaCEtBD00YsO9RSRQz3umgjBRH2tVxaB7sqrwAv7LWYtGgMRguM14pYUiQUhLPDDo8/gcS1DwnqpfhVzxYIbiORGWNXdx5FMYBr79NWE0sGWX/96vv8qvrL18BoHyAfJENAAA=", "encoding": null}, "url": "/api/parts.json?category=INSTANCE&model=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "status": {"code": 200, "message": "OK"}, "headers": {"Connection": "keep-alive", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:08:06 GMT", "Server": "nginx/1.10.2", "X-Frame-Options": "SAMEORIGIN"}}, "recorded_at": "2017-06-04T20:08:19"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "uri": "/api/parts.json?category=MODEL&id=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "method": "GET", "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Authorization": "Token ", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*"}}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA8WUbU/bMBDHvwry65o2TuI4fdcB0yYBRaVs2iZU+eGyenWTKHYQVdXvvktLOqFNGy+YeJXcgy//351zW6KrtgxkHA1ICY/4UrbODUjdwIOtWt/bDfjWBTS/bYk1ZEzAaAFKjmiS6ZQmUWqoyFhGuclZliYxQKzIgLSNw+RlCLUfD4cr0EzW9nQFVC+lLU91tR6iY1jLJvjhS2qe/vBViYVLuQas/HkJ4NA04HVj62AxOCbo0EvrzGJdGXBHiL31i7CqoQkWDlCdgpdjPUjXwt/KbhZhU3cC319OJ/PFp8nl3QWeq/YK8Yvb3YD40LQ6tA30uTdPZ7vENtQtCsIUOMKeW3wGaDC+n4HIM6WEEbTIjaGJVowqnUaUJ0JAFidxKrJuBqU9zlXLAN+rZoOnr6bnF5dkN/h/7B+vX4v8tq5WOKgn7qIoYj3ijBZpLGgCglPFmaBMZ5CkWcy0Mm/JffZhMnsl8Jldn1yh9sZK1+OzTGmTR4KO8pzRhElFcyNGVAmtVV5kjKdvOvbXvPJz28DJfGn1qgR/vAAQmUjqgtOk4CiZ84hKEaU0ljrn8cgwVP7PDtz/wYkuJ723hcXQYZfczKbnd2fz/Y5xEKRy0GsEY5/Zzwl+Z+36PejaDt3G3faM7+wKerI0NjwBpWg0wv864Urg1eY51ZJxIcHwOIpxeGSN29jWzmobOvVfL2bTxdXk+ktHUJUBdyuuiXEhnYf9gB43fSOW0i98q47q/EHv7n73E3oI1tkMBgAA", "encoding": null}, "url": "/api/parts.json?category=MODEL&id=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "status": {"code": 200, "message": "OK"}, "headers": {"Connection": "keep-alive", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:08:06 GMT", "Server": "nginx/1.10.2", "X-Frame-Options": "SAMEORIGIN"}}, "recorded_at": "2017-06-04T20:08:19"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "uri": "/api/parts.json?category=MODEL&id=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "method": "GET", "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Authorization": "Token ", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*"}}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA8WUbU/bMBDHvwry65o2TuI4fdcB0yYBRaVs2iZU+eGyenWTKHYQVdXvvktLOqFNGy+YeJXcgy//351zW6KrtgxkHA1ICY/4UrbODUjdwIOtWt/bDfjWBTS/bYk1ZEzAaAFKjmiS6ZQmUWqoyFhGuclZliYxQKzIgLSNw+RlCLUfD4cr0EzW9nQFVC+lLU91tR6iY1jLJvjhS2qe/vBViYVLuQas/HkJ4NA04HVj62AxOCbo0EvrzGJdGXBHiL31i7CqoQkWDlCdgpdjPUjXwt/KbhZhU3cC319OJ/PFp8nl3QWeq/YK8Yvb3YD40LQ6tA30uTdPZ7vENtQtCsIUOMKeW3wGaDC+n4HIM6WEEbTIjaGJVowqnUaUJ0JAFidxKrJuBqU9zlXLAN+rZoOnr6bnF5dkN/h/7B+vX4v8tq5WOKgn7qIoYj3ijBZpLGgCglPFmaBMZ5CkWcy0Mm/JffZhMnsl8Jldn1yh9sZK1+OzTGmTR4KO8pzRhElFcyNGVAmtVV5kjKdvOvbXvPJz28DJfGn1qgR/vAAQmUjqgtOk4CiZ84hKEaU0ljrn8cgwVP7PDtz/wYkuJ723hcXQYZfczKbnd2fz/Y5xEKRy0GsEY5/Zzwl+Z+36PejaDt3G3faM7+wKerI0NjwBpWg0wv864Urg1eY51ZJxIcHwOIpxeGSN29jWzmobOvVfL2bTxdXk+ktHUJUBdyuuiXEhnYf9gB43fSOW0i98q47q/EHv7n73E3oI1tkMBgAA", "encoding": null}, "url": "/api/parts.json?category=MODEL&id=edc8eba0-47c5-415d-8727-6d927543ee3b&limit=100", "status": {"code": 200, "message": "OK"}, "headers": {"Connection": "keep-alive", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:08:06 GMT", "Server": "nginx/1.10.2", "X-Frame-Options": "SAMEORIGIN"}}, "recorded_at": "2017-06-04T20:08:19"}], "recorded_with": "betamax/0.8.0"} \ No newline at end of file diff --git a/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_an_instances_raises_notfound.json b/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_an_instances_raises_notfound.json new file mode 100644 index 000000000..9b2004f90 --- /dev/null +++ b/tests/cassettes/TestPartCreateWithProperties.test_get_instances_of_an_instances_raises_notfound.json @@ -0,0 +1 @@ +{"http_interactions": [{"response": {"status": {"code": 200, "message": "OK"}, "headers": {"Content-Type": "application/json", "Allow": "GET, POST, OPTIONS", "Server": "nginx/1.10.2", "X-Content-Type-Options": "nosniff", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:20:33 GMT", "Connection": "keep-alive", "X-XSS-Protection": "1; mode=block", "X-Frame-Options": "SAMEORIGIN", "Content-Encoding": "gzip", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Transfer-Encoding": "chunked"}, "body": {"string": "", "base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "encoding": null}, "url": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE"}, "request": {"uri": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "headers": {"PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept": "*/*", "Authorization": "Token ", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest"}, "body": {"string": "", "encoding": "utf-8"}, "method": "GET"}, "recorded_at": "2017-06-04T20:20:46"}, {"response": {"status": {"code": 200, "message": "OK"}, "headers": {"Content-Type": "application/json", "Allow": "GET, POST, OPTIONS", "Server": "nginx/1.10.2", "X-Content-Type-Options": "nosniff", "Vary": "Accept-Encoding", "Date": "Sun, 04 Jun 2017 20:20:35 GMT", "Connection": "keep-alive", "X-XSS-Protection": "1; mode=block", "X-Frame-Options": "SAMEORIGIN", "Content-Encoding": "gzip", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Transfer-Encoding": "chunked"}, "body": {"string": "", "base64_string": "H4sIAAAAAAAAA7WV227bOBCGXyXQtWmLZ9J33jSLLdAmhevuorsIDB6Ga65lSdChaBDk3TtyagdFcxEsmiuJoyH1/9+Qw/siNGM9FEs6K2r4ii/1WFWzou3gS27G/jTuoB+rAYf/3Bc5FsvCmZJbkyKxTFMiohXEWxMJ4wmgNL7UHIpZMXYVJu+Goe2Xi8UeAnNtnu+BhJ3L9Tw0hwUGFq3rhn7xkjXn//VNjQvX7gC48hpcd/HXDqDCWIQ+dLkdMmYsCwyEXa7i9tBEqCbpt7Pi+F4s70/zT1OPniAGA96VROggiaAyEqOZJiqiICk4APfFwwSnaaEbMjzymMS/nMgXV434Z1XOzVlOYaz23kRDko2RiOAZ8UFSooQxoLng0uji/OO77XDXTup/f3ez2mz/XL37dIVfm6Nz1HSPGvuhG8MwdnDK/fB97pQ4Du2IkjEFziTfZHwO0J1gyDJRLVwkCpwgAkpLbLKSADWMO24CpXQqcJ3Pmya4Af5tujuc/fb642Z1fXmFuP4nICae8KSUeCgVI0lyg1qMIl4xQ1jQIKTmLPj4DJ63178Kzse22WO1v6NJ3shUKk+ccbhPGEdLMihCBTOuFKC1dK+JplhV+ZDr8VA8IWLah2ipIaW1DDU5T2w0JfEmBG+TZko+t4Mu/1itfxGjdT5cvEebXXbnE8W1iEI5PEK2RF88MuJk5MSK0lA8XxRUek1SYs6eEAGN1IWkiEgKy6YUxQJSSbgLVvEyMlzylQ/ZJndwsdnlsK+hP+8nqxSTiXIipdTYd0ARl6IjwehohPTOSPsSSrfPxzFaub7PKePXx974YX3z5tPl5tgzKxicr+CkFGL+Yfyjj58dT2WZTdWB6Ro5N9bf8h7OfVXSUlmB4MuE/rywxIEE3KVUyNJIbbGVIM4DXjG5rXLIw2Tg76v1zfb96vrz5KCpB7wwsD0tk6t6OJbp690Jx8712370Z3X9o96H24dvjl/MlOEGAAA=", "encoding": null}, "url": "/api/parts.json?name=Rear+Wheel&category=INSTANCE&bucket=40003527-1c2a-476a-8270-eb7572e69ee0&limit=100"}, "request": {"uri": "/api/parts.json?name=Rear+Wheel&category=INSTANCE&bucket=40003527-1c2a-476a-8270-eb7572e69ee0&limit=100", "headers": {"PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Accept": "*/*", "Authorization": "Token ", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest"}, "body": {"string": "", "encoding": "utf-8"}, "method": "GET"}, "recorded_at": "2017-06-04T20:20:48"}], "recorded_with": "betamax/0.8.0"} \ No newline at end of file diff --git a/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_model.json b/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_model.json new file mode 100644 index 000000000..00664ce9d --- /dev/null +++ b/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_model.json @@ -0,0 +1 @@ +{"http_interactions": [{"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "status": {"code": 200, "message": "OK"}}}, {"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/parts.json?category=MODEL&name=Bike&limit=100&bucket=40003527-1c2a-476a-8270-eb7572e69ee0"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA91Xa0/bSBT9K5E/M+DxvPmySsHtog0JgnR3pRWK5nFNvDixFU9aEOK/9zrUoVVRt1qFRmo+WJmHr+85c+aemYfE1+tlTI7pQbKEO/yzXFfVQdKs4ENZr9u+vYJ2XUVs/vOQlCE5TgQLkoNzhKZBEy6dJk5KQ7zNpLYQJKMsOUjWqwonz2Ns2uOjo1vwmW3Kw1sgfm7L5aGvF0fYcdTYVWyPfiTm4b9tvcTAS7sAjPymvAVsBWj9qmxiiWPHCXb4eVmF2aIOUG0xbFrPAOsGVrGEJ0xdAj+O6oOt1vC9sPezeN90+Z2Np7M/h6P3Ob5Vb/LD7z08HiRtXK19XK+gn3nx+c1u4jo2a0wHp8AW6TuwqxYHN+wbxaRUShLBOSecK0q0EoEUXhWGK0sznnbsL8vtinob4aZe3ePb55PTfJQ8Hrwe7LejyXBXwKd1tNVgDuXNPPb4PaPGKpMRUxggXBhLTFoEYmghMsOYkA72iX84nQ5Pfj/Pd7b6F+Vmeo/fATOeqoJkkDrCXZYRK0CSQtHgpOOUCbpP/NP8710hP/1ia/fql5RCwQXBTYDqF0VBtEwFUR6YB5Omnul9oj8dTvPp2Xm+Iwbyu6ZclcubQUAQPQdWOCUDw3UHbjFpi3vBOUWMZF55mSqp91oBRmfjP3aE/y9wbfmMnFOQWRYokQIU1j58GItEKGlTKpjnmdmr9t9MJqN8ON4R+CtbwW89dOlBa+MVAeMk4SAlcV5wogvJeQpUm1S+GvSNi6OJf/x4CHd2vmgq6Pw7+XlCqMrlbffr6WCuUFpQFIFAOaAQHCoBrQD7gXKbBg5hS8fmVPAzdXB1Nn43ymdX+Sg/eakYPoWa+Xld+s0pBPG1Mbn+P8y0UIGPg02Az+SAYlprNAbKHVqk9CmapVCoFV90IioyLV6JnIftzp0D8tMnFLwGZ1PClReEUzyuaJUpIoPJlOAMgDn85vdJvczf5pf5+GRXtfUSiik8k1YUnXsazMymvkuUEZ1qSrwUGgecULbYn6J2f6qY17EeDGO0fr6A5RfaEdRyhodKZnC9UssxcxDEBM44D85YSn8lGqo6vsAC095DZgGNxuIhq0g5McoGQplKuQEjhP+VWMgXTbwf2G9ocIo5F1yKuDXuW55SNB3cIlJkmcObRhbcf1XZ6xc6sauybVsWJQ493dsuLien70+mm/tcBdG6CvocIZRftb9G8C3WjvSDjvsOyHNBQg4Czhz4ehnx/gmrHqRQmmaQFaRgGv1ESkYsR2exaKlKqoAFEzbFCW/BZVOVvowdlMm44/052nFhqxY2i3V336/c3Lazdu22SbZPaT9eP34CbPf6734PAAA=", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/parts.json?category=MODEL&name=Bike&limit=100&bucket=40003527-1c2a-476a-8270-eb7572e69ee0", "status": {"code": 200, "message": "OK"}}}, {"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/parts.json?model=53d64ebb-10d8-46b8-b669-ca268aed6313&category=INSTANCE&limit=100"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA71Y224TSRD9lWie00nfL3lZGTAsuyFBiVlWWqGoursaD5l4LM8YiBD/vjUOdi5YC4uS+MH23KqrTp2qOtNfqtQuZ311IHarGX6mP7Nl0+xW8wV+rNtltz5eYLdsejr850tV5+qgQiO4DdoyzYtjOurAAA0yLYU23BsXhKh2q+WioZunfT/vDvb3zzFJmNd758jSFOrZXmov9unE/hwWfbf/Mzb3PnTtjAzP4ALJ8pP6HOkoY5cW9byv6dpBRSfStG7y2UWbsblyOi0QeogNPVSg6XBj4fli+N29iirnYHQoiokgFdNeGxbRezq0LnqnhZRytVyDN4193f3PBdpZv/O8XZyvV8GYhLUqsxyTYbrQUl7oyEJK3iothJD8/65ySufX9jnn2TqlmVSZ0AMnmLeYmJCoHK3hs4w/tt8vltfm304Rm43/OXmMwJl2g//CZOaddMzmIJ3RClHdsT/Y+vput1olpDr4cid9K6tGZasxRiZ49kzb6Fm0NrAE0nrAbJVQ1deBmu0cF32NV4kdqPPzfPwIzZIWFnzjSxWcstY5y4zWmmk9oOUopJJcCdqBkHrIxrdlL8/6y/ng+sujydlfo8M3Y7rWrphH/nwh/zoKNvXLBa7vfP3tyeHGZT9f9newfYGw6NYoCFmwgJdMakMoeCUY5JwZ2OBVyFlAckNdzepNrSbo8X27uFw5dToZHT0dV0MufwmZK5NrbJISAVyQLJRAT5gALPCSWRDFyKCUsRG3YPP88Hh0X+hM2h6anSnW76cbgoOSgrKmWPSWUhaCYcHEwEIEKwOA1PJBQaqg7yFNL3BGXStpsJGjYLEEKgmT6J+WnnktIiAoroXdz1RVZ38cHjUnk/N1C1uDHFGFJFxhEnmktaVkYNCy4kSONmqhjNgC8mgyGT39/dX43nj4ul7dvgb5Z+J6UJBvQBSsEFioG1OpUsJNKdTRuGEuoUoYOE/Kb4FoMv77vsB5dmPCfAMoBOtjAKpSKBSEog4LQ+PwWUMEzbnlj1iqYKKzWRF3UAO1T6CijdGxYFVyiVyxflsbezaajCcvX43vCabx53m9qGfvd4jw11O1CIuRuoiMfOiwApiXgsJKPkCW1gKUB2XSoD9Ifnz69Glv1u3NmhvM0gKtlFkwa5AsafoK1F6Ys8CFUUnLsK34Dl8e/XlPkL3F2NXXYOmUkVam4c2J5RrAMc/py6YccwTjPaaHBOvKtzU8NpH8CckxDJEMoLWMNItmvlitqTn4wO0WeJ4cHx+OR0f3hNApNPjbGh8fMyFUEkukYkh8ZKq6EgpLSengbSllJT4eqepULM4bQY8Z4hCxh1Qc0JSk8yg08KwxPyx9mnp2Pnw24gwUupwkEUZRHyg8EH88MgMu09C2NBrlBp+VVH44dNAp7z3NM1K39IRNnISEIUKXVAZaFenNFnROXx69OByfnY4Px0+39e+rxc7StK3TSgUSCF1fvfsV+DoSqanfWRn4hqAsmpMWtCzLZIfEUsTUo6gWOWjng81ePByCG218QrJw55buBs9V8IP8kiRSdQ6axeAzyfyCyH3kTuGgkNfwlzLIh0ATCXgaxLoaqCBYssbThWjcqu/ehf9k/Hx8MqYg7omhJ1gmeA2vUo746RSTQppBb5OMkyIxTl3PCCt4LPnh4L0l3aQvPCVOb3oRJYltsIxyTIrbI2Lm3EHU+6NP2LUXuPdh/r66SW0jQJM6J1VO6oiYQW8rSDo0a6V1Jl0gHke0Tdu+3RltgtqQ+CdCe6w2oHxKKAFpxkIcWpJmwUFmQjmuAwZD2vJRsGrafgtUMThO09Uw62i8kY4jlIpODJEIqngR2frHgio6FWnMc8LGD8XBSXQnqmBrpIz0KipJBDwGVOOLeX+5A99hJTJBk7NipASIVpzeCmOgfBptOUiUXuXyY6zebT9PZxvourrUdPVqK+f1yfGzN08nW3YrdivM9a2tituBfB/ykJ3dIUlDPNd9lqDIdOdOamc91DNcbBpVLlHCsI0ivBs2JBLzTiVmSPWY7KlNlat2u2z6et7Uqe6HcI6PVpFsrK3dpZx9vlznewrdWbeMGye79R7J138Bd7tsg5ITAAA=", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/parts.json?model=53d64ebb-10d8-46b8-b669-ca268aed6313&category=INSTANCE&limit=100", "status": {"code": 200, "message": "OK"}}}], "recorded_with": "betamax/0.8.0"} \ No newline at end of file diff --git a/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_multiplicity_model_raises_multiplefounderror.json b/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_multiplicity_model_raises_multiplefounderror.json new file mode 100644 index 000000000..8c20ea733 --- /dev/null +++ b/tests/cassettes/TestPartCreateWithProperties.test_get_single_instance_of_a_multiplicity_model_raises_multiplefounderror.json @@ -0,0 +1 @@ +{"http_interactions": [{"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "status": {"code": 200, "message": "OK"}}}, {"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/parts.json?category=MODEL&name=Wheel&limit=100&bucket=40003527-1c2a-476a-8270-eb7572e69ee0"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA8WUbU/bMBDHvwry65o2TuI4fdcB0yYBRaVs2iZU+eGyenWTKHYQVdXvvktLOqFNGy+YeJXcgy//351zW6KrtgxkHA1ICY/4UrbODUjdwIOtWt/bDfjWBTS/bYk1ZEzAaAFKjmiS6ZQmUWqoyFhGuclZliYxQKzIgLSNw+RlCLUfD4cr0EzW9nQFVC+lLU91tR6iY1jLJvjhS2qe/vBViYVLuQas/HkJ4NA04HVj62AxOCbo0EvrzGJdGXBHiL31i7CqoQkWDlCdgpdjPUjXwt/KbhZhU3cC319OJ/PFp8nl3QWeq/YK8Yvb3YD40LQ6tA30uTdPZ7vENtQtCsIUOMKeW3wGaDC+n4HIM6WEEbTIjaGJVowqnUaUJ0JAFidxKrJuBqU9zlXLAN+rZoOnr6bnF5dkN/h/7B+vX4v8tq5WOKgn7qIoYj3ijBZpLGgCglPFmaBMZ5CkWcy0Mm/JffZhMnsl8Jldn1yh9sZK1+OzTGmTR4KO8pzRhElFcyNGVAmtVV5kjKdvOvbXvPJz28DJfGn1qgR/vAAQmUjqgtOk4CiZ84hKEaU0ljrn8cgwVP7PDtz/wYkuJ723hcXQYZfczKbnd2fz/Y5xEKRy0GsEY5/Zzwl+Z+36PejaDt3G3faM7+wKerI0NjwBpWg0wv864Urg1eY51ZJxIcHwOIpxeGSN29jWzmobOvVfL2bTxdXk+ktHUJUBdyuuiXEhnYf9gB43fSOW0i98q47q/EHv7n73E3oI1tkMBgAA", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/parts.json?category=MODEL&name=Wheel&limit=100&bucket=40003527-1c2a-476a-8270-eb7572e69ee0", "status": {"code": 200, "message": "OK"}}}, {"recorded_at": "2017-06-04T20:21:12", "request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "PyKechain-Version": "1.7.3", "User-Agent": "python-requests/2.17.3", "Authorization": "Token "}, "method": "GET", "uri": "/api/parts.json?model=edc8eba0-47c5-415d-8727-6d927543ee3b&category=INSTANCE&limit=100"}, "response": {"body": {"encoding": null, "base64_string": "H4sIAAAAAAAAA+2W224bNxCGX8XYa1Pi+aA71XHQAIkdOEqLtjAEHoYV69UBewhiGHn3zMqWjLS+kIIYiIFeackluf98M5xfd1Vc96uumvDTagWf8WHV1/VptWngU1n37W7cQNvXHQ7/uqtKqiaVt1Q4mxNx3DAik5MkOJsIFxmA2kCNgOq06psaFy+6btNOxuMbiNxvyugGSFz4shrF9XKME+ONb7p2fMiZo3/a9QoPXvkl4MlX4JuT3xcANc4laGNTNl3BFZMKJ+Ki1Gm+XCeoB+nXp9X2uZrc7fbvtm5jghQtBE+JNFERyVQi1nBDdEJBSgoAEaovA5z1BpquwD2PQfzhRD75uscvazqyezmVdSYEmyzJLiUiY+AkRMWIltaCEVIoa6r9h2/n3e1mUP/67eV0Nv9t+vbjOb5dbyNHTXeose2aPnZ9A7u17x/2Dgv7btOjZFwCe5KvCv520OxgKJqZkT4RDV4SCdQRl50iwCwXXtjIGBsSvCr7oom+g7/XzS3ufnPxYTa9ODtHXN8JiMtHPDlnEanmJCthUYvVJGhuCY8GpDKCx5CewPPm4kfB+bBZ32C2H9DkYFWmOhBvPdYJFxiSipowya2nEoxR/jnRVNO6LMuqX1aPiLgJMTlmCXWOoyYfiEuWkmBjDC4brtVTFXT26/TqBzG6KsuTdxhmU/z+Rgkjk9Qer5CjGJdInHiVBHGSWob3i4HOz0lKjvgjImCJ+Zg1kVlj2rRmmECmiPDRaUETxyOf+ZLNSgMns0WJNyto9/XktOYqM0GUUgb7Dmjic/IkWpOsVMFb5Q6hdP30PM7Wvm1LLvj2vje+v7p89fFstu2ZNXQ+1LBTCql8M/42jv9GPKTldMgODDayb6y/lBvY91XFqHYSwdOM8QXpiAcFWKVMKmqVcdhKEOcSLaZs6hJLNwTw5/nV5fzd9OKPIYL1qkPDwPY0yb5uYZumz7c7HAvfzts+7NW193qHutkqiFzxzKkgIgAqsAjXc48NhCkB2TOnKD/WrQ45819u9brBMH4SuzoQyUuxqwTaSxuwG2SNhaYENpmMWKzBQC0IkfmRdnUcoJ/YrlKIAtCaCEtBD00YsO9RSRQz3umgjBRH2tVxaB7sqrwAv7LWYtGgMRguM14pYUiQUhLPDDo8/gcS1DwnqpfhVzxYIbiORGWNXdx5FMYBr79NWE0sGWX/96vv8qvrL18BoHyAfJENAAA=", "string": ""}, "headers": {"Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Content-Type-Options": "nosniff", "Content-Encoding": "gzip", "X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Type": "application/json", "Connection": "keep-alive", "Date": "Sun, 04 Jun 2017 20:20:59 GMT", "X-Frame-Options": "SAMEORIGIN", "Vary": "Accept-Encoding", "Transfer-Encoding": "chunked"}, "url": "/api/parts.json?model=edc8eba0-47c5-415d-8727-6d927543ee3b&category=INSTANCE&limit=100", "status": {"code": 200, "message": "OK"}}}], "recorded_with": "betamax/0.8.0"} \ No newline at end of file diff --git a/tests/test_parts.py b/tests/test_parts.py index 5f2111a70..c11d89a3e 100644 --- a/tests/test_parts.py +++ b/tests/test_parts.py @@ -312,3 +312,30 @@ def test_create_part_with_properties_with_bulk(self): self.assertTrue(new_wheel.property('Diameter'), 42.43) new_wheel.delete() + + # 1.8 + def test_get_instances_of_a_model(self): + wheel_model = self.project.model('Wheel') + wheel_instances = wheel_model.instances() + + self.assertIsInstance(wheel_instances, PartSet) + for wheel_instance in wheel_instances: + self.assertEqual(wheel_instance.category, Category.INSTANCE) + self.assertEqual(wheel_instance.model().id, wheel_model.id) + + def test_get_instances_of_an_instances_raises_notfound(self): + wheel_instance = self.project.part('Rear Wheel', category=Category.INSTANCE) + with self.assertRaises(NotFoundError): + wheel_instance.instances() + + def test_get_single_instance_of_a_model(self): + bike_model = self.project.model('Bike') + bike_instance= bike_model.instance() + + self.assertEqual(bike_instance.category, Category.INSTANCE) + + def test_get_single_instance_of_a_multiplicity_model_raises_multiplefounderror(self): + wheel_model = self.project.model('Wheel') + + with self.assertRaises(MultipleFoundError): + wheel_model.instance() \ No newline at end of file From 7fd7955dfed7057b18690293155da4d2418ee72d Mon Sep 17 00:00:00 2001 From: Jochem Berends Date: Mon, 5 Jun 2017 11:41:29 +0200 Subject: [PATCH 2/4] #118 task.parts() was already there, added tests and added associated_parts() method * added tests for task.parts() * added convenience method for associated_parts() --- pykechain/models/activity.py | 36 ++++++++++++++++++- ...retrieve_associated_parts_to_activity.json | 1 + ...etrieve_part_associated_to_activities.json | 1 + ..._part_models_associated_to_activities.json | 1 + tests/test_activities.py | 30 ++++++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/cassettes/TestActivities.test_retrieve_associated_parts_to_activity.json create mode 100644 tests/cassettes/TestActivities.test_retrieve_part_associated_to_activities.json create mode 100644 tests/cassettes/TestActivities.test_retrieve_part_models_associated_to_activities.json diff --git a/pykechain/models/activity.py b/pykechain/models/activity.py index 001b1c50b..3221a4ac9 100644 --- a/pykechain/models/activity.py +++ b/pykechain/models/activity.py @@ -7,6 +7,7 @@ from six import text_type from typing import Any # flake8: noqa +from pykechain.enums import Category from pykechain.exceptions import APIError, NotFoundError from pykechain.models.base import Base @@ -24,10 +25,43 @@ def __init__(self, json, **kwargs): def parts(self, *args, **kwargs): """Retrieve parts belonging to this activity. - See :class:`pykechain.Client.parts` for available parameters. + Without any arguments it retrieves the Instances related to this task only. + + See :class:`pykechain.Client.parts` for additional available parameters. + + Example + ------- + >>> task = project.activity('Specify Wheel Diameter') + >>> parts = task.parts() + + To retrieve the models only. + >>> parts = task.parts(category=Category.MODEL) + """ return self._client.parts(*args, activity=self.id, **kwargs) + def associated_parts(self, *args, **kwargs): + """Retrieve models and instances belonging to this activity. + + This is a conveinience method for the `Activity.parts()` method, which is used to retrieve both the + `Category.MODEL` as well as the `Category.INSTANCE` in a tuple. + + If you want to retrieve only the models associated to this task it is better to use: + `task.parts(category=Category.MODEL)`. + + See :class:`pykechain.Client.parts` for additional available parameters. + + :returns: Tuple(models PartSet, instances PartSet) + + Example + ------- + >>> task = project.activity('Specify Wheel Diameter') + >>> all_models, all_instances = task.associated_parts() + + """ + return self.parts(category=Category.MODEL, *args, **kwargs), \ + self.parts(category=Category.INSTANCE, *args, **kwargs) + def configure(self, inputs, outputs): """Configure activity input and output. diff --git a/tests/cassettes/TestActivities.test_retrieve_associated_parts_to_activity.json b/tests/cassettes/TestActivities.test_retrieve_associated_parts_to_activity.json new file mode 100644 index 000000000..b5ab7e849 --- /dev/null +++ b/tests/cassettes/TestActivities.test_retrieve_associated_parts_to_activity.json @@ -0,0 +1 @@ +{"recorded_with": "betamax/0.8.0", "http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "headers": {"PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "python-requests/2.17.3", "Authorization": "Token ", "Connection": "keep-alive"}, "uri": "/api/scopes.json?status=ACTIVE&name=Bike+Project+%28pykechain+testing%29"}, "response": {"body": {"base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "encoding": null, "string": ""}, "url": "/api/scopes.json?status=ACTIVE&name=Bike+Project+%28pykechain+testing%29", "status": {"code": 200, "message": "OK"}, "headers": {"X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "Date": "Mon, 05 Jun 2017 09:39:29 GMT", "Content-Type": "application/json", "Connection": "keep-alive", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding"}}, "recorded_at": "2017-06-05T09:39:29"}, {"request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "headers": {"PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "python-requests/2.17.3", "Authorization": "Token ", "Connection": "keep-alive"}, "uri": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter"}, "response": {"body": {"base64_string": "H4sIAAAAAAAAA51SwY6bMBD9FeRTK8XEGIOBY9vc2m6k0stWK+TYA3jDAsJmoyjKv3fIKtl2tYeqkrHkmTePmffmRCZwc+cdKX6dyDx1pCCt96Mr1us9aK5GG+6B6lbZPtTD0xoDa6W9fbbegltHWtdZygTdpTtJhZaKZlInNE1iiIXhO5OY8NENPVkRa5D8XwoQ26snQPSPEbStj8GhBegCYzHqYcK8AacnO3qLzAUpW+sCr9w+aJULVKCHAdF/QFZEOWebHhbS8YiTLQO9hrEzP82wIs4rP6MY5G67+Y55P6ne2YXjRaHWNm2Hn3+n5PPdt+3XTbn58tr/NUTODxfg5Cuj/JLhLJKUpZTnJecFY3jul7lmeIuI2V+IcRoa9Ax/GIVshfYpY/vLm4WJjATPbveK6KH3OChKVhBmFCR5nNMsjjUVGSq/y1NBWWKEjiGvQefIPw2Dr/6jTmMnqEql/K13Tpkso7iIsiLhYY71Ml1GmEfzFppSJkoeFUwUCQtFlkdCLlD0qW/AVZ1yvnq2cFh0f4c+CVPBJb8o5PQwooCnqwmf7B6C7TQ8gvbBh5v7gQfnbd98vK5mWsudzmtGOc+AChMrmhvNKOhEycTIGCJDzrgzL+t/rDR2tRj/08FU4vYh0cGaBi761bYhRT933fnh/Bu5iBBpZgMAAA==", "encoding": null, "string": ""}, "url": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter", "status": {"code": 200, "message": "OK"}, "headers": {"X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "Date": "Mon, 05 Jun 2017 09:39:29 GMT", "Content-Type": "application/json", "Connection": "keep-alive", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding"}}, "recorded_at": "2017-06-05T09:39:29"}, {"request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "headers": {"PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "python-requests/2.17.3", "Authorization": "Token ", "Connection": "keep-alive"}, "uri": "/api/parts.json?limit=100&category=MODEL&activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d"}, "response": {"body": {"base64_string": "H4sIAAAAAAAAA9VWbW/bNhD+K4E++2JRpEgxXwY3cdZgThx07jZgKAKSOsZcFEvQS5EgyH/vyY6crR1Wt3Bh7IvhI4/H53nujrqnyJXdqo1OklG0wgf6s+qKYhRVNX4MZdcMdo1NV7Rk/vkUhTw6iVKeS4HWAovzDIS0GVgpNTiTyMxgLjnj0Sjq6oKcl21bNSfj8R26xFTh+A7BLU1YHbvyfkwL48rUbTPeJebxX025osArc48U+U24Q7JybFwdqjbQ3klEC24Zivzmvsyx2HJYW68EywrrNuCGUw9gd1YfTdHhf4V9vGkfqx7fxdXi5rfJ7P2UTpVrfHTf0/Moatq6c21X4+B5/XKyd+zaqiM43hQNbqn+jKZuaHctv1ZcSqUkpEIIEEIxyFSag3fKa6EMS0Tcy78K25Q60+JtWT/S6cv52XQWPY9+HO/z2XyyN+aLsjXF0RLD7bIdBHCcaaN0AtprBJFqAzr2OWjm00RznkqLhxRgslhMTt9eTveX/+uw9h8EsMi1Y8pDgrEFYZMETIoSvGK5lVYwnrJDCrCY/rE36md/a++hASRj6EUK1AfUAKn3kMk4BeWQO9Rx7Hh2SPpnk8V0cXE53ZcE04cq1GF1e5QTi0EEk1olc06ZR2EItaF2sFaBltwpJ2Mls4O+ArOLq1/2JcDvaJvwSl0wlEmSM5ApKnoA6UcbUkJJE7OUO5Hog5b/m/l8Np1c7Yv9r6bAnwbu0mGWaacAtZUgUEqwLhWQeSlEjCzTsfwq9w//skhLhWma4ANtbb6l1+/mZ+9PF+tvbIGtsQXBIfgEDfPwD3tAvrG+5NgrPeoFx37geNq+a3WZk+eRK1ctzQRYDzRTlbEEEw+eZ5RiKTkYwRQY4qekykkCpBxG9zSZhKoILrQ9lflVr/drtEFJytDD46DH0jQ3TWe3IJsN7L4i1nejdYwuzCEnZUH4hEPGhAXtXCa5YIwl8beON7vE/Gy8Oa+JxtF5Wd/tccjZkdvutX76dvLu+wt9Uy4vhC+pJOtgim2pM61MxgykLnEgmDdgtGegNUsk15m3sf//lPrLtLr7AL3n6v7w/AnxA5W18AsAAA==", "encoding": null, "string": ""}, "url": "/api/parts.json?limit=100&category=MODEL&activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d", "status": {"code": 200, "message": "OK"}, "headers": {"X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "Date": "Mon, 05 Jun 2017 09:39:29 GMT", "Content-Type": "application/json", "Connection": "keep-alive", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding"}}, "recorded_at": "2017-06-05T09:39:29"}, {"request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "headers": {"PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "python-requests/2.17.3", "Authorization": "Token ", "Connection": "keep-alive"}, "uri": "/api/parts.json?limit=100&category=INSTANCE&activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d"}, "response": {"body": {"base64_string": "H4sIAAAAAAAAA8WXbW/bNhDHv0qg12EiPorMm8FN3a1bmhStuw0YiuBIHmstsmRIctsg6HffyY7cNPMAr3C2N4JFkce7H++Of99loVnVfXYmjrMaP9OPelVVx9myxY9ls+rG9xa7VdXT6x93WRmzsww1z41Thqk8FUx55RigRqYEVzq3unCcZ8fZqq1o8rzvl93Z6ekNBgHL8uQGWZhDWZ+EZnFKA6dLaPvudB+bJ392TU2Ga1ggWX5W3iC9RexCWy77kr6dZTQQ5mUVrxdNxGrjdGgRevAVLUpQdbi18KJt6v7oRdPe0LJNaD5wY2Rk0QfNVBKSWa48cyFYIxXnXOTrPSt8aPHL++NsvWF2dvfIvbVZLaNR6D3jebRMGW+ZN8axAMJYwGgkl9mXAX2zxLYvceP4gGZ/3h+hWtHGPN/6krlCGlMUhmmlFFOq4MwWOrIUiuRUAVyoIZz7bW+v+9vl4PrLy9n1r5OLd1P61qzJkj935F/Xt6vQr1ocZ76+XzlMXPXLVf8Y8Y8IbTdi4CJhAiuYUJowWMkZxBgZGGeli5FDKIbEqcttMgbo8UPT3q69ejubXJ5PCdR3otmYHOEEyR0UTjCXHK3QDpjLU2SOJy2clNp43AHnxcXV5GB4Zk0P1dEcyw/zfqQEUnA6N8m8NXRozmnmtHfMeTDCAQglnpRSBn0PYb7AmuoyKDA+R858cjlBCvRLCcus4h4QZK64OY1UXtc/X1xWb2Y3Y5GOlD1KF3iRmMDc095CMNBoWCp49MYrLjXfQXkym03Of3o1PVwmvi7X80fK+wT2pJQfMHKGc0xKM6pWOnGdErMm16wIKAO6PA/S7mA0m/5+MDrPH3TRe0LOGesdUKFCoigkBgZD87BRgQeV5yb/D6sVtC9MlJQ9qIBaKFDdel8wZ2QoArli7K5W9nwym85evpoeitP087Jsy/rDEeX8Npdi4gY9dRLh86HNcmBWcIorWAdRGAOQnjSXhkuW7thPnz6d1N1JXT3ILcXRCBE5MxrJkqKHow7DCgM51zIo4XbV38XLy18Oxew39F35lZYKEWlrxUROia4ACmZzepgQffSgrcXwlLTIf/zKxwS01oWCofNkAI1hdPUrZpNRivqDdbnZwefZ1dXFdHJ5KERvocIfRkDWR0KUAgtRUMvkkQovucRCkMpZk1KSfh9A73eP02gFXVemkr5uVNPrN1fP353Pdiib4wxjeT+wAfcogL/HOpzJ8XA0OIjLrR4iBpFmHgXSXKT/sB3DlTF5AZLygdtiEEeBRIoMTBN7Ha1PMeEgjhakQstlVYayH+K5ulyHsrU2OkQn9fl25DKH7rpb+a2T3SaKIXc2d60pkgVHKq8YUKs8MJ9TMvDoTMRCOu70v5Wy+9h8JGW/EaLfCtrJEWVOwtBXt0d10y5ILnwz+5Ha3SFEv1Pl/qMc3ZPZ2Jve1Y3voS5XiwddyXBXgKU+qYMIlOIJGLjEmXNcGOls8nnaUXXnP03efH/JbfL3nsorqoy2hGpbdNJH7ahP0o1HHhlumEN6FFHRqIoxBPX/F93mbe+ae/gfZK8meeAye//lL+7ipy1lDgAA", "encoding": null, "string": ""}, "url": "/api/parts.json?limit=100&category=INSTANCE&activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d", "status": {"code": 200, "message": "OK"}, "headers": {"X-XSS-Protection": "1; mode=block", "Server": "nginx/1.10.2", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "Date": "Mon, 05 Jun 2017 09:39:29 GMT", "Content-Type": "application/json", "Connection": "keep-alive", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "Transfer-Encoding": "chunked", "Vary": "Accept-Encoding"}}, "recorded_at": "2017-06-05T09:39:29"}]} \ No newline at end of file diff --git a/tests/cassettes/TestActivities.test_retrieve_part_associated_to_activities.json b/tests/cassettes/TestActivities.test_retrieve_part_associated_to_activities.json new file mode 100644 index 000000000..707f7843d --- /dev/null +++ b/tests/cassettes/TestActivities.test_retrieve_part_associated_to_activities.json @@ -0,0 +1 @@ +{"recorded_with": "betamax/0.8.0", "http_interactions": [{"request": {"method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Authorization": "Token ", "Accept-Encoding": "gzip, deflate", "PyKechain-Version": "1.7.3", "Accept": "*/*", "User-Agent": "python-requests/2.17.3", "X-Requested-With": "XMLHttpRequest", "Connection": "keep-alive"}, "uri": "/api/scopes.json?status=ACTIVE&name=Bike+Project+%28pykechain+testing%29"}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "encoding": null}, "headers": {"Allow": "GET, POST, OPTIONS", "Transfer-Encoding": "chunked", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Server": "nginx/1.10.2", "Connection": "keep-alive", "Content-Encoding": "gzip", "Vary": "Accept-Encoding", "X-XSS-Protection": "1; mode=block", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "Date": "Mon, 05 Jun 2017 09:29:23 GMT", "X-Frame-Options": "SAMEORIGIN"}, "status": {"message": "OK", "code": 200}, "url": "/api/scopes.json?status=ACTIVE&name=Bike+Project+%28pykechain+testing%29"}, "recorded_at": "2017-06-05T09:29:23"}, {"request": {"method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Authorization": "Token ", "Accept-Encoding": "gzip, deflate", "PyKechain-Version": "1.7.3", "Accept": "*/*", "User-Agent": "python-requests/2.17.3", "X-Requested-With": "XMLHttpRequest", "Connection": "keep-alive"}, "uri": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter"}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA51SwY6bMBD9FeRTK8XEGIOBY9vc2m6k0stWK+TYA3jDAsJmoyjKv3fIKtl2tYeqkrHkmTePmffmRCZwc+cdKX6dyDx1pCCt96Mr1us9aK5GG+6B6lbZPtTD0xoDa6W9fbbegltHWtdZygTdpTtJhZaKZlInNE1iiIXhO5OY8NENPVkRa5D8XwoQ26snQPSPEbStj8GhBegCYzHqYcK8AacnO3qLzAUpW+sCr9w+aJULVKCHAdF/QFZEOWebHhbS8YiTLQO9hrEzP82wIs4rP6MY5G67+Y55P6ne2YXjRaHWNm2Hn3+n5PPdt+3XTbn58tr/NUTODxfg5Cuj/JLhLJKUpZTnJecFY3jul7lmeIuI2V+IcRoa9Ax/GIVshfYpY/vLm4WJjATPbveK6KH3OChKVhBmFCR5nNMsjjUVGSq/y1NBWWKEjiGvQefIPw2Dr/6jTmMnqEql/K13Tpkso7iIsiLhYY71Ml1GmEfzFppSJkoeFUwUCQtFlkdCLlD0qW/AVZ1yvnq2cFh0f4c+CVPBJb8o5PQwooCnqwmf7B6C7TQ8gvbBh5v7gQfnbd98vK5mWsudzmtGOc+AChMrmhvNKOhEycTIGCJDzrgzL+t/rDR2tRj/08FU4vYh0cGaBi761bYhRT933fnh/Bu5iBBpZgMAAA==", "encoding": null}, "headers": {"Allow": "GET, POST, OPTIONS", "Transfer-Encoding": "chunked", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Server": "nginx/1.10.2", "Connection": "keep-alive", "Content-Encoding": "gzip", "Vary": "Accept-Encoding", "X-XSS-Protection": "1; mode=block", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "Date": "Mon, 05 Jun 2017 09:29:23 GMT", "X-Frame-Options": "SAMEORIGIN"}, "status": {"message": "OK", "code": 200}, "url": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter"}, "recorded_at": "2017-06-05T09:29:23"}, {"request": {"method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Authorization": "Token ", "Accept-Encoding": "gzip, deflate", "PyKechain-Version": "1.7.3", "Accept": "*/*", "User-Agent": "python-requests/2.17.3", "X-Requested-With": "XMLHttpRequest", "Connection": "keep-alive"}, "uri": "/api/parts.json?activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d&limit=100&category=INSTANCE"}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA8WXbW/bNhDHv0qg12EiPorMm8FN3a1bmhStuw0YiuBIHmstsmRIctsg6HffyY7cNPMAr3C2N4JFkce7H++Of99loVnVfXYmjrMaP9OPelVVx9myxY9ls+rG9xa7VdXT6x93WRmzsww1z41Thqk8FUx55RigRqYEVzq3unCcZ8fZqq1o8rzvl93Z6ekNBgHL8uQGWZhDWZ+EZnFKA6dLaPvudB+bJ392TU2Ga1ggWX5W3iC9RexCWy77kr6dZTQQ5mUVrxdNxGrjdGgRevAVLUpQdbi18KJt6v7oRdPe0LJNaD5wY2Rk0QfNVBKSWa48cyFYIxXnXOTrPSt8aPHL++NsvWF2dvfIvbVZLaNR6D3jebRMGW+ZN8axAMJYwGgkl9mXAX2zxLYvceP4gGZ/3h+hWtHGPN/6krlCGlMUhmmlFFOq4MwWOrIUiuRUAVyoIZz7bW+v+9vl4PrLy9n1r5OLd1P61qzJkj935F/Xt6vQr1ocZ76+XzlMXPXLVf8Y8Y8IbTdi4CJhAiuYUJowWMkZxBgZGGeli5FDKIbEqcttMgbo8UPT3q69ejubXJ5PCdR3otmYHOEEyR0UTjCXHK3QDpjLU2SOJy2clNp43AHnxcXV5GB4Zk0P1dEcyw/zfqQEUnA6N8m8NXRozmnmtHfMeTDCAQglnpRSBn0PYb7AmuoyKDA+R858cjlBCvRLCcus4h4QZK64OY1UXtc/X1xWb2Y3Y5GOlD1KF3iRmMDc095CMNBoWCp49MYrLjXfQXkym03Of3o1PVwmvi7X80fK+wT2pJQfMHKGc0xKM6pWOnGdErMm16wIKAO6PA/S7mA0m/5+MDrPH3TRe0LOGesdUKFCoigkBgZD87BRgQeV5yb/D6sVtC9MlJQ9qIBaKFDdel8wZ2QoArli7K5W9nwym85evpoeitP087Jsy/rDEeX8Npdi4gY9dRLh86HNcmBWcIorWAdRGAOQnjSXhkuW7thPnz6d1N1JXT3ILcXRCBE5MxrJkqKHow7DCgM51zIo4XbV38XLy18Oxew39F35lZYKEWlrxUROia4ACmZzepgQffSgrcXwlLTIf/zKxwS01oWCofNkAI1hdPUrZpNRivqDdbnZwefZ1dXFdHJ5KERvocIfRkDWR0KUAgtRUMvkkQovucRCkMpZk1KSfh9A73eP02gFXVemkr5uVNPrN1fP353Pdiib4wxjeT+wAfcogL/HOpzJ8XA0OIjLrR4iBpFmHgXSXKT/sB3DlTF5AZLygdtiEEeBRIoMTBN7Ha1PMeEgjhakQstlVYayH+K5ulyHsrU2OkQn9fl25DKH7rpb+a2T3SaKIXc2d60pkgVHKq8YUKs8MJ9TMvDoTMRCOu70v5Wy+9h8JGW/EaLfCtrJEWVOwtBXt0d10y5ILnwz+5Ha3SFEv1Pl/qMc3ZPZ2Jve1Y3voS5XiwddyXBXgKU+qYMIlOIJGLjEmXNcGOls8nnaUXXnP03efH/JbfL3nsorqoy2hGpbdNJH7ahP0o1HHhlumEN6FFHRqIoxBPX/F93mbe+ae/gfZK8meeAye//lL+7ipy1lDgAA", "encoding": null}, "headers": {"Allow": "GET, POST, OPTIONS", "Transfer-Encoding": "chunked", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Server": "nginx/1.10.2", "Connection": "keep-alive", "Content-Encoding": "gzip", "Vary": "Accept-Encoding", "X-XSS-Protection": "1; mode=block", "X-Content-Type-Options": "nosniff", "Content-Type": "application/json", "Date": "Mon, 05 Jun 2017 09:29:23 GMT", "X-Frame-Options": "SAMEORIGIN"}, "status": {"message": "OK", "code": 200}, "url": "/api/parts.json?activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d&limit=100&category=INSTANCE"}, "recorded_at": "2017-06-05T09:29:23"}]} \ No newline at end of file diff --git a/tests/cassettes/TestActivities.test_retrieve_part_models_associated_to_activities.json b/tests/cassettes/TestActivities.test_retrieve_part_models_associated_to_activities.json new file mode 100644 index 000000000..74500824f --- /dev/null +++ b/tests/cassettes/TestActivities.test_retrieve_part_models_associated_to_activities.json @@ -0,0 +1 @@ +{"recorded_with": "betamax/0.8.0", "http_interactions": [{"response": {"status": {"message": "OK", "code": 200}, "headers": {"Date": "Mon, 05 Jun 2017 09:30:18 GMT", "Connection": "keep-alive", "Server": "nginx/1.10.2", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Content-Type": "application/json", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "X-Content-Type-Options": "nosniff", "Vary": "Accept-Encoding", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "X-XSS-Protection": "1; mode=block"}, "body": {"base64_string": "H4sIAAAAAAAAA5VT24rbMBD9lUVPLUSJLNmWladtt/tQKLTQZR9alqDLOHFiy0GSe2HJv3ecyzZLH5JiG6TROXNmxkfPJEAc2hTJ/PszGUJL5mSV0jbOZ7MNWK63zXQD1K5046e272YYmEXbbyHOyloaq2pGOa+A5k5oqpxlFGyhZeGkgMxN17H3ZEIah4mvISDW6w4Q/b7ZwM2X0K/Bpps3299YzljFTYKYGr98i8gEvxIicRWTTgM2Qd7dPXx8vB/PgvaxSU3vD72tmuWqxS8BlpLCAGeku0+fv95/+Cu935Pd04ToGJulBwz6oW0npIPOQDhOK0I4EsaaOu31EgJmgU434yDNrZn6duw+Lg7Ek/KRdhwMPyCO/CMEI9qm5gccArvJP4Lj9kxNX6kmXqvVuo0X5V6mf6Z3WUn+f1/r3q6gm2JK8C6eqb0+uEVP/uzDJo6evFxIeU0hT3tDhLRwOo1czjJJWUZ5+cDFnDF8v2E+N8AFhBnsBtCXz6TrHbSL0PejS6XiWlgDlImiRPernFZ5VVNjramN4Ky24nRTcsYQxSXN8ArSXJaaVlziTTGykBxKBcBGrMeKvYWTRF3wTAgBVGfgaA5lQU1WllQpVatMi8rWGdlNyDb0FuLofOY0FEooWglhaV5JTY0qc8oKl1sBqgaryJ6wDHsGm8oqO38U/iPXJG3al0Hu/gANgxWnVgQAAA==", "encoding": null, "string": ""}, "url": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE"}, "recorded_at": "2017-06-05T09:30:18", "request": {"uri": "/api/scopes.json?name=Bike+Project+%28pykechain+testing%29&status=ACTIVE", "method": "GET", "headers": {"X-Requested-With": "XMLHttpRequest", "PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Authorization": "Token ", "User-Agent": "python-requests/2.17.3"}, "body": {"encoding": "utf-8", "string": ""}}}, {"response": {"status": {"message": "OK", "code": 200}, "headers": {"Date": "Mon, 05 Jun 2017 09:30:19 GMT", "Connection": "keep-alive", "Server": "nginx/1.10.2", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Content-Type": "application/json", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "X-Content-Type-Options": "nosniff", "Vary": "Accept-Encoding", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "X-XSS-Protection": "1; mode=block"}, "body": {"base64_string": "H4sIAAAAAAAAA51SwY6bMBD9FeRTK8XEGIOBY9vc2m6k0stWK+TYA3jDAsJmoyjKv3fIKtl2tYeqkrHkmTePmffmRCZwc+cdKX6dyDx1pCCt96Mr1us9aK5GG+6B6lbZPtTD0xoDa6W9fbbegltHWtdZygTdpTtJhZaKZlInNE1iiIXhO5OY8NENPVkRa5D8XwoQ26snQPSPEbStj8GhBegCYzHqYcK8AacnO3qLzAUpW+sCr9w+aJULVKCHAdF/QFZEOWebHhbS8YiTLQO9hrEzP82wIs4rP6MY5G67+Y55P6ne2YXjRaHWNm2Hn3+n5PPdt+3XTbn58tr/NUTODxfg5Cuj/JLhLJKUpZTnJecFY3jul7lmeIuI2V+IcRoa9Ax/GIVshfYpY/vLm4WJjATPbveK6KH3OChKVhBmFCR5nNMsjjUVGSq/y1NBWWKEjiGvQefIPw2Dr/6jTmMnqEql/K13Tpkso7iIsiLhYY71Ml1GmEfzFppSJkoeFUwUCQtFlkdCLlD0qW/AVZ1yvnq2cFh0f4c+CVPBJb8o5PQwooCnqwmf7B6C7TQ8gvbBh5v7gQfnbd98vK5mWsudzmtGOc+AChMrmhvNKOhEycTIGCJDzrgzL+t/rDR2tRj/08FU4vYh0cGaBi761bYhRT933fnh/Bu5iBBpZgMAAA==", "encoding": null, "string": ""}, "url": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter"}, "recorded_at": "2017-06-05T09:30:19", "request": {"uri": "/api/activities.json?scope=6f7bc9f0-228e-4d3a-9dc0-ec5a75d73e1d&name=Specify+wheel+diameter", "method": "GET", "headers": {"X-Requested-With": "XMLHttpRequest", "PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Authorization": "Token ", "User-Agent": "python-requests/2.17.3"}, "body": {"encoding": "utf-8", "string": ""}}}, {"response": {"status": {"message": "OK", "code": 200}, "headers": {"Date": "Mon, 05 Jun 2017 09:30:19 GMT", "Connection": "keep-alive", "Server": "nginx/1.10.2", "Strict-Transport-Security": "max-age=518400; includeSubDomains", "Content-Type": "application/json", "Content-Encoding": "gzip", "Transfer-Encoding": "chunked", "X-Content-Type-Options": "nosniff", "Vary": "Accept-Encoding", "Allow": "GET, POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "X-XSS-Protection": "1; mode=block"}, "body": {"base64_string": "H4sIAAAAAAAAA9VWbW/bNhD+K4E++2JRpEgxXwY3cdZgThx07jZgKAKSOsZcFEvQS5EgyH/vyY6crR1Wt3Bh7IvhI4/H53nujrqnyJXdqo1OklG0wgf6s+qKYhRVNX4MZdcMdo1NV7Rk/vkUhTw6iVKeS4HWAovzDIS0GVgpNTiTyMxgLjnj0Sjq6oKcl21bNSfj8R26xFTh+A7BLU1YHbvyfkwL48rUbTPeJebxX025osArc48U+U24Q7JybFwdqjbQ3klEC24Zivzmvsyx2HJYW68EywrrNuCGUw9gd1YfTdHhf4V9vGkfqx7fxdXi5rfJ7P2UTpVrfHTf0/Moatq6c21X4+B5/XKyd+zaqiM43hQNbqn+jKZuaHctv1ZcSqUkpEIIEEIxyFSag3fKa6EMS0Tcy78K25Q60+JtWT/S6cv52XQWPY9+HO/z2XyyN+aLsjXF0RLD7bIdBHCcaaN0AtprBJFqAzr2OWjm00RznkqLhxRgslhMTt9eTveX/+uw9h8EsMi1Y8pDgrEFYZMETIoSvGK5lVYwnrJDCrCY/rE36md/a++hASRj6EUK1AfUAKn3kMk4BeWQO9Rx7Hh2SPpnk8V0cXE53ZcE04cq1GF1e5QTi0EEk1olc06ZR2EItaF2sFaBltwpJ2Mls4O+ArOLq1/2JcDvaJvwSl0wlEmSM5ApKnoA6UcbUkJJE7OUO5Hog5b/m/l8Np1c7Yv9r6bAnwbu0mGWaacAtZUgUEqwLhWQeSlEjCzTsfwq9w//skhLhWma4ANtbb6l1+/mZ+9PF+tvbIGtsQXBIfgEDfPwD3tAvrG+5NgrPeoFx37geNq+a3WZk+eRK1ctzQRYDzRTlbEEEw+eZ5RiKTkYwRQY4qekykkCpBxG9zSZhKoILrQ9lflVr/drtEFJytDD46DH0jQ3TWe3IJsN7L4i1nejdYwuzCEnZUH4hEPGhAXtXCa5YIwl8beON7vE/Gy8Oa+JxtF5Wd/tccjZkdvutX76dvLu+wt9Uy4vhC+pJOtgim2pM61MxgykLnEgmDdgtGegNUsk15m3sf//lPrLtLr7AL3n6v7w/AnxA5W18AsAAA==", "encoding": null, "string": ""}, "url": "/api/parts.json?activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d&category=MODEL&limit=100"}, "recorded_at": "2017-06-05T09:30:19", "request": {"uri": "/api/parts.json?activity_id=1ccf8604-b6b7-4c7a-87c5-653e34d2bd5d&category=MODEL&limit=100", "method": "GET", "headers": {"X-Requested-With": "XMLHttpRequest", "PyKechain-Version": "1.7.3", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Authorization": "Token ", "User-Agent": "python-requests/2.17.3"}, "body": {"encoding": "utf-8", "string": ""}}}]} \ No newline at end of file diff --git a/tests/test_activities.py b/tests/test_activities.py index 5ec661ad1..f547ce231 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -4,7 +4,9 @@ import requests import warnings +from pykechain.enums import Category from pykechain.exceptions import NotFoundError, MultipleFoundError, APIError +from pykechain.models import Part from tests.classes import TestBetamax ISOFORMAT = "%Y-%m-%dT%H:%M:%SZ" @@ -211,3 +213,31 @@ def test_datetime_with_tzinfo_provides_correct_offset(self): with warnings.catch_warnings(record=False) as w: warnings.simplefilter("ignore") specify_wd.edit(start_date=old_start, due_date=old_due) + + def test_retrieve_part_associated_to_activities(self): + task = self.project.activity('Specify wheel diameter') + parts = list(task.parts()) + + for part in parts: + self.assertIsInstance(part, Part) + self.assertTrue(part.category, Category.INSTANCE) + + def test_retrieve_part_models_associated_to_activities(self): + task = self.project.activity('Specify wheel diameter') + parts = list(task.parts(category=Category.MODEL)) + + for part in parts: + self.assertIsInstance(part, Part) + self.assertTrue(part.category, Category.MODEL) + + def test_retrieve_associated_parts_to_activity(self): + task = self.project.activity('Specify wheel diameter') + (models, parts) = list(task.associated_parts()) + + for part in parts: + self.assertIsInstance(part, Part) + self.assertTrue(part.category, Category.INSTANCE) + + for part in parts: + self.assertIsInstance(part, Part) + self.assertTrue(part.category, Category.INSTANCE) From 1cd736356b91a37a7c9a28000040b07fe4a229f5 Mon Sep 17 00:00:00 2001 From: Jochem Berends Date: Mon, 5 Jun 2017 11:41:47 +0200 Subject: [PATCH 3/4] typo --- pykechain/models/activity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pykechain/models/activity.py b/pykechain/models/activity.py index 3221a4ac9..ae79fa95c 100644 --- a/pykechain/models/activity.py +++ b/pykechain/models/activity.py @@ -43,7 +43,7 @@ def parts(self, *args, **kwargs): def associated_parts(self, *args, **kwargs): """Retrieve models and instances belonging to this activity. - This is a conveinience method for the `Activity.parts()` method, which is used to retrieve both the + This is a convenience method for the `Activity.parts()` method, which is used to retrieve both the `Category.MODEL` as well as the `Category.INSTANCE` in a tuple. If you want to retrieve only the models associated to this task it is better to use: From 6cc25e1846d9180cd0fa344537d54702ecbc4334 Mon Sep 17 00:00:00 2001 From: Jochem Berends Date: Mon, 5 Jun 2017 11:48:51 +0200 Subject: [PATCH 4/4] #118 changelog updated --- CHANGELOG.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 32d435cf6..30dfddbd8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,12 @@ Change Log pykechain changelog + * Added a convenience method to retrieve models and instances related to a task at once: `Activity.associated_parts()`. + Making use of the already provided method in `Activity.parts()`. (#118) + * Added missing tests for `Activity.parts()` and `Activity.associated_parts()` + * Added documentation + + 1.7.3 (01JUN17) --------------- * Updated documentation for activity startdate and duedate editting using timezone supported datetime objects.