{ "info": { "author": "Josue Kouka", "author_email": "josuebrunel@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Simple XML Python Marshaller\n============================\n\n.. image:: https://travis-ci.org/josuebrunel/pysxm.svg?branch=master\n :target: https://travis-ci.org/josuebrunel/pysxm\n.. image:: https://coveralls.io/repos/github/josuebrunel/pysxm/badge.svg?branch=master\n :target: https://coveralls.io/github/josuebrunel/pysxm?branch=master\n.. image:: http://pepy.tech/badge/pysxm\n :target: http://pepy.tech/count/pysxm\n\n\n**pysxm** is a simple and extensible xml python marshaller.\nIt comes with two simple and basic types:\n\n- SimpleType\n- ComplexType\n\nIt supports py2 and py3 and uses *lxml.objectify* under the hood.\n\n\nInstallation\n------------\n\n.. code:: python\n\n pip install pysxm\n\n\nQuickstart\n----------\n\n.. code:: python\n\n In [1]: from pysxm import ComplexType\n In [2]: class Person(ComplexType):\n ...: attrib = {'description': 'a random person'}\n ...: def __init__(self, fname, lname):\n ...: self.fname = fname\n ...: self.lname = lname\n ...:\n In [3]: person = Person('token', 'black')\n In [4]: print(person)\n \n black\n token\n \n\nLet's say, we want a different **tag** for our object.\nAn attribute **tagname** or **_tagname** can be set to define the **xml tag name** of the object.\n\n.. code:: python\n\n In [5]: class Person(ComplexType):\n ...: attrib = {'description': 'a random person'}\n ...: tagname = 'student'\n ...: def __init__(self, fname, lname):\n ...: self.fname = fname\n ...: self.lname = lname\n ...:\n In [6]: person = Person('token', 'black')\n In [7]: print(person)\n \n black\n token\n \n\nA **sequence** or **_sequence** (tuple or list) attribute can be set to decide of the **order** or the **presence** of an subelement in the xml.\n\n.. code:: python\n\n In [8]: class Person(ComplexType):\n ...: attrib = {'description': 'a random person'}\n ...: tagname = 'student'\n ...: _sequence = ('city', 'fname')\n ...:\n ...: def __init__(self, fname, lname, city):\n ...: self.fname = fname\n ...: self.lname = lname\n ...: self.city = city\n ...:\n In [9]: person = Person('token', 'black', 'south park')\n In [10]: print(person)\n \n south park\n token\n \n\nLet's add a **namespace** to our object.\n\n.. code:: python\n\n In [11]: class Person(ComplexType):\n ...: attrib = {'description': 'a random south park character'}\n ...: nsmap = {'sp': 'http://southpark/xml/'}\n ...:\n ...: def __init__(self, fname, lname, city):\n ...: self.fname = fname\n ...: self.lname = lname\n ...: self.city = city\n ...:\n In [12]: person = Person('token', 'black', 'south park')\n In [13]: print(person)\n \n black\n south park\n token\n \n\nLet's make sure that a *person*'s group is either *coon* or *goth*.\nTo do so, we can inherit from **SimpleType** object and define a restriction by overriding **check_restriction(self, value)** method.\n\n.. code:: python\n\n In [7]: from pysxm import ComplexType, SimpleType\n In [8]: class Group(SimpleType):\n ...: allowed_groups = ('coon', 'goth')\n ...: def check_restriction(self, value):\n ...: if value not in self.allowed_groups:\n ...: raise ValueError('<%s> value %s not in %s' % (self.tagname, value, self.allowed_groups))\n ...:\n In [9]: class Person(ComplexType):\n ...: def __init__(self, fname, lname, group):\n ...: self.fname = fname\n ...: self.lname = lname\n ...: self.group = Group(group)\n ...:\n In [10]: Person('token', 'black', 'boys')\n ...\n in check_restriction(self, value)\n 3 def check_restriction(self, value):\n 4 if value not in self.allowed_groups:\n ----> 5 raise ValueError('<%s> value %s not in %s' % (self.tagname, value, self.allowed_groups))\n 6\n ValueError: value boys not in ('coon', 'goth')\n\n In [11]: print(Person('token', 'black', 'goth'))\n \n black\n goth\n token\n \n\n**Note**: *ComplexType* can have *ComplexType* and *SimpleType* as attribute\n\n.. code:: python\n\n from pysxm import ComplexType, SimpleType\n\n\n class AdultAge(SimpleType):\n\n tagname = 'age'\n attrib = {'minvalue': '18', 'maxvalue': '100'}\n\n def check_restriction(self, value):\n if int(value) < 18:\n raise ValueError(\"<%s> '%d' < 18\" % (self.tagname, value))\n\n\n class Credentials(ComplexType):\n\n def __init__(self, login, password):\n self.login = login\n self.password = password\n\n\n class Person(ComplexType):\n\n def __init__(self, fname, lname, credentials, age):\n self.fname = fname\n self.lname = lname\n self.credentials = Credentials(credentials['login'], credentials['password'])\n self.age = AdultAge(age)\n\n In [3]: data = {\n ...: 'fname': 'token', 'lname': 'black',\n ...: 'credentials': {'login': 't0ken', 'password': 'l33tolite'},\n ...: 'age': '30'}\n In [4]: person = Person(**data)\n In [5]: print(person)\n \n black\n \n t0ken\n l33tolite\n \n 30\n token\n \n In [6]: person.save('token.xml')\n\nThe **save** method (*object.save()*) allows you to save the xml result into a file.\n\n.. code:: python\n\n In [7]: cat token.xml\n \n black\n \n t0ken\n l33tolite\n \n 30\n token\n \n\n\nThe ext module\n^^^^^^^^^^^^^^\n\nPysxm comes with a couple of extended types. Those types are defined in *pysxm.ext* module.\n\nDataComplexType\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThis is a simple *DataClass* of *ComplexType*. Here is how you can set one up:\n\n.. code:: python\n\n from pysxm.ext import DataComplexType, XSimpleType\n\n\n class Game(DataComplexType):\n platform = XSimpleType('platform', ['xboxone', 'xboxx'], lambda v, av: v in av)\n\n >>> game = Game(name='state of decay 2', editor='undead labs', platform='xboxone')\n >>> print(game)\n \n state of decay 2\n xboxone\n undead labs\n \n\nXSimpleType\n\"\"\"\"\"\"\"\"\"\"\"\n\nIt gets tiresome to subclass a *SimpleType* everytime you want to check a value. To overcome that, **pysxm** provides a **descriptor** called **XSimpleType**:\n\n.. code:: python\n\n class XSimpleType(name=None, restriction=None, checker=None, error_msg=None, **kwargs)\n '''name: it's the name of the attribute.\n restriction: self explanatory\n checker: the fucntion that checks the input value\n error_msg: message returned when checking fails\n kwargs: as tagname, attrib or nsmap\n '''\n\nHere is an example:\n\n\n.. code:: python\n\n class XboxGamer(ComplexType):\n platform = XSimpleType('platform', ('xone', 'xbox360', 'xbox'), lambda v, av: v in av)\n score = XSimpleType('score', (4000, 1000000), lambda v, av: int(av[0]) <= int(v) < int(av[1]))\n lastlogin = XDateTimeType('lastlogin')\n\n def __init__(self, gamertag, platform, score, lastlogin):\n self.gamertag = gamertag\n self.platform = platform\n self.score = score\n self.lastlogin = lastlogin\n\n In [1]: print(gamer_data)\n {'gamertag': 'LokingHD', 'platform': 'ps4', 'score': '22526', 'lastlogin': '2018-03-21'}\n In [2]: XboxGamer(**gamer_data)\n ---------------------------------------------------------------------------\n ValueError Traceback (most recent call last)\n in ()\n ----> 1 XboxGamer(**gamer_data)\n /home/josue/workspace/dev/pysxdb/pysxm/ext.pyc in check(self, instance, value)\n 77 if not self.checker(value, self.restriction_values):\n 78 raise ValueError('tagname <%s> value %s is invalid: expected (%s)'\n ---> 79 % (instance.tagname, value, self.restriction_values))\n 80\n 81 def check_restriction(self, instance, value):\n ValueError: tagname value ps4 is invalid: expected (('xone', 'xbox360', 'xbox'))\n In [3]: gamer_data['platform'] = 'xone'\n In [4]: gamer = XboxGamer(**gamer_data)\n In [5]: print(gamer)\n \n LokingHD\n xone\n 22526\n 2018-03-21T00:00:00\n \n\n\nMost of the types defined in *pysxm.ext* are descriptors and they're subclassable.\n\n\nVoila :wink:", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/josuebrunel/pysxm/archive/1.3.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/josuebrunel/pysxm", "keywords": "xml,data binding,data,binding,data-binging,marshaller", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pysxm", "package_url": "https://pypi.org/project/pysxm/", "platform": "Any", "project_url": "https://pypi.org/project/pysxm/", "project_urls": { "Download": "https://github.com/josuebrunel/pysxm/archive/1.3.tar.gz", "Homepage": "https://github.com/josuebrunel/pysxm" }, "release_url": "https://pypi.org/project/pysxm/1.3/", "requires_dist": null, "requires_python": "", "summary": "Simple and extensible xml python marshaller", "version": "1.3" }, "last_serial": 4179621, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "52470b99d0a9f172c653ca45d6609006", "sha256": "4f2d799a0952e54534778ccc535055c1397552b262345b8919c3f6d7e9acd637" }, "downloads": -1, "filename": "pysxm-0.1.tar.gz", "has_sig": false, "md5_digest": "52470b99d0a9f172c653ca45d6609006", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2765, "upload_time": "2017-12-26T22:55:36", "url": "https://files.pythonhosted.org/packages/6e/0e/fc70f177e96a2a650893e95fe6a25daa3053f01299a258541d70cff840e7/pysxm-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "bc33fd2fdbc35de146683c30d33f367a", "sha256": "b51138eaebad2b5bdd7d388eedc253edd193fed87f37eab6f2d51d4d2679a41a" }, "downloads": -1, "filename": "pysxm-0.2.tar.gz", "has_sig": false, "md5_digest": "bc33fd2fdbc35de146683c30d33f367a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2739, "upload_time": "2017-12-26T23:04:34", "url": "https://files.pythonhosted.org/packages/ab/70/8ae959523603255246792adeaf0409a853af3e887e90559f769769cbad42/pysxm-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "ff231d963bc89d16ba8f56a1cf144e08", "sha256": "fbae0b8522f5192d620cc22106c422dbc773fac575e42e9e28ea26a6f4720862" }, "downloads": -1, "filename": "pysxm-0.3.tar.gz", "has_sig": false, "md5_digest": "ff231d963bc89d16ba8f56a1cf144e08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4797, "upload_time": "2017-12-28T20:16:29", "url": "https://files.pythonhosted.org/packages/a3/6f/71706aa3656dbf195b97541ce2c76ff37bae4cfa43e69f61a3a1c16dbeb7/pysxm-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "e2fc213bd0a0322795b55faf89636ac2", "sha256": "77717dfcdbc952f17e47a5ee21bb68c75f9420fa20721721ba19b9641f285195" }, "downloads": -1, "filename": "pysxm-0.4.tar.gz", "has_sig": false, "md5_digest": "e2fc213bd0a0322795b55faf89636ac2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5023, "upload_time": "2018-03-16T14:54:08", "url": "https://files.pythonhosted.org/packages/59/6d/4954bccf48e300c6f0f368ee96568d51f89f1326bbd419514cb354c590f9/pysxm-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "28e7adf7c12f1d7bebc7a92bcf014e3d", "sha256": "f95ca12755e6b6f4158abc4ace76316f3b731eede09146d2b033060483a30a6e" }, "downloads": -1, "filename": "pysxm-0.5.tar.gz", "has_sig": false, "md5_digest": "28e7adf7c12f1d7bebc7a92bcf014e3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5024, "upload_time": "2018-03-16T14:54:15", "url": "https://files.pythonhosted.org/packages/f3/fa/4b0b77986ca1336e15e8c04ed7ce511ce2907865a97fbdc4051b22d08b00/pysxm-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "f710597f963d63a8ba823cd6da8ee240", "sha256": "6a5b8fe3f5aace52b3a814a954eb98521e99ece88cf81bed89bb2b7a239485b5" }, "downloads": -1, "filename": "pysxm-0.6.tar.gz", "has_sig": false, "md5_digest": "f710597f963d63a8ba823cd6da8ee240", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5706, "upload_time": "2018-03-16T17:57:40", "url": "https://files.pythonhosted.org/packages/45/7b/de97671e3128f62c31a4084573e269d3d9e917ad003021f8099a28399d94/pysxm-0.6.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "b6de23e828cbfa759f7fab41b5e4e91d", "sha256": "8f40684209f8fd8ba74290a516f43e9344cb571af748a97668593b9fed1c10bb" }, "downloads": -1, "filename": "pysxm-0.8.tar.gz", "has_sig": false, "md5_digest": "b6de23e828cbfa759f7fab41b5e4e91d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5959, "upload_time": "2018-03-20T11:03:26", "url": "https://files.pythonhosted.org/packages/54/4c/edb72082bb20317e996abe135435bb4cf9c173b8f29371a8c3db8dbafc02/pysxm-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "491ce14f9fb565d12f583a80ff33becc", "sha256": "6e059688c73453ee1657afe6baf857e2b5bd4635612fd865348bdbc8fb18bcae" }, "downloads": -1, "filename": "pysxm-0.9.tar.gz", "has_sig": false, "md5_digest": "491ce14f9fb565d12f583a80ff33becc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7100, "upload_time": "2018-03-21T15:26:04", "url": "https://files.pythonhosted.org/packages/7b/a4/6fe9ef6daccf6ada3bcfafb0c71164e37923aeafe8f4dce237cccff611a6/pysxm-0.9.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "6c058d641c4399636a8fc0c83738f897", "sha256": "bfbd0496ea0154e7d26925cfd6d309cca52418a27dd1ccccba501c762588ee0d" }, "downloads": -1, "filename": "pysxm-1.0.tar.gz", "has_sig": false, "md5_digest": "6c058d641c4399636a8fc0c83738f897", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7295, "upload_time": "2018-03-31T17:14:23", "url": "https://files.pythonhosted.org/packages/c0/bc/0b0bedf80992505d524300b2a736718660b6d891b364b8840ed6d87d3f7b/pysxm-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "ead0226a70982da18e11b6183f6b374d", "sha256": "6e9f733dbada72791dda43b9db89008c262831fa37355c66486f7262b4277f10" }, "downloads": -1, "filename": "pysxm-1.1.tar.gz", "has_sig": false, "md5_digest": "ead0226a70982da18e11b6183f6b374d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7699, "upload_time": "2018-05-19T10:55:23", "url": "https://files.pythonhosted.org/packages/cc/ca/0c61dfc7d891b34d37fb78bd80fbc52887a3ac20d49fb506e1136c699c6c/pysxm-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "b2c6e07059c5ee827d27b8ece735a14a", "sha256": "d51471953ff2cf8560f4c142ee865fd9c9a7b8203d402f56a2e4014532ee18d9" }, "downloads": -1, "filename": "pysxm-1.2.tar.gz", "has_sig": false, "md5_digest": "b2c6e07059c5ee827d27b8ece735a14a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7791, "upload_time": "2018-08-02T10:37:26", "url": "https://files.pythonhosted.org/packages/32/9f/2a08bef0a90fad61416f7f318c6f6f4fa92374b0ad64b15d21e3e9c92656/pysxm-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "bdd4740674bf928de58fe5887e0c22ed", "sha256": "361ad7cf2df49bba91cd31db2bc2923e15c7e93895682bcf3e5476fd5f38be44" }, "downloads": -1, "filename": "pysxm-1.3.tar.gz", "has_sig": false, "md5_digest": "bdd4740674bf928de58fe5887e0c22ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7930, "upload_time": "2018-08-17T10:03:50", "url": "https://files.pythonhosted.org/packages/9f/90/68d01a8b300d2934828fee2a0e9eb1160fdec38572434e69861148321f55/pysxm-1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bdd4740674bf928de58fe5887e0c22ed", "sha256": "361ad7cf2df49bba91cd31db2bc2923e15c7e93895682bcf3e5476fd5f38be44" }, "downloads": -1, "filename": "pysxm-1.3.tar.gz", "has_sig": false, "md5_digest": "bdd4740674bf928de58fe5887e0c22ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7930, "upload_time": "2018-08-17T10:03:50", "url": "https://files.pythonhosted.org/packages/9f/90/68d01a8b300d2934828fee2a0e9eb1160fdec38572434e69861148321f55/pysxm-1.3.tar.gz" } ] }