{ "info": { "author": "Marshall L Smith Jr", "author_email": "marshallsmithjr@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Console", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Programming Language :: Python :: 3" ], "description": "# pysforce\n\tPronounced pie-es-force\n\nLibrary to authenticate with and make API calls to Salesforce.\nThis is a new library that's starting out very simple with the hope that\nthe python/salesforce community will swarm around it to create the \ndefinitive API toolkit.\n\n*Feel free to fork, enhance, and submit pull requests.*\n\n\n### Features:\n* Supports single record operations fetch and update.\n* Support large query results using a generator. \n* Plug-in authentication model.\n* Currently supports user/pass and JWT authentication.\n* Auto connection retry.\n\n### Requirements\n\n* Python 3.6+\n\n### Installation\n\n```bash\npip3 install --user pysforce\n```\n-or-\n```bash\npipenv install pysforce\n```\n\n\n### Upgrading\n\n```bash\npip3 install --upgrade pysforce\n```\n\n## Quick Start\n\n##### simple password-based authentication\n```python\nfrom pysforce import OAuthPassword, SFClient\n\n# authenticate to a sandbox (default)\nmyauth = OAuthPassword('myuser@mydomain.com.dev', 'mypassword')\nclient = SFClient(myauth)\n```\n##### JWT authentication\n```python\nfrom pysforce import OAuthJWT, SFClient\n\npubkey = Path('mykey.pem').read_text()\n# authenticate to production\nmyauth = OAuthJWT('myuser@mydomain.com.dev', consumer_key, pubkey, 'https://domain.my.salesforce.com')\nclient = SFClient(myauth)\n```\n\n##### execute a query\n```python\nfor record in client.query('select id,name from account, owner.name'):\n id = record['id']\n name = record['name']\n ownername = record['owner']['name']\n print(f'{id}:{name}:{ownername}')\n```\n\n##### execute a query for a single row\n```python\nrecord = client.query_one('select id,name from account, owner.name limit 1'):\n```\n\n##### retrieve multiple rows by recordId\n```python\nrecords = client.fetch_records('account', ['001000003dfJ87f','0010000000fE46q'], ['Id','Name','BillingCity'])\n```\n\n##### fetch and update a record by ID\n```python\ntry:\n record = client.fetch_record('account', recordid, ['onboarding_status'])\n if record['onboarding_status'] != 'Complete':\n client.update_record('account', recordid, {'onboarding_status': 'Complete'})\nexcept Exception as ex:\n print('record missing')\n```\n\n##### update multiple records (up to 200 at a time)\n```python\n contacts= [\n {'Id': '005000000123456', 'email': mreynolds@serenity.net'},\n {'Id': '005000000789123', 'email': jcobb@serenity.net'},\n ]\n result = client.update_records('contact', contacts)\n```\n\n##### insert a record\n```python\ntry:\n contact = {'FirstName': 'Marshall', 'LastName': 'Smith', 'email': 'marshallsmithjr@gmail.com' }\nclient.insert_record('contact', contact)\nexcept Exception as ex:\n print(str(ex)))\n```\n\n##### insert multiple records (up to 200 at a time)\n```python\n contacts= [\n {'FirstName': 'Mal', 'LastName': 'Reynolds', 'email': mal@serenity.net'},\n {'FirstName': 'Jayne', 'LastName': 'Cobb', 'email': jayne@serenity.net'},\n ]\n result = client.insert_records('contact', contacts)\n```\n\n##### list tables available to my permissions\n```python\nfor sobject in client.get_sobject_list():\n print(sobject['name'])\n\n```\n\n##### list table details (metadata attributes)\n```python\nsobject = client.get_sobject_definition('account')\nfor k,v in sobject.items():\n print(f'{k} : {v}')\n\n```\n\n##### list table fields\n```python\nfieldlist = client.get_field_list('account')\nfor field in fieldlist:\n name = field['name']\n type = field['type']\n size = field['size']\n print(f'name={field}, type={type}, size={size}')\n\n# or, you could get the field definition as a map keyed by name\nfieldmap = client.get_field_map('account')\nfor key, val in fieldmap.items():\n type = val['type']\n size = val['size']\n print(f'name={key}, type={type}, size={size}')\n```\n\n##### record count\n```python\nreccount = client.record_count('account')\nprint(f'{reccount} records in account table')\n```\n##### call a custom REST endpoint\n```python\ntext = client.call('myservices/find_account&extid=1000001')\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mlsmithjr/pysforce", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pysforce", "package_url": "https://pypi.org/project/pysforce/", "platform": "", "project_url": "https://pypi.org/project/pysforce/", "project_urls": { "Homepage": "https://github.com/mlsmithjr/pysforce" }, "release_url": "https://pypi.org/project/pysforce/1.1.2/", "requires_dist": [ "requests", "pyjwt", "cryptography", "fastcache" ], "requires_python": ">=3.6", "summary": "Salesforce API library", "version": "1.1.2" }, "last_serial": 5427006, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "463590b54accb09ca383f2e485093804", "sha256": "9edf2d6fc9d5607a6ca023ee60b7408ca1e88c9cb618ffffb018e9d36367f427" }, "downloads": -1, "filename": "pysforce-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "463590b54accb09ca383f2e485093804", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 18839, "upload_time": "2019-04-12T01:54:01", "url": "https://files.pythonhosted.org/packages/7b/3c/150772b820b955d8d83601435ca27a6410980aa67638a2ad8d04d1671851/pysforce-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4534a40d7e9eaa5b61a42c10f1055493", "sha256": "24778b6981e83b629b78b1fb2a7d8e2a470057b28406e2f715e247658f3d060f" }, "downloads": -1, "filename": "pysforce-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4534a40d7e9eaa5b61a42c10f1055493", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6177, "upload_time": "2019-04-12T01:54:03", "url": "https://files.pythonhosted.org/packages/6e/3b/1dd0dc9315ad03d16e8a4c84110941bc0e1175ad5bc0690707cb111a9df6/pysforce-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "1cf2be34758e8784d9b019deb6e50ae9", "sha256": "32860ee4470bd86ee1ee7fd6360a8e40d75081f6483e4df8115287a0066409c3" }, "downloads": -1, "filename": "pysforce-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1cf2be34758e8784d9b019deb6e50ae9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 19871, "upload_time": "2019-05-01T18:36:24", "url": "https://files.pythonhosted.org/packages/fe/d8/e684ce2c9bcce34ac7967983a85667b60c315f255f6eac6c8b98c90dd94c/pysforce-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "902999e922f7009f4f4fd525f9edade9", "sha256": "099b0071c1a9ee454dfc219d945e1866d33ecadae6cb18f5cf76beee85a4abe9" }, "downloads": -1, "filename": "pysforce-1.1.0.tar.gz", "has_sig": false, "md5_digest": "902999e922f7009f4f4fd525f9edade9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7252, "upload_time": "2019-05-01T18:36:25", "url": "https://files.pythonhosted.org/packages/f3/2d/36f49e58d3be2cb27d5959e4d1be869c477a1b852ecc016214ea89200109/pysforce-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "ca9b94619fce9b73a369405d63b385b0", "sha256": "293d93888fd7956d6abe1c95c38b10ea8b6a22f7b06867d43c6ff418cfed4f0f" }, "downloads": -1, "filename": "pysforce-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ca9b94619fce9b73a369405d63b385b0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20099, "upload_time": "2019-05-23T18:21:09", "url": "https://files.pythonhosted.org/packages/a0/36/2d9ba137b542aedba3fd4808079510ae7335833d4fd2ad57fcbcaa84fcda/pysforce-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2a6c3d530f2d34b7906e1c80ed280e9", "sha256": "ae207f0351d78d761876d503d1753fd5d9e5ed42535332f060483e9c2caca998" }, "downloads": -1, "filename": "pysforce-1.1.1.tar.gz", "has_sig": false, "md5_digest": "d2a6c3d530f2d34b7906e1c80ed280e9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8140, "upload_time": "2019-05-23T18:21:11", "url": "https://files.pythonhosted.org/packages/45/0e/a3246b47848ebc86f11bd80d785b3f9d4b613124b8c7f190e6aa030a9ee4/pysforce-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "6ed9b0569cec63862f70b973d57df948", "sha256": "799143199640b04eaac69b855086b744ff0f7b6459cc7575ff965e4cdd4de297" }, "downloads": -1, "filename": "pysforce-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6ed9b0569cec63862f70b973d57df948", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20132, "upload_time": "2019-06-20T17:56:35", "url": "https://files.pythonhosted.org/packages/2a/2b/2dee1498eb2a54be323813cae0baf78ea34ab7704e9ac2bfcc2f4ceda20e/pysforce-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5f8c4696595e5afe05b8475b45a60fc", "sha256": "b5d5a4528f3b444cf5fafcbc7035996addeb74c3f1e780e6904c90339de1094c" }, "downloads": -1, "filename": "pysforce-1.1.2.tar.gz", "has_sig": false, "md5_digest": "c5f8c4696595e5afe05b8475b45a60fc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8160, "upload_time": "2019-06-20T17:56:36", "url": "https://files.pythonhosted.org/packages/fc/23/ec536e565b8c97687792d3a6692e61927b6050abc6b774e80f7af9d7fd61/pysforce-1.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6ed9b0569cec63862f70b973d57df948", "sha256": "799143199640b04eaac69b855086b744ff0f7b6459cc7575ff965e4cdd4de297" }, "downloads": -1, "filename": "pysforce-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6ed9b0569cec63862f70b973d57df948", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20132, "upload_time": "2019-06-20T17:56:35", "url": "https://files.pythonhosted.org/packages/2a/2b/2dee1498eb2a54be323813cae0baf78ea34ab7704e9ac2bfcc2f4ceda20e/pysforce-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5f8c4696595e5afe05b8475b45a60fc", "sha256": "b5d5a4528f3b444cf5fafcbc7035996addeb74c3f1e780e6904c90339de1094c" }, "downloads": -1, "filename": "pysforce-1.1.2.tar.gz", "has_sig": false, "md5_digest": "c5f8c4696595e5afe05b8475b45a60fc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8160, "upload_time": "2019-06-20T17:56:36", "url": "https://files.pythonhosted.org/packages/fc/23/ec536e565b8c97687792d3a6692e61927b6050abc6b774e80f7af9d7fd61/pysforce-1.1.2.tar.gz" } ] }