Increment the package’s default Salesforce API version to 61.0 (Summer ’24).
Remove deprecation warning for basic authentication (password and security token) because many users have found that it’s still possible to use for programmatic (API-based) access even if their org requires users to log in via multi-factor authentication. (#128)
"%m-%d-%Y %H:%M"
and
"%d-%m-%Y %H:%M"
. (#127)Fix bug that caused Bulk 1.0 queries using the PKChunking option
to error out because the query info returned a vector of IDs instead of
one which was expected by the sf_batch_status_bulk()
function. (#124)
Explicitly specify the column name repair method for all
as_tibble()
and as_tibble_row()
function calls
because this could be causing issues when parsing and binding query
recordsets. (#124)
dplyr::across()
and add logic
to circumvent a new warning emitted by
readr::type_convert()
when no character columns are
presentsf_copy_dashboard
instead of sf_dashboard_copy
)Increase the package’s default Salesforce API version to 52.0 (Summer ’21).
Remove uses of {RForcecom} after it was archived on CRAN on 6/8/2021 (#101)
Remove LazyData option in DESCRIPTION since data()
is not utilized
Deprecate argument in sf_write_csv()
from
path
to file
as was done in {readr}
v1.4.0.
Deprecate argument bind_using_character_cols
because
we will always need to bind as character and then parse if
guess_types=TRUE
. Per comments in tidyverse/readr#588 and
tidyverse/readr#98, we must read all of the data as character first and
then use type_convert()
to ensure that we use all values in
the column to guess the type. The default for read_csv()
is
to only use the first 1,000 rows and its guess_max
argument
cannot be set to Inf
.
Change lifecycle status from “Maturing” to “Status” per the retirement of “Maturing” in the {lifecycle} package. The documentation notes:
Previously we used as maturing for functions that lay somewhere between experimental and stable. We stopped using this stage because, like questioning, it’s not clear what actionable information this stage delivers.
In addition, the lifecycle guidance states that experimental packages have version numbers less than 1.0.0 and may have major changes in its future. The {salesforcer} package has achieved a stable state with core functionality implemented and a focus on backwards compatibility due to the volume of users.
Improve documentation to retrieve the access token or session ID after authentication (#97)
Improve parsing of Bulk API query recordsets from CSV where all values in the column will be used to guess the type instead of the first 1000.
Generalize the date and datetime parsing mechanism, such that, reports with date and datetime fields are not returned as NA (#93)
Fix the format of the OwnerChangeOptions
header so
it is accepted (#94)
Fix bug that caused Bulk 2.0 calls to crash when the results had datetime fields in the recordset (#95)
rbindlist()
from {data.table} because of limitations of
dplyr::bind_rows()
. As noted in (tidyverse/dplyr#5429)
{dplyr} will only support binding data.frames or lists of data.frames,
not a list of lists which is needed in some
applications of the {salesforcer} package.: replacing previous import 'vctrs::data_frame' by 'tibble::data_frame' when loading 'dplyr' Warning
bind_rows()
with how it binds
lists where the list elements have differing lengths. This is documented
in tidyverse/dplyr#5417 and r-lib/vctrs#1073. The timeline for a fix is
unknown as of Aug 16, 2020. You can install the older version
of {dplyr} using the following command:::install_version("dplyr", "1.0.0") remotes
defaultLimit
argument in
sf_search()
to be able to restrict the number of records
from each individual object when searching across one or more
objects.sf_update_attachments()
function (#79).sf_download_attachment()
function returns the file path
of the downloaded content instead of a logical indicating success.errors
column as a list, which is coerced to
length 1 for the record (#66).sf_search()
that was passing
"true"/"false"
instead of actual boolean value for the
spellCorrection
parameter in the POST body.Add experimental support for the Reports and Dashboards REST API.
Add support for Bulk 2.0 queries that was added in Salesforce
version 47.0 (Winter ’20). CAUTION: The Bulk 2.0 API is now the
default API when using sf_query_bulk()
or
sf_run_bulk_query()
. Please test prior to
upgrading in a production environment where you are running bulk
queries.
Standardize the column order and format of query and CRUD operations that prioritizes the object type and Ids over other fields and finaly relationship fields. CAUTION: This will switch up the order of the columns returned by your existing code. Please test prior to upgrading in a production environment where column ordering is a breaking change. For example we prioritize the following fields in queries alphabetically within this prioritization waterfall:
sObject
field first (indicates the record’s object
if multiple objects returned in the results)Id
, id
,
sf__Id
)Success
,
success
, sf_Success
)Created
,
created
, sf__Created
)Error
,
error
, errors
, errors.statusCode
,
errors.fields
, errors.message
,
sf__Error
)Name
,
Phone
, etc.)Account.Id
, Owner.Name
, etc.Standardize the names of functions that submit long running jobs
to Salesforce. These functions now all start with sf_run_*
.
However, the original names have been aliased to the new names so this
version will acknowledge the old function names without deprecation
warning.For example, the new names are:
sf_query_bulk()
==>
sf_run_bulk_query()
sf_bulk_operation()
==>
sf_run_bulk_operation()
sf_run_report()
Add support for logging in with a proxy without having to use OAuth 2.0 as the authentication method. When proxy support was first implemented in {salesforcer} 0.1.4, it only supported proxy connections when logging in via OAuth 2.0. Now, this untested version of proxy support for basic authentication has been implemented. This means that proxy users should be able to login using just a username, password, and security token if their organization has not implemented OAuth 2.0 or if they do not want to use OAuth 2.0 while logging in via this package.
Add lifecycle badges to signal maturity of different package aspects.
Add two vignettes, one that outlines the query types supported by the package and another that outlines the new report functionality that was introduced in this release.
Add enhanced query test coverage in its own test script.
Remove dependency on {data.table} which does not have a build for
R-devel. This should only affect
sf_read_metadata()
.
Fix bug that prevented enabling PKChunking in Bulk 1.0 queries.
Users can now specify using TRUE/FALSE
or details like
chunkSize
that imply TRUE
. The results are
then parsed appropriately by waiting for all individual batches to
finish. (#46)
Fix bugs in REST and SOAP API queries to prevent infinite looping and mangling results of relationship queries, specifically parent-to-child nested queries. (#19, #35, #38, #54)
Fix bug in REST and SOAP APIs where the creation of a record that fails duplicate rules will return the duplicate match results as well and cause the entire function call to fail because it cannot parse the results. Now only the status code and message are returned and the function will execute successfully even if the record has not been created due to the rule.
Rebuilt package against R 4.0 (no issues observed with 3.6.3, 4.0.0, 4.0.1) (#53)
Upgrade to Salesforce version 48.0 (Spring ’20) from version 46.0 (Summer ’19)
Add support for connections through a proxy by setting in package options (#32)
CRUD operations now automatically cast date and datetime (Date,
POSIXct, POSIXlt, POSIXt) formats into an accepted string format
recognized by Salesforce
(YYYY-MM-DDThh:mm:ss.sssZ
).
Add batch_size
argument to support specifying custom
batch sizes for Bulk jobs
Add sf_convert_lead()
which takes leads and will
associate them to the corresponding Accounts, Contacts, and
Opportunities as directed in the input along with many other options to
send an email to the new owner, block the opportunity creation, and
more.
Add sf_create_attachment()
along with a vignette
that better describes how to interact with attachments and other blob
data.
Add Attachment and Metadata vignettes along with updated Bulk vignette.
Fix issue where REST query was not correctly passing and honoring the batch size control argument to paginate results
Fix issue in results of REST query pagination where the function
was looping infinitely because of a bug in the implementation that would
continue using the same next_records_url
that was
previously passed into the function (#54)
Fix issue where the results of Bulk 1.0 query batches where
returning fewer rows than expected because of using
content(..., as="text")
which truncated the results instead
of using content(..., type="text/csv")
(#54)
Fix issue where the details of an object’s picklist contains
NULLs (e.g. the validFor
entry of a picklist value is NULL)
so now it is replaced with NA and then can be bound together into a
data.frame (#27)
Fix issue where NA values in create, update, and upsert operations where setting the fields to blank in Bulk APIs, but not the SOAP or REST APIs. Now NA values in a record will set the field to blank across all APIs (#29)
Fix issue where supplying all NA values in the Id field for
certain operations would result in a cryptic error message
("BAD_REQUEST: Unsupported Tooling Sobject Type"
); the
affected operations are: delete, undelete, emptyRecycleBin, retrieve,
update, and findDuplicatesByIds
Upgrade to version 46.0 (Summer ’19) from version 45.0 (Spring ’19)
Add RForcecom backward compatible version of
rforcecom.getObjectDescription()
Add sf_describe_object_fields()
which is a tidier
version of rforcecom.getObjectDescription()
Allow users to control whether query results are kept as all character or the types are guessed (#12)
Add sf_get_all_jobs_bulk()
so that users can see
retrieve details for all bulk jobs (#13)
Add new utility functions sf_set_password()
and
sf_reset_password()
(#11)
Add two new functions to check for duplicates
(sf_find_duplicates()
,
sf_find_duplicates_by_id()
) (#4)
Add new function to download attachments to disk
(sf_download_attachment()
) (#20)
Add functionality to infer the object_name
argument,
required for bulk queries, if left blank.
Add control
argument to most all package functions
and dots (...
) which allows for more than a dozen different
control parameters listed in sf_control()
to be fed into
existing function calls to tweak the default behavior. For example, if
you would like to override duplicate rules then you can adjust the
DuplicateRuleHeader
. If you would like to have certain
assignment rule run on newly created records, then pass in the
AssignmentRuleHeader
(#4, #5)
Add new function sf_undelete()
which will take
records out of the Recycle Bin
Add new function sf_empty_recycle_bin()
which will
remove records permanently from the Recycle Bin
Add new function sf_merge()
which combines up to 3
records of the same type into 1 record (#22)
Fix bug where Username/Password authenticated sessions where not working with api_type = “Bulk 1.0”
Fix bug where Bulk 1.0 queries that timeout hit an error while trying to abort since that only supported aborting Bulk 2.0 jobs (#13)
Fix bug that had only production environment logins possible because of hard coding (@weckstm, #18)
Enhance sf_describe_object_fields()
to be robust
against nested list elements and also return picklist labels and their
values as a tibble (#16)
Fix bug where four of the bulk operation options
(content_type
, concurrency_mode
,
line_ending
, and column_delimiter
) where not
being passed down from the top level generic functions like
sf_create()
, sf_update()
, etc. However,
line_ending
has now been moved into the
sf_control
function so it is no longer explicitly listed
for bulk operations as an argument. (@mitch-niche, #23)
Ensure that for SOAP, REST, and Bulk 2.0 APIs the verbose argument prints out the XML or JSON along with the URL of the call so it can be replicated via cURL or some other programming language (#8)
Add support for Bulk 1.0 operations of “create”, “update”, “upsert”, “delete” and “hardDelete”
Bulk 2.0 operations, by default, now return a single
tbl_df
containing all of the successful records, error
records, and unprocessed records
Create internal functions that explicitly call each API for an
operation. For example, sf_create()
routes into
sf_create_soap()
, sf_create_rest()
, and
sf_bulk_operation()
.
Add sf_search()
with REST and SOAP API support for
SOSL and free text search
Add sf_describe_objects()
with REST and SOAP API to
return object metadata
Add REST API support for upsert
(sf_upsert()
)
Add SOAP API support for the following operations:
sf_create()
sf_update()
sf_delete()
sf_retrieve()
Add Metadata API support for the following operations:
sf_create_metadata()
sf_read_metadata()
sf_update_metadata()
sf_upsert_metadata()
sf_delete_metadata()
sf_describe_metadata()
sf_list_metadata()
sf_rename_metadata()
sf_retrieve_metdata()
sf_deploy_metdata()
Update the default file name for a cached token to
.httr-oauth-salesforcer
so that it does not clash with
other package token names.
sf_user_info()
returning
argument is of length zero
because token is not
automatically refreshed before calling GET.
sf_token()
ignoring basic authorized sessions since
it was only looking for a token using token_avaiable()
.
Replace with sf_auth_check()
so now it considers a session
or a token to be “available” (#1).
OAuth 2.0 and Basic authentication methods
(sf_auth()
)
Query operations via REST and Bulk APIs
(sf_query()
)
CRUD operations (Create, Retrieve, Update, Delete) for REST and Bulk APIs:
sf_create()
sf_retrieve()
sf_update()
sf_upsert()
sf_delete()
Backwards compatible versions of RForcecom package functions:
rforcecom.login()
rforcecom.getServerTimestamp()
rforcecom.query()
rforcecom.bulkQuery()
rforcecom.create()
rforcecom.update()
rforcecom.upsert()
rforcecom.delete()
Basic utility calls:
sf_user_info()
sf_server_timestamp()
sf_list_rest_api_versions()
sf_list_resources()
sf_list_api_limits()
sf_list_objects()