Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Suggestion: Add 'iter_all' as iterator version of 'get_all'

Abierto
#124 0 comentarios 3 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
38/100
Tipo de issue
Nueva funcionalidad
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
python
Área
api

Línea de trabajo

Comienza con la implementación existente de fetch_all en hubspot/utils/objects.py y revisa los puntos de entrada get_all y do_search descritos en el issue. Se considera terminado cuando el cliente proporciona un iterador integrado que gestiona las distintas formas de los argumentos de paginación y funciona con las API de objetos y asociaciones indicadas.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

get_all reads all objects in memory before return. In most scenarios, an iterator can be a better fit.

My bypass solution:
This is based on fetch_all

PAGE_MAX_SIZE = 100
def iter_all(get_page_api_client, **kwargs):
    after = kwargs.pop('after', None)

    while True:
        page = get_page_api_client.get_page(after=after, limit=PAGE_MAX_SIZE, **kwargs)
        yield from page.results
        if page.paging is None:
            break
        after = page.paging.next.after

It can be used like this

from itertools import islice
list(islice(iter_all(hs_client.crm.companies.basic_api, properties=['custom_field_1']), 2))

It can also be monkeypatched into suitable objects

import hubspot

def patch_iter_all():
    def iter_all_for_crm(self, **kw):
        yield from iter_all(self.basic_api, **kw)
    hubspot.discovery.crm.tickets.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.products.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.quotes.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.contacts.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.deals.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.line_items.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.owners.discovery.Discovery.iter_all = iter_all_for_crm
    hubspot.discovery.crm.companies.discovery.Discovery.iter_all = iter_all_for_crm
patch_iter_all()

Then the above example can simpler

list(islice(hs_client.crm.companies.iter_all(properties=['custom_field_1']), 2))

It would be nice if hubspot official api can have a 'iter_all' for every object that has 'get_all' function simply forward to fetch_all.


Just found there is another kind of 'get_all()' that returns forward paging object, like hs_client.crm.companies.associations_api.get_all() (where hs_client is the client object).
To iterate all items, it would be nice to have a common tool like this

def iter_from(f, **kwargs):
    after = None
    while True:
        page = f(after=after, limit=100, **kwargs)
        yield from page.results
        if page.paging is None:
            break
        after = page.paging.next.after

Then it can be used as following

for item in iter_from(hs_client.crm.companies.associations_api.get_all, company_id='1234567', to_object_type='contact'):
    # item is hubspot.crm.companies.models.associated_id.AssociatedId object
    ....

Edit: for functions like hs_client.crm.contacts.search_api.do_search the after and limit params are included in *Request object like PublicObjectSearchRequest.
Functions like hs_client.crm.companies.associations_api.get_all() have after and limit in function argument.

It would be nice if hubspot client can have a built-in pagination iterator.

Lenguaje dominante
Python
Estrellas
434
Forks
126
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de HubSpot/hubspot-api-python

Todos los issues de HubSpot/hubspot-api-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.