Code Monkey home page Code Monkey logo

falconpy's Introduction

CrowdStrike FalconPy

CrowdStrike Subreddit

FalconPy - The CrowdStrike Falcon SDK for Python

Package Status PyPI Release date Repo status Commit activity GitHub forks

The FalconPy SDK contains a collection of Python classes that abstract CrowdStrike Falcon OAuth2 API interaction, removing duplicative code and allowing developers to focus on just the logic of their solution requirements.

Overview ๐Ÿ”Ž

There are many CrowdStrike Falcon API service collections collectively containing hundreds of individual operations, all of which are accessible to your project via FalconPy.

The CrowdStrike Falcon SDK for Python completely abstracts token management, while also supporting interaction with all CrowdStrike regions, custom connection and response timeouts, routing requests through a list of proxies, disabling SSL verification, and custom header configuration.

If the CrowdStrike APIs were rings of great power, that the Dark Lord Sauron gifted to the kings of dwarves, elves and men, then CrowdStrike's FalconPy would be the One Ring.

"One SDK to rule them all, One SDK to find them, One SDK to bring them all and in the darkness bind them."

Downloads Development Installs

Supported versions of Python

The CrowdStrike Falcon SDK for Python was developed for Python 3. Current versions of FalconPy provide support for Python versions 3.7 - 3.12. Every commit to the FalconPy code base is unit tested for functionality using all versions of Python the library currently supports.

Note

Developers working with Python version 3.6 will need to leverage versions of FalconPy less than 1.4.0.

PyPI - Implementation PyPI - Wheel PyPI - Python Version

Supported Operating Systems

The FalconPy SDK is unit tested on the following operating systems.

macOS Ubuntu Windows

FalconPy will also run on any of the following operating systems.

Amazon Linux CentOS Fedora RedHat Arch

Debian Kali Pop! OS SUSE openSUSE

Details regarding supported operating systems and Python versions, and project security and testing procedures can be found here.

Components

The FalconPy SDK provides two distinct methods for interacting with CrowdStrike's API.

Service Classes The Uber Class

Service Classes
The Uber Class
Each Service Class represents a single CrowdStrike API service collection providing an interface to the operations available within that service collection. An all-in-one class that provides a singular interface for all operations in every CrowdStrike API service collection.

Service Classes

Representing a single CrowdStrike Falcon API service collection, each Service Class has a method defined for every operation available within that service collection.

Available Service Classes

For each CrowdStrike Falcon API service collection, a matching Service Class is available in the FalconPy library. For a complete list of service collections and their related Service Class, please review the Operations by Collection page on falconpy.io.

Service Class benefits

  • Closely follows Python and OpenAPI best practice for code style and syntax. PEP-8 compliant.
  • Completely abstracts token management, automatically refreshing your token when it expires.
  • Interact with newly released API operations not yet available in the library via the override method.
  • Provides simple programmatic patterns for interacting with CrowdStrike Falcon APIs.
  • Supports cloud region autodiscovery for the CrowdStrike US-1, US-2 and EU-1 regions.
  • Supports dynamic configuration based upon the needs of your environment.
  • Supports CrowdStrike Falcon API parameter abstraction functionality.
  • Supports CrowdStrike Falcon API body payload abstraction functionality.

The Uber Class

Operating as a single harness for interacting with the entire CrowdStrike Falcon API, the Uber Class can access every available operation within every API service collection.

Uber Class benefits

  • Access every CrowdStrike Falcon API service collection with only one import and only one class.
  • Completely abstracts token management, automatically refreshing your token when it expires.
  • Interact with newly released API operations not yet available in the library via the override keyword.
  • Provides simple programmatic patterns for interacting with CrowdStrike Falcon APIs.
  • Supports cloud region autodiscovery for the CrowdStrike US-1, US-2 and EU-1 regions.
  • Supports CrowdStrike Falcon API parameter abstraction functionality.
  • Supports all environment configuration options supported by FalconPy Service Classes.

Comparing FalconPy class types

While the usage syntax varies slightly, the Uber Class provides the same performance and output as FalconPy Service Classes, and can perform all of the same operations. The Uber Class does not support body payload abstraction.

CrowdStrike Divider

Quick Start ๐Ÿ’ซ

Stable releases of FalconPy are available on the Python Package Index. In a terminal, execute the following command:

python3 -m pip install crowdstrike-falconpy

Once installed, you can immediately begin using CrowdStrike functionality in your Python projects.

"""CrowdStrike FalconPy Quick Start."""
import os
from falconpy import Hosts

# Use the API Clients and Keys page within your Falcon console to generate credentials.
# You will need to assign the Hosts: READ scope to your client to run this example.

# CrowdStrike does not recommend you hardcode credentials within source code.
# Instead, provide these values as variables that are retrieved from the environment,
# read from an encrypted file or secrets store, provided at runtime, etc.
# This example retrieves credentials from the environment as the variables
# "FALCON_CLIENT_ID" and "FALCON_CLIENT_SECRET".

hosts = Hosts(client_id=os.getenv("FALCON_CLIENT_ID"),
              client_secret=os.getenv("FALCON_CLIENT_SECRET")
              )

SEARCH_FILTER = "hostname-search-string"

# Retrieve a list of hosts that have a hostname that matches our search filter
hosts_search_result = hosts.query_devices_by_filter(filter=f"hostname:*'*{SEARCH_FILTER}*'")

# Confirm we received a success response back from the CrowdStrike API
if hosts_search_result["status_code"] == 200:
    hosts_found = hosts_search_result["body"]["resources"]
    # Confirm our search produced results
    if hosts_found:
        # Retrieve the details for all matches
        hosts_detail = hosts.get_device_details(ids=hosts_found)["body"]["resources"]
        for detail in hosts_detail:
            # Display the AID and hostname for this match
            aid = detail["device_id"]
            hostname = detail["hostname"]
            print(f"{hostname} ({aid})")
    else:
        print("No hosts found matching that hostname within your Falcon tenant.")
else:
    # Retrieve the details of the error response
    error_detail = hosts_search_result["body"]["errors"]
    for error in error_detail:
        # Display the API error detail
        error_code = error["code"]
        error_message = error["message"]
        print(f"[Error {error_code}] {error_message}")

More samples

If you are interested in reviewing more examples of FalconPy usage, this repository also maintains a collection of samples to help get you started with integrating CrowdStrike Falcon into your DevOps processes.

Documentation and Support ๐Ÿ“–

FalconPy is a community-driven, open source project designed to assist developers in leveraging the power of CrowdStrike APIs within their solutions. While not a formal CrowdStrike product, FalconPy is maintained by CrowdStrike and supported in partnership with the open source developer community.

Official Project Documentation: falconpy.io

Website Documentation Version

Extended documentation is also available via the wiki for this repository.

Issues and Questions

Is something going wrong? ๐Ÿ”ฅ

GitHub Issues are used to report bugs and errors.

Report Issue

Have a question you can't find answered in the documentation?

Please submit usage questions to the Q&A section of our discussion board.

Discussions

Community forums

The discussion board for this repository also provides the community with means to communicate regarding enhancements ideas, integration examples and new releases.

Discussions

More information regarding FalconPy documentation and support can be found here.

Contribute to FalconPy โ˜•

Interested in being acknowledged as a member of an elite community of security-focused Python developers that stop breaches?

There are many ways you can contribute to the FalconPy project!

  • Providing feedback by opening a GitHub ticket. Even a fly-by "hey, this worked..." is appreciated and helps validate approaches. Ideas on improving the project are most welcome.
  • Documenting, blogging, or creating videos, of how you've used FalconPy. This type of content is invaluable and helps our community grow. Post these in the Show and Tell category of our discussion board.
  • Submit a sample demonstrating how you're using FalconPy by opening a pull request for inclusion in the Samples Library.
  • Fix a bug or implement a new feature. Check out our open issues on GitHub or our discussion board for inspiration.
  • Review pull requests by going through the queue of open pull requests on GitHub and giving feedback to the authors.

To get started, review the Code of Conduct for community guidelines, and the contribution guide for more detail regarding contributing to the CrowdStrike FalconPy project.



WE STOP BREACHES

falconpy's People

Contributors

aneisch avatar areino avatar carlosmmatos avatar chrisb947 avatar christopherhammond13 avatar commonvulnerability avatar davidt99 avatar dependabot[bot] avatar don-swanson-adobe avatar edgesync avatar falcon-pioupiou avatar ffalor avatar hod-alpert avatar isimluk avatar jlangdev avatar jmillerca avatar jshcodes avatar kra-ts avatar massyn avatar mccbryan3 avatar micgoetz avatar mrxinu avatar mwilco03 avatar rusnyder avatar shawndwells avatar snyk-bot avatar soggysec avatar trueblood506 avatar woodtechie1428 avatar wozboz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

falconpy's Issues

Cannot retrieve all the records using QueryDevicesByFilter()

Discussed in #240

Originally posted by tputti2 August 4, 2021
Hi, I am trying to pull the device types using QueryDevicesbyFilter(), I can see that the total number of records is 11,100 but I am unable to pull more than 10,000 records

Code that prints the total number of records:
image

I am able to retrieve records from 0 to 10,000. I have to do 2 queries with each pulling 5000 records because I can only pull 5000 IDs in one call i.e. max value of 'limit' is 5000

image

image

I am unable to extract more than 10,000 records though I know the total number of records is greater than 10,000. Following is the code that gives an error. Can someone tell why this is happening? Thanks.

image

[ BUG ] IOCS entities_processes URI is incorrect

Describe the bug
When running the "entities_process" function out of the IOCS library, the response is also "500, Bad Request"

To Reproduce
Run the entities_process search for any process id.

Expected behavior
Return information on the processes, per the API documentation

Environment (please complete the following information):

  • OS: PopOS 21.04
  • Python: 3.9.5
  • Falconpy: 0.5.2

Additional context
In src/falconpy/_endpoint/_iocs.py the uri is set to "/processes/entities/processes/v1?ids={}", but the code never fills in the URI with ids and the response from the falcon is "bad request". Updating the URI to ""/processes/entities/processes/v1" allows the calls to complete successfully. I don't have time to submit a pull request for the simple fix at this moment, so if someone else wants to go for it, other wise I'll try to get to it later today.

Question - Using Proxies

Hi team,

I am not able to find anything in the documentation which details assigning a proxy for PyFalcon functionality.

Is there some way to assign a proxy, or do we need to use some other method?

def falcon_auth(self):
    authorization = FalconAuth.OAuth2(creds={
        "client_id": self.client_id,
        "client_secret": self.client_secret,
        },
        base_url=self.base_url)
        self.token = authorization.token()['"body"]["access_token"]

[ BUG ] Legacy authentication does not support timeout handling

Describe the bug
When using legacy authentication, you are unable to specify a timeout value for calls to the request library.

To Reproduce
Use legacy authentication and create an instance of the OAuth2 class, when doing so, try and specify a timeout value.

Expected behavior
Timeout value is accepted and leveraged for calls to the request library.

Environment (please complete the following information):

  • OS: All supported
  • Python: All support
  • FalconPy: <=0.5.4

500 error when trying to save a file using GetSampleV3

Describe the bug
The following error is generated when trying to call GetSampleV3 to save a file.

{ 
   "status_code": 500, 
   "headers": {}, 
   "body": "Expecting value: line 1 column 1 (char 0)"
}

To Reproduce

from falconpy import api_complete as FalconSDK

falcon = FalconSDK.APIHarness(creds={
        "client_id": falcon_client_id,
        "client_secret": falcon_client_secret
    }
)

falcon.authenticate()

FILENAME="testfile.jpg"
PAYLOAD = open(FILENAME, 'rb').read()
response = falcon.command('UploadSampleV3', file_name="newfile.jpg", data=PAYLOAD, content_type="application/octet-stream")
print(response)

Expected behavior
When the API returns content that does not match the application/json content type, return the content as opposed to the json result.

Environment (please complete the following information):

  • OS: All
  • Python: 3.6 - 3.9
  • FalconPy: 0.1.10

[BUG] Service classes do not accept the ids parameter

Describe the bug
Service class methods have not been coded to accept the ids parameter.

To Reproduce
Call any method that makes use of the ids parameter. A 500 will be generated.

Expected behavior
The ids parameter is accepted by the method and results are returned.

Environment (please complete the following information):

  • OS: All
  • Python >= 3.5
  • FalconPy: <=0.1.11

Cannot pass parameters to indicator_create_v1 in new IOC Service Class

Discussed in #180

Originally posted by Qbert777 June 28, 2021
When calling 'falcon.indicator_create_v1' there seems to only be a position for body:
i.e. response = falcon.indicator_create_v1(body=BODY)

Are there any way to pass params such as:
params = (
('retrodetections',"false"),
('ignore_warnings',"true")
)
falcon.indicator_create_v1(body=BODY, params=params)

P.S. - Obviously I tried this and it didn't work. ;-)

Detail

Impacted Versions: 0.5.0
Impacted Python Versions: All supported (3.6 - 3.9)
Impacted OS: All supported

can not execute commands on endpoint

Describe the bug
unable to execute command
syntax error using command_string param
RTR-ExecuteActiveResponderCommand

To Reproduce

from falconpy import api_complete as FalconSDK falcon = FalconSDK.APIHarness(creds={
      'client_id': falcon_client_id_here,
      'client_secret': falcon_client_secret_here
   }
)
BODY = {
    'device_id': <device_id>
}
try:
    falcon.authenticate()
except:
    print("failed to authenticate")
session = falcon.command(action='RTR-InitSession',body=BODY)
sessionid = session["body"]["resources"][0]["session_id"]
Body = {
    "base_command": "runscript",
    "command_string": "runscript 'gci /'",
    "session_id": sessionid
}
response = falcon.command('RTR-ExecuteActiveResponderCommand', body=Body) 
print(json.dumps(response, indent=4)) 

produces a 400 error either for flag, or unrecognized command.

Expected behavior
Expectation would be command gets executed and 200 status code comes back

Environment (please complete the following information):

  • OS: windows
  • Python: 3.9

Additional context
open case with CS

[BUG] Service class methods that produce non-JSON output do not work

Describe the bug
When calling a service class method that is intended to produce non-JSON output, a 500 error is generated.

To Reproduce
Call FalconX_Sandbox.FalconX_Sandbox(access_token=token).GetArtifacts()

Expected behavior
When non-JSON content is produced, deliver the content using the correct content-type.

Environment (please complete the following information):

  • OS: All
  • Python: >= 3.5
  • FalconPy: <= 0.1.11

[ BUG ] Passing bad credentials to a Service Class when using Credential or Object authentication produces a KeyError

Describe the bug
If you try to use Credential or Object authentication with a Service Class and provide invalid credentials when doing so, a KeyError is generated for the key 'access_token'.

To Reproduce

from falconpy import cloud_connect_aws as FalconAWS
falcon = FalconAWS.Cloud_Connect_AWS(creds={"client_id":"BadID","client_secret":"BadSecret"})
result = QueryAWSAccounts()

Results in

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/falconpy/_service_class.py", line 60, in __init__
    self.headers = {'Authorization': 'Bearer {}'.format(auth_object.token()['body']['access_token'])}
KeyError: 'access_token'

Expected behavior
The object should instantiate successfully, then generate a HTTP 401 error (access denied, invalid bearer token) when a call to the API is made.

Environment (please complete the following information):

  • OS: Discovered using MacOS 10.15, assume impacts all operating systems
  • Python: Discovered using Python 3.9, assume impacts all versions
  • FalconPy: Affects versions 0.4.0 - 0.4.5

Additional context
Discovered while working on the multi-CID classes.

[Feature] Create table of contents for API docs

Describe the solution you'd like
Table of contents for API docs such as the page at https://github.com/CrowdStrike/falconpy/wiki/detects.

Additional context
Table of contents to reduce scrolling around. For example:


Table of contents


Or maybe this could be a table instead:

Table of Contents

API Function Description
GetAggregateDetects One-line summary
UpdatedDetectsByIdsV2 One-line summary
GetDetectSummaries One-line summary

[ ENH ] Please consider setting to `timeout` parameter in `requests.request` header

Describe the information
The following information can be found in the Reference.

Nearly all production code should use this parameter in nearly all requests. Failure to do so can cause your program to hang indefinitely:

Therefore, please consider implementing the timeout parameter setting within requests.request header.
This is a low priority and please decide by the development members about default value of the parameter.

References
https://2.python-requests.org/en/master/user/quickstart/#timeouts
https://2.python-requests.org/en/master/user/advanced/#timeouts

[ BUG ] PerformActionV2 action_name bug

Traceback (most recent call last):
File "quarantine_hosts.py", line 62, in
response = falcon.PerformActionV2(parameters=PARAMS, body=BODY)
TypeError: PerformActionV2() missing 1 required positional argument: 'action_name'

PerformActionV2 requires an action_name, although for quarnatining a host, for example, that action_name is provided inside of the PARAMS variable (JSON) as part of the post request.

[ BUG ] JSONDecode error on RTR_DeleteSession

Describe the bug
The RTR_DeleteSession operation returns no content on success, but headers and a 204 status code are returned. Update the perform_request method within _util.py to handle this scenario.

To Reproduce
Create a RTR session, then try and delete the session using Real_Time_Response.RTR_DeleteSession.

Expected behavior
A 204 status code is returned with an empty response. No error is generated.

Environment (please complete the following information):

  • OS: Mac OS 10.15
  • Python: 3.9
  • FalconPy: 0.5.5

[ ENH ] Auto push to PyPi on merged pull request

There are multiple GitHub Action plugins for PyPi. Let's chose one/setup something that:

  • For every merged PR, generates a TEST PyPi package
  • For every pushed release tag, generates an official PyPi package.

This way release engineering can be fully automated via GitOps.

@jshcodes will require API keys to PyPi. Have not used PyPi before -- is it better to create a bot account vs use personal keys? Looks like packages are static to specific users.... is that accurate? Can multiple people be added in PyPi to a package, akin to how multiple people can be added to a GitHub repo?

[ BUG ] Falconpy gives 401 while using bearer token after Oauth2 auth.

Describe the bug
Unable to use Falconpy after successful authentication and getting bearer token
To Reproduce
Step 1 successfully generates token

authorization = FalconAuth.OAuth2(creds={
     'client_id': falcon_client_id,
     'client_secret': falcon_client_secret
})
try:
     token = authorization.token()['body']['access_token']
except:
     token = False
print("\n\n\n Token ==> " + token)

Step 2:

if token:
    falcon = FalconDetects.Detects(access_token=token)

    PARAMS = {
        'offset': 5,
        'limit': 5,
        'sort': 'max_severity|asc',
        'filter': '*',
        'q': ''
    }

    response = falcon.QueryDetects(parameters=PARAMS)
    print(response)

This returns 401

{'status_code': 401, 'headers': {'Server': 'nginx', 'Date': 'Thu, 15 Apr 2021 13:39:10 GMT', 'Content-Type': 'application/json', 'Content-Length': '232', 'Connection': 'keep-alive', 'X-Content-Type-Options': 'nosniff', 'X-Ratelimit-Limit': '15', 'X-Ratelimit-Remaining': '14', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'}, 'body': {'meta': {'query_time': 1.27e-07, 'powered_by': 'crowdstrike-api-gateway', 'trace_id': '6b25ea5a-8389-4cdc-a20a-b2cb55b649d0'}, 'errors': [{'code': 401, 'message': 'access denied, invalid bearer token'}]}}

My API key has all read permission and write permission for Detection module. This thing works with CURL.
Expected behavior
It should be able to use same bearer token for all subsequent requests.
Environment (please complete the following information):

  • OS: Mac OS catalina
  • Python 3.7.0

[ BUG ] Event Streams service class generates 415 on call to refreshActiveStreamSession

Describe the bug
When calling refreshActiveStreamSession within the Events Streams service class, a HTTP status code 415 is generated. This appears to be due to a body payload not being present in the request. (Even though the body payload is empty in this use case.)

To Reproduce
Create an instance of the Events Streams service class, open a stream, and then try and refresh it.

Expected behavior
A 200 success status code with the stream token being refreshed.

Environment (please complete the following information):

  • OS: All supported
  • Python: All supported
  • FalconPy: <=0.5.6

Additional context
This issue DOES NOT impact the Uber class due to how the Uber class crafts body payloads.

A fix for this issue is being tested now, and is planned to be committed as part of v0.5.7 update

[ BUG ] Service Class credential authentication does not respect base_url or proxy settings.

Describe the bug
The base class of all service classes, _service_class.py does not respect values passed for the BASE_URL, PROXY or SSL_VERIFY attributes when creating an instance of the auth_object for credential authentication.

To Reproduce
Create an instance of any service class, and change it's base_url to US-2 or disable SSL verification with ssl_verify=False.

Expected behavior
The service class is instantiated with an auth_object that respects the passed attribute values.

Environment (please complete the following information):

  • OS: All supported
  • Python: All supported
  • FalconPy: <=0.5.5

[Feature] Add Support for member CID MSSP targeting

Is your feature request related to a problem? Please describe.

For customers with MSSP (Master/member) we need to support using master API credentials to lock the token to member CIDs/

Describe the solution you'd like

Alter the oauth2.py module to include a new key in the DATA dictionary for 'member_cid'
Alter uber class to send this in the body, can include in self.creds during instantiation

Describe alternatives you've considered
Don't think this is possible today as we can't override the DATA dictionary.

Additional context
image

Installation Problem

Describe the bug
During installation I am getting the below error.
"Could not find a version that satisfies the requirement crowdstrike-falconpy (from versions: )
No matching distribution found for crowdstrike-falconpy"

To Reproduce
pip install crowdstrike-falconpy

Expected behavior
Installation with out any issue.

Environment (please complete the following information):

  • OS: Ubuntu 18.04.5 LTS
  • Python: pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

Additional context
None

[ ENH ] Please consider sending `User-Agent` request header

Most of the time, User-Agent is that unnecessary thing that is just sitting there. One day, it may turn out to be extremely helpful in tracking down some operational issue.

Here is how we implemented User-Agent request header in gofalcon

This is fairly low priority, I admit.

[BUG] Service class default parameters

Describe the bug
Some service class methods are requiring parameters when they are not required. This most often happens with the parameters parameter.

To Reproduce
Call FalconHosts.Hosts(access_token=token).QueryHiddenDevices().

Expected behavior
If the API service endpoint does not require the parameter value, it should not be required by the method.

Environment (please complete the following information):

  • OS: All
  • Python >= 3.5
  • FalconPy <= 0.1.11

[ ENH ] Provide the ability to globally disable payload and parameter validation

Describe the bug
There is a bug in versions v.0.4.1 - 0.4.3 related to action_name parameters used within several Service Classes. This issue will be addressed in v0.4.4.

Please note: This issue only impacts Service Classes

To prevent issues like the above from impacting developers in the future, provide a boolean flag that is passed at class instantiation that globally disables payload validators for the class in question.

Expected behavior
I can submit an incorrect parameter name in a parameter payload, and the method will still execute.

Environment (please complete the following information):

  • OS: [e.g. Red Hat Enterprise Linux 8.3]
  • Python [e.g. 3.9]

Additional context
Add any other context about the problem here.

[ BUG ] ID list parsing issue with MSSP.getChildren

Description

When calling getChildren, and providing a properly formatted list or comma-delimited string for the ids argument, a 500 error is generated.

This is confirmed to not be generated via the API, and is coming from the Service Class call to requests.

This issue does not impact the Uber class.

See discussion post #143 for more detail.

To Reproduce

Create an instance of the MSSP service class, and then call getChildren passing either a list or a comma-delimited string for the ids argument.

Expected Behavior

Properly formatted API results matching what is produced when performing this operation via the Uber class.

Environment

  • OS: MacOS 10.15.7 (Assume all operating systems, all versions)
  • Python: 3.9+ (Assume 3.6+)
  • FalconPy: 0.4.6+

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.