Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

24 changes: 23 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,29 @@ by Aaron Caffrey, Colin Cheevers, Jose Garcia, Tania Prince

A Salesforce.com [Open Source contribution](https://opensource.salesforce.com/).

SalesforcePy is an absurdly simple package for making Salesforce Rest API calls. We created this package so you can:
SalesforcePy is an absurdly simple package for making Salesforce Rest API calls.

## Installation

### With [uv](https://docs.astral.sh/uv/) (recommended)

```bash
uv add salesforcepy
```

**From GitHub (latest):**

```bash
uv add git+https://github.com/forcedotcom/SalesforcePy.git
```

### With pip

```bash
pip install salesforcepy
# or from GitHub
pip install git+https://github.com/forcedotcom/SalesforcePy.git
``` We created this package so you can:

+ Have a Salesforce client that is reusable, minimalistic, and pythonic
+ Use interfaces that are closely knit to the Salesforce Rest API service specification
Expand Down
2 changes: 1 addition & 1 deletion docs/contribute.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@ Git Workflow

1. Fork this repo.
2. Run ``git clone -b <yourbranch> <yourfork>``.
3. From within the project root directory run pip install.
3. From within the project root directory run ``uv sync`` (or ``pip install -e .``).
4. Develop!
5. Cover your code in ``/tests``.
6. Create a pull request to the ``forcedotcom:developer branch``.
Expand Down
4 changes: 2 additions & 2 deletions docs/faq.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ Yes. Here's an example of how to do it, and what to expect.
.. code-block:: python

import logging
import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand All@@ -47,7 +47,7 @@ Yes. Here's an example of how to do it.

.. code-block:: python

import SalesforcePy as sfdc
import salesforcepy as sfdc

username = "jsoap@universalcontainers.com"
password = "p@ssword1"
Expand Down
6 changes: 3 additions & 3 deletions docs/get_started.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ From Local Source
^^^^^^^^^^^^^^^^^
1. Download and extract, or clone this repo.
2. cd into the ``/SalesforcePy`` directory.
3. Run ``pip install .``.
3. Run ``uv sync`` (or ``pip install -e .``).

Create a Client and Log In
--------------------------
Expand All@@ -30,8 +30,8 @@ Getting started with SalesforcePy is a three-step process:

.. code-block:: python

#Import SalesforcePy
import SalesforcePy as sfdc
#Import salesforcepy
import salesforcepy as sfdc

# Create an instance of a Salesforce client. Replace the credentials here with valid ones.
client = sfdc.client(
Expand Down
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
[build-system]
requires = ["uv_build>=0.11.8,<0.12"]
build-backend = "uv_build"

[project]
name = "salesforcepy"
version = "2.2.0"
description = "An absurdly simple package for making Salesforce REST API calls"
authors = [
{name = "Aaron Caffrey", email = "acaffrey@salesforce.com"},
{name = "Jose Garcia Ponce", email = "jgarciaponce@salesforce.com"},
{name = "Colin Cheevers", email = "ccheevers@salesforce.com"},
{name = "Tania Prince", email = "tania.prince@salesforce.com"},
]
license = {text = "BSD-3-Clause"}
readme = "README.md"
requires-python = ">=3.11,<4.0"
keywords = ["salesforce", "rest", "api", "sfdc"]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"requests>=2.20.0,<3",
]

[project.urls]
repository = "https://github.com/forcedotcom/SalesforcePy"
homepage = "https://github.com/forcedotcom/SalesforcePy"

[dependency-groups]
dev = [
"responses>=0.22.0",
"coverage>=7.3",
"pytest>=7.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src", "tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

1 change: 0 additions & 1 deletion requirements.txt

This file was deleted.

2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.

40 changes: 0 additions & 40 deletions setup.py

This file was deleted.

4 changes: 2 additions & 2 deletions SalesforcePy/__init__.py → src/salesforcepy/__init__.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
from __future__ import absolute_import
# Local library imports
from . import sfdc

name = 'SalesforcePy'
name = 'salesforcepy'
client = sfdc.client

LoginException = sfdc.LoginException
3 changes: 1 addition & 2 deletions SalesforcePy/chatter.py → src/salesforcepy/chatter.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,7 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Local library imports
from . import commons

FEED_COMMENT_SERVICE = '/services/data/v%s/chatter/feed-elements/%s/capabilities/comments/items'
Expand Down
13 changes: 7 additions & 6 deletions SalesforcePy/commons.py → src/salesforcepy/commons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,14 +6,15 @@
.. versionadded:: 1.0.0

"""
from __future__ import absolute_import

# Built-in imports
import collections
import logging
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse

# Third-party imports
import requests

DEFAULT_API_VERSION = '37.0'


Expand DownExpand Up@@ -271,7 +272,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -307,7 +308,7 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
return
finally:
return response
Expand DownExpand Up@@ -369,6 +370,6 @@ def request(self):
except Exception as e:
self.exceptions.append(e)
logger.error('%s %s %s' % (self.http_method, service, self.status))
logger.error(e.message)
logger.error(str(e))
finally:
return response
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
# Local library imports
from .commons import OAuthRequest


Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import llm

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons
from . import embeddings
from . import prompt
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

EMBEDDINGS_SERVICE = "/services/data/v%s/einstein/llm/embeddings"
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,7 @@

.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>
"""
from __future__ import absolute_import

# Local library imports
from .. import commons

GENERATIONS_SERVICE = "/services/data/v%s/einstein/llm/prompt/generations"
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/jobs.py → src/salesforcepy/jobs.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
.. moduleauthor:: Aaron Caffrey <acaffrey@salesforce.com>

"""
from __future__ import absolute_import
# Local library imports
from . import commons

BATCHES_URI = '/services/data/v%s/jobs/ingest/%s/batches'
Expand Down
26 changes: 12 additions & 14 deletions SalesforcePy/sfdc.py → src/salesforcepy/sfdc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,26 +6,24 @@
Colin Cheevers <ccheevers@salesforce.com>, Tania Prince <tania.prince@salesforce.com>

"""
from __future__ import absolute_import
# Built-in imports
import json
import logging
import re
import time
from urllib.parse import urlencode

# Third-party imports
import requests

# Local library imports
from . import chatter
from . import commons
from . import device_flow
from . import einstein
from . import jobs
from . import wave

import json
import logging
import re
import requests
import time

try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode

DEFAULT_API_VERSION = commons.DEFAULT_API_VERSION
SOBJ_SERVICE = '/services/data/v%s/sobjects%s'
REVOKE_SERVICE = '/services/oauth2/revoke'
Expand DownExpand Up@@ -97,7 +95,7 @@ def __init__(self, *args, **kwargs):
- `*login_url` (`string`) - Salesforce login URL.
- `*client_id` (`string`) - Salesforce client ID.
- `*client_secret` (`string`) - Salesforce client secret.
- `\**kwargs` - kwargs (see below)
- `**kwargs` - kwargs (see below)

:Keyword Arguments:
* *protocol* (`string`) --
Expand DownExpand Up@@ -1142,7 +1140,7 @@ def client(username, password, client_id=None, client_secret=None, **kwargs):
Salesforce client ID.
`*client_secret` (`string`)
Salesforce client secret.
`\**kwargs`
`**kwargs`
kwargs (see below)

:Keyword Arguments:
Expand Down
2 changes: 1 addition & 1 deletion SalesforcePy/wave.py → src/salesforcepy/wave.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@

"""

from __future__ import absolute_import
# Local library imports
from . import commons


Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_version.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import testutil
import responses
import SalesforcePy.sfdc as sfdc
import salesforcepy.sfdc as sfdc


@responses.activate
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import pytest
import responses

import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil


Expand Down
2 changes: 1 addition & 1 deletion tests/test_login.py
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import SalesforcePy as sfdc
import salesforcepy as sfdc
import testutil
import responses
import logging
Expand Down
Loading