python-rebase


Namepython-rebase JSON
Version 0.3.3 PyPI version JSON
download
home_page
SummaryPython implementation of the ReBase API
upload_time2024-02-23 15:47:38
maintainer
docs_urlNone
author
requires_python>=3.10
license
keywords database databases gesture tracking medical movement tracking
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python ReBase [0.3.3]
Este projeto é uma API escrita em Python para comunicação com o ReBase, um banco de dados de sessões de reabilitação física.

## Índice
- [Python ReBase \[0.3.3\]](#python-rebase-033)
  - [Índice](#índice)
  - [Visão Geral](#visão-geral)
    - [Sobre o ReBase](#sobre-o-rebase)
  - [Instalação](#instalação)
  - [Requisitos](#requisitos)
  - [Quick Start](#quick-start)
    - [Inicializando o ReBaseClient](#inicializando-o-rebaseclient)
    - [Criando um Movimento](#criando-um-movimento)
    - [Criando uma Sessão](#criando-uma-sessão)
    - [Buscando Movimentos e Sessões](#buscando-movimentos-e-sessões)
    - [Atualizando e deletando](#atualizando-e-deletando)
  - [Tópicos Avançados](#tópicos-avançados)
    - [Filtragem](#filtragem)
    - [Paginação](#paginação)
  - [Exemplos](#exemplos)
  - [Documentação Completa](#documentação-completa)
    - [ReBaseClient](#rebaseclient)
    - [Módulos](#módulos)
      - [util](#util)
    - [Modelos](#modelos)
      - [APIResponse](#apiresponse)
      - [Movement](#movement)
      - [Register](#register)
      - [Rotation](#rotation)
      - [Session](#session)
    - [Erros](#erros)
  - [Contato](#contato)

## Visão Geral
O pacote Python ReBase contém classes-modelo para Sessões e Movimentos. A classe `api_response` modela de forma generalizada as respostas enviadas pelo `ReBaseRS`. O módulo `rebase_client` é responsável pelo envio de requisições ao ReBaseRS. Estão inclusas também algumas exceções personalizadas e funções utilitárias. Todos os módulos se encontram na pasta `src/python_rebase`.

### Sobre o ReBase
O ReBase, do inglês *Rehabilitation Database*, é um baco de dados dedicado ao armazenamento de movimentos corporais, com foco em reabilitação neurofuncional e neuromotora. Apesar do enfoque, o ReBase é capaz de armazenar qualquer tipo de movimento corporal gravado por qualquer técnica de captura de movimentos, desde que siga o padrão definido. Para isto serve a API Python ReBase!

Os **Movimentos** do ReBase representam os movimentos corporais capturados e são compostos por metadados, uma lista de *Articulações* e uma lista de **Registros**, que representam as rotações em X, y e z da Articulação a cada instante do Movimento. Os Movimentos podem pertencer a **Sessões**. Cada Sessão também contem metadados e pode conter múltiplos movimentos.

Todos os usuários que desejarem acessar o ReBase precisam ter um token de autenticação cadastrados no sistema. Para receber um token, o usuário deve entrar em contato com o time de desenvolvimento através dos emails `mrtrotta2010@gmail.com` ou `diegocolombodias@gmail.com` e enviar o endereço de email que deseja cadastrar.

## Instalação
O Python ReBase pode ser instalado pelo terminal através do **PyPi** com os comandos:
```
pip3 install python-rebase
```
ou
```
python3 -m pip install python-rebase
```

## Requisitos
* Esta biblioteca depende da biblioteca `requests`, utilizada para enviar requisições HTTP;
* O Python ReBase está disponível apenas para Python 3.10 ou superior;
* É necessário ter seu email e token de autenticação já cadastrados no ReBase.

## Quick Start
Para utilizar a API, basta importar a biblioteca no começo do seu arquivo .py

### Inicializando o ReBaseClient
```Python
from python_rebase.rebase_client import ReBaseClient

# Inicialize o cliente do ReBase com seu email e token previamente cadastrados
rebase_client = ReBaseClient('exemplo@gmail.com', 'tokenExemplo')
```

### Criando um Movimento
```Python
from python_rebase.movement import Movement

# Crie um objeto Movement
movement = Movement({
    'label': 'MyMovement',
    'fps': 30, # Varia conforme sua aplicação
    'professionalId': 'Prof',
    'articulations': ['1', '2']
})

# Adicione os Registros ao Movimento
# Cada registro representa um "frame" do movimento
# Os registros contêm as rotações de cada articulação em um dado momento 
# Apesar de o Python ReBase incluir classes-modelo para os Registros e para Rotações, os métodos também aceitam dicionários e listas como parâmetros
movement.add_register(Register(
    {
        '1': Rotation(1.0, 1.0, 1.0), # Rotações da articulação "1"
        '2': [2.0, 2.0, 2.0] # Rotações da articulação "2"
    }
))

# Utilize o módulo rebase_client para inserir o movimento
response = rebase_client.insert_movement(movement)
print(f'Inserted: {response}')
```

### Criando uma Sessão
```Python
from python_rebase.session import Session

# Crie um objeto Sessão.
# A Sessão pode ser criada vazia ou com Movimentos, sejam eles da classe Movement ou dicionários simples
session = Session({
    'title': 'Teste de Sessão',
    'professionalId': 'Prof',
    'patientId': 'Pat',
    'movements': [
        # Da mesma forma, os Movimentos podem ser criados já com Registros
        Movement({
            'label': 'MyMovement',
            'fps': 30,
            'articulations': ['1', '2'],
            'registers': [
                Register({
                    '1': Rotation(1.0, 1.0, 1.0),
                    '2': Rotation(2.0, 2.0, 2.0)
                })
            ]
        }),
        {
            'label': 'MyMovement',
            'fps': 30,
            'articulations': ['1', '2'],
            'registers': [
                {
                    '1': [1.0, 1.0, 1.0],
                    '2': [2.0, 2.0, 2.0]
                }
            ]
        }
    ]
})

response = rebase_client.insert_session(session)
```

### Buscando Movimentos e Sessões
```Python
# É possível encontrar um único Movimento ou listar vários
response = rebase_client.find_movement(id)
print(f'Movimento: {response.movement}')

# A listagem permite filtros e suporta paginação
# Os filtros possíveis são: professional_id (id do profissional de saúde), patient_id (id do paciente),
# movement_label (identificação do movimento), articulations (articulações incluídas no movimento)
response = rebase_client.fetch_movements(professional_id='professional', patient_id='patient', page=1, per=10)
print(f'Movimentos: {response.movements}')

# Da mesma forma, as Sessões podem ser buscadas individualmente ou listadas
response = rebase_client.find_session(id)
print(f'Sessão: {response.session}')

# Os filtros suportados pela listagem de Sessão são: professional_id e patient_id.
# Também são aceitos os filtros movement_label e articulations, mas estes filtram os movimentos das Sessões
response = rebase_client.fetch_sessions(professional_id='professional', patient_id='patient', page=1, per=10)
print(f'Sessões: {response.sessions}')
```

### Atualizando e deletando
```Python
# São disponibilizados métodos para deletar e excluir Movimentos e Sessões
response = rebase_client.update_movement(updatedMovement)
response = rebase_client.delete_movement(id)

response = rebase_client.update_session(updatedSession)
response = rebase_client.delete_session(id)
```

## Tópicos Avançados
A seguir, serão abordados dois assuntos relevantes para as requisições de listagem: **filtragem** e **paginação**.

### Filtragem
As requisições de listagem do ReBase, de Movimentos ou de Sessões, suportam alguns filtros, listados e explicados a seguir.

Listagem de Movimentos:
* **professional_id:** recebe uma `string` que representa o ID do profissional de saúde responsável pelo Movimento;
* **patient_id:** recebe uma `string` que representa o ID do paciente que executou o Movimento;
* **movement_label:** recebe uma `string` que representa a propriedade `label` do Movimento;
* **articulations:** recebe uma lista de `strings` que representam as articulações trabalhadas no Movimento.

Listagem de Sessões:
* **professional_id:** recebe uma `string` que representa o ID do profissional de saúde responsável pela Sessão;
* **patient_id:** recebe uma `string` que representa o ID do paciente que avaliado durante a Sessão.

A listagem de Sessões pode recebe ainda dois filtros adicionais. Estes, no entanto, não filtrarão a lista de Sessões em si, mas sim as listas de Movimentos das Sessões. São eles:
* **movement_label:** recebe uma `string` que representa a propriedade `label` do Movimento;
* **articulations:** recebe uma lista de `strings` que representam as articulações trabalhadas no Movimento.

Estes filtros podem ser úteis em alguns casos específicos. Um exemplo de uso: listar as Sessões de um paciente específico, mas incluir apenas os Movimentos que trabalharam um grupo específico de articulações.

Vale notar, por fim, que todos os filtros são **aditivos**, ou seja, ao utilizar `n` múltiplos filtros, serão retornados os documentos que satisfaçam **todos** os filtros, ou seja, os documentos que satisfaçam o filtro 1 **E** o filtro 2 **E** ... **E** o filtro n. 

### Paginação
As requisições de listagem, tanto de Movimentos quanto de Sessões, também suportam paginação. Utilizando paginação, elimina-se a necessidade de carregar todos os items de uma listagem de uma só vez, o que pode significar um ganho de velocidade e desempenho para uma aplicação. O ReBaseRS suporta dois tipos de paginação: baseada em **per e page** e baseada em **IDs**.

O primeiro tipo utiliza dois parâmetros: `per`, que representa a quantidade de itens presentes em cada página, e `page`, que representa qual página deve ser carregada. Desta forma, supondo que quiséssemos carregar 10 elementos por página, para carregar a primeira página usaríamos `{ per: 10, page: 1 }` e receberíamos os primeiros 10 itens da lista. Para carregar a segunda página usaríamos `{ per: 10, page: 2 }` e receberíamos os 10 itens seguintes e assim por diante. Este método é simples de se utilizar e de se entender e permite o carregamento de qualquer página, porém possui uma desvantagem: para recuperar uma página `n`, é necessário recuperar todas as páginas anteriores, o que faz com que as requisições fiquem mais lentas conforme o número `n` da página cresce. Para mitigar este problema, é possível utilizar a paginação baseada em IDs.

A paginação baseada em IDs também depende de dois parâmetros: `per`, a quantidade de itens por página, e `previous_id`, o ID do último item da página anterior. Pela forma como o banco de dados do ReBase é modelado, as listas de Movimentos e de Sessões são ordenadas pelos IDs dos documentos, que são sequenciais. Ou seja, se quisermos recuperar os 10 itens seguintes a um item `i`, basta recuperar os primeiros 10 itens cujo ID seja maior do que o ID de `i`. Explorando essa característica, é possível implementar um método de paginação que permite que todas as páginas sejam recuperadas em tempos equivalentes. Desta forma, para recuperar a primeira página usaríamos `{ per: 10, previous_id: null }`, já que não existe uma página anterior. Supondo que o ID do último item da primeira página seja "ABC", para recuperar a segunda página usaríamos `{ per: 10, previous_id: "ABC" }`. Apesar de tudo, este método de paginação também tem uma desvantagem: para recuperar uma página específica, é necessário ter recuperado todas as páginas anteriores a ela, já que é preciso saber os IDs dos documentos que estão contidos nelas.

Assim, cabe ao desenvolvedor analisar sua aplicação e decidir qual método de paginação deverá ser utilizado (ou se a paginação é mesmo necessária). Aplicações que devem permitir a qualquer momento o acesso a qualquer página, deverão usar a paginação baseada em per e page. Por outro lado, para uma aplicação que precisa exibir uma lista com scroll infinito, por exemplo, na qual os itens são carregados sequencialmente, se beneficiará mais do método baseado em IDs. Para mais informações, [este artigo](https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3) pode ser útil. 

## Exemplos
Esta biblioteca inclui a pasta `examples`, que inclui alguns códigos-exemplo básicos de utilização da API.

## Documentação Completa
A seguir, estão incluídas tabelas e descrições detalhando todas as classes e módulos da API Python ReBase.

### ReBaseClient
Esta classe é responsável por toda a comunicação com o ReBaseRS. Seus métodos retornam objetos da classe [APIResponse](#apiresponse). Exemplos de uso podem ser encontrados na seção [Quick Start:](#quick-start). O ReBaseClient deve ser inicializado com o email e o token do usuários previamente cadastrados.

**Atributos:**
| Atributo       | Tipo    |
| :------------- | ------- |
| **user_email** | **str** |
| Email do usuário         |
| **user_token** | **str** |
| Token de autenticação do usuário |

**Métodos:**
| Método              | Retorno                         | Parâmetros                           |
| :------------------ | :------------------------------ | -----------------------------------: |
| **\_\_init\_\_**        | None                            | **user_email: str, user_token: str, try_authenticate: bool = False** |
| Método de inicialização da classe. Recebe o endereço de email e o token de acesso do usuário. É possível tentar autenticar o usuário no momento da inicialização, passando o argumento `try_authenticate=True`, porém, caso a autenticação falhe neste ponto, será lançado um erro `UnauthorizedUserError` |
| **authenticate**    | **[APIResponse](#apiresponse)** |                                      |
| Envia uma requisição de autenticação que não executa nenhum operação sobre o banco de dados. O envio desta requisição não é obrigatório, visto que todas as outras requisições também realizam autenticação |
| **fetch_movements** | **[APIResponse](#apiresponse)** | **professional_id: str = "", patient_id: str = "", movementLabel: str = "", articulations: list = None, legacy: bool = False, page: int = 0, per: int = 0, previous_id: str = ""** |
| Recupera uma lista de Movimentos armazenados no ReBaseRS. Suporta diversos filtros e paginação |
| **find_movement**   | **[APIResponse](#apiresponse)** | **id: str, legacy: bool = False**    |
| Recupera um Movimento específico a partir do ID. O parâmetro `legacy`, se `True`, retorna o Movimento no formato antigo do ReBase |
| **insert_movement**  | **[APIResponse](#apiresponse)** | **movement: [Movement](#movement)** |
| Insere um Movimento no ReBase                                                                |
| **update_movement**  | **[APIResponse](#apiresponse)** | **movement: [Movement](#movement)** |
| Atualiza um Movimento já existente no ReBase                                                 |
| **delete_movement** | **[APIResponse](#apiresponse)** | **id: str**                          |
| Exclui um Movimento do ReBase                                                                |
| **fetch_sessions**  | **[APIResponse](#apiresponse)** | **professional_id: str = "", patient_id: str = "", movement_label: str = "", articulations: list = None, legacy: bool = False, deep: bool = False, page: int = 0, per: int = 0, previous_id: str = ""** |
| Recupera uma lista de Sessões armazenadas no ReBaseRS. Suporta diversos filtros e paginação. O parâmetro `legacy`, se `True`, retorna as Sessões no formato antigo do ReBase. Caso o parâmetro `deep` seja `True`, retorna também os Movimentos das Sessões, caso contrário, retorna apenas os IDs dos Movimentos |
| **find_session**    | **[APIResponse](#apiresponse)** | **id: str, legacy: bool = False, deep: bool = False** |
| Recupera uma Sessão específica a partir do ID. O parâmetro `legacy`, se `True`, retorna a Sessão no formato antigo do ReBase. Caso o parâmetro `deep` seja `True`, retorna também os Movimentos da Sessão, caso contrário, retorna apenas os IDs dos Movimentos |
| **insert_session**  | **[APIResponse](#apiresponse)** | **session: [Session](#session)**     |
| Insere uma Sessão no ReBase                                                                  |
| **update_session**  | **[APIResponse](#apiresponse)** | **session: [Session](#session)**     |
| Atualiza uma Sessão já existente no ReBase                                                   |
| **delete_session**  | **[APIResponse](#apiresponse)** | **id: str, deep: bool = False**      |
| Exclui uma Sessão do ReBase. Caso o parâmetro `deep` seja `True`, deleta também seus Movimentos |

### Módulos

#### util
O módulo `util` contém diversos métodos utilitários. 

**Métodos:**
| Método                           | Retorno  | Parâmetros                       |
| :------------------------------- | :------- | -------------------------------: |
| **is_valid_str**                 | **bool** | **value: any**                   |
| Retorna `True` se `value` for uma string válida (uma instância da classe `str`). Caso contrário, retorna `False` |
| **is_valid_number**              | **bool** | **value: any**                   |
| Retorna `True` se `value` for um número válido (uma instância da classe `int` ou da classe `float`). Caso contrário, retorna `False` |
| **is_valid_id**                  | **bool** | **value: any**                   |
| Retorna `True` se `value` for considerado um id válido para o ReBase (uma string válida não vazia ou um inteiro maior que 0). Caso contrário, retorna `False` |
| **is_valid_movement_field**      | **bool** | **field: str, value: any**       |
| Retorna `True` se `field` for um campo válido para um Movimento do ReBase e se `value` for um valor válido para esse campo. Retorna `False` caso contrário |
| **is_valid_session_field**       | **bool** | **field: str, value: any**       |
| Retorna `True` se `field` for um campo válido para um Movimento do ReBase e se `value` for um valor válido para esse campo. Retorna `False` caso contrário |
| **exclude_keys_from_dict**       | **None** | **dictionary: dict, keys: list** |
| Remove uma dada lista de chaves de um dado dicionário                          |
| **validate_initialization_dict** | **None** | **validation_function: Callable[[str, any], bool], resource_name: str, field_rules: dict, dictionary: dict** |
| Valida um dicionário de inicialização `dictionary` com base nos campos definidos em `field_rules` utilizando a função de validação `validation_function`. Caso encontre algum campo inválido, lança um `ValueError` cuja mensagem contém o nome apropriado do recurso `resource_name` |

### Modelos

#### APIResponse
A classe APIResponse modela uma resposta generalizada do servidor ReBaseRS.

**Atributos:**
| Atributo          | Tipo                   |
| :---------------- | ---------------------: |
| **response_type** | **ResponseType(Enum)** |
| Tipo da requisição enviada. Valores possíveis: { 0: FetchMovements, 1: FindMovement, 3: InsertMovement, 4: UpdateMovement, 5: DeleteMovement, 6: FetchSessions, 7: FindSession, 8: InsertSession, 9: UpdateSession, 10: DeleteSession, 11: APIError } |
| **status**        | **int**                |
| Status da resposta. 0 representa sucesso e qualquer outro valor representa um erro |
| **code**          | **int**                |
| Código HTTP da resposta (E.g. 200, 201, 404, etc. ) |
| **success**       | **bool**               |
| Diz se a requisição foi bem sucedida ou não. Em outras palavras, diz se status == 0 |

**Métodos:**
| Método            | Retorno  | Parâmetros   |
| :---------------- | :------- | ------------ |
| **has_data**      | **bool** | **key: str** |
| Retorna `True` se o atributo `key` estiver presente nos dados da resposta e `False` caso contrário |
| **get_data**      | **bool** | **key: str** |
| Retorna o valor do atributo `key` nos dados da resposta. Os possíveis atributos são: 'message', 'HTMLError', 'error', 'warning', 'movements', 'movement', 'sessions', 'session', 'deletedId', 'deletedCount' |
| **has_meta_data** | **bool** | **key: str** |
| Retorna `True` se o atributo `key` estiver presente nos metadados da resposta e `False` caso contrário |
| **get_meta_data** | **bool** | **key: str** |
| Retorna o valor do atributo `key` nos metadados da resposta. Os possíveis atributos são: 'current_page', 'next_page', 'total_count', 'total_page_count' |

#### Movement
Modela um Movimento do ReBase.

**Atributos:**
| Atributo                | Tipo                        |
| :---------------------- | --------------------------: |
| **id**                  | **str**                     |
| ID do Movimento                                       |
| **label**               | **str**                     |
| Label, ou etiqueta, de identificação do Movimento. Normalmente representa uma categoria ou grupo de Movimentos |
| **description**         | **str**                     |
| Descrição do Movimento                                |
| **device**              | **str**                     |
| Dispositivo responsável pela captura do Movimento (E.g. Kinect, MediaPipe, etc.) |
| **fps**                 | **float**                   |
| Quantidade de quadros por segundo do Movimento        |
| **duration**            | **float**                   |
| Duração do Movimento                                  |
| **number_of_registers** | **int**                     |
| Quantidade de Registros presentes no Movimento (os Registros serão descritos a seguir) |
| **articulations**       | **list**                    |
| Articulações utilizadas pelo Movimento. As Articulações são identificadas por strings arbitrárias definidas pelo usuário da API. Cabe a cada desenvolvedor definir e seguir seu padrão. Desta maneira, o ReBase pode armazenar movimentos com um conjunto variável de Articulações |
| **insertion_date**      | **str**                     |
| Data de inserção do Movimento                         |
| **update_date**         | **str**                     |
| Data da última atualização do Movimento               |
| **session_id**          | **str**                     |
| ID da Sessão à qual o Movimento pertence              |
| **professional_id**     | **str**                     |
| Identificação do profissional da saúde responsável pela captura do Movimento |
| **app_code**            | **int**                     |
| Código da aplicação que gerou o Movimento. Um inteiro positivo, maior que zero, arbitrário definido pelos desenvolvedores da aplicação |
| **app_data**            | **str**                     |
| Dados arbitrários utilizados pela aplicação que gerou o Movimento. Pode ser utilizado pelos usuários da API para armazenar dados no formato que quiserem, como um json ou uma string |
| **patient_id**          | **str**                     |
| Identificação anônima do paciente que realizou o Movimento |
| **registers**           | **[[Register](#register)]** |
| Lista de Registros que representam o Movimento em si. Ao adicionar um registro a um Movimento, mesmo que ele seja um dicionário, será automaticamente convertido à classe [Register](#register) |

**Métodos:**
| Método                       | Retorno  | Parâmetros                          |
| :--------------------------- | :------- | ----------------------------------: |
| **add_register**             | **None** | **register: [Register](#register)** |
| Adiciona um novo Registro ao Movimento                                        |
| **to_dict**                  | **dict** | **exclude: list**                   |
| Converte o Movimento para um dicionário. Recebe uma lista de propriedades a serem ignoradas |
| **to_json**                  | **str**  | **update: bool = False**            |
| Converte o Movimento para json. O parâmetro update modifica o json gerado: para requisições de criação use update como `False` e para requisições de atualização use update como `True` |

#### Register
Modela um Registro do ReBase, essencialmente um quadro, ou um frame, de um Movimento. Um Registro contém as rotações nos eixos x, y e z de cada Articulação do Movimento em um determinado instante. A classe Register se comporta como um dicionário, ou seja, cada articulação deve ser acessada através do operador `[]` (ex: `register['articulation1'] = Rotation(1.0, 2.0, 3.0)`)

**Atributos:**
| Atributo               | Tipo              |
| :--------------------- | ----------------: |
| **articulation_count** | **int**           |
| A quantidade de Articulações presentes no Registro |
| **articulations**      | **readonly list** |
| A lista das Articulações presentes no Registro |
| **is_empty**           | **bool**          |
| Indica se o registro está vazio, ou seja, não contem nenhuma Articulação |

**Métodos:**
| Método              | Retorno  | Parâmetros |
| :------------------ | :------- | ---------- |
| **to_dict**         | **dict** |            |
| Converte o Registro em um dicionário        |

#### Rotation
Representa um conjunto de rotações de uma Articulação.

**Atributos:**
| Atributo | Tipo       |
| :------- | ---------: |
| **x**    | **number** |
| A rotação no eixo X   |
| **y**    | **number** |
| A rotação no eixo Y   |
| **z**    | **number** |
| A rotação no eixo Z   |

**Métodos:**
| Método        | Tipo     | Parâmetros |
| :------------ | :------- | ---------: |
| **to_list**   | **list** |            |
| Converte a Rotação para uma lista     |
| **to_tuple**  | **dict** |            |
| Converte a Rotação para uma tupla     |

#### Session
Modela uma Sessão do ReBase.

**Atributos:**
| Atributo                       | Tipo                       |
| :----------------------------- | -------------------------: |
| **id**                         | **str**                    |
| ID da Sessão                                                |
| **title**                      | **str**                    |
| Título da Sessão                                            |
| **description**                | **str**                    |
| Descrição da Sessão                                         |
| **professional_id**            | **str**                    |
| Identificação do profissional de saúde responsável pela captura da Sessão |
| **patient_session_number**     | **int**                     |
| Número da Sessão do paciente (Ex.: 1 para a primeira Sessão, 2 para a segunda, etc.) |
| **insertion_date**             | **str**                     |
| Data de criação da Sessão                                    |
| **update_date**                | **str**                     |
| Data de atualização da Sessão                                |
| **patient_id**                 | **str**                     |
| Identificação anônima do paciente que realizou a Sessão      |
| **patient_age**                | **int**                     |
| Idade do paciente                                            |
| **patient_height**             | **float**                   |
| Altura do paciente                                           |
| **patient_weight**             | **float**                   |
| Peso do paciente                                             |
| **main_complaint**             | **str**                     |
| Queixa principal do paciente                                 |
| **history_of_current_disease** | **str**                     |
| Histórico da condição atual do paciente                      |
| **history_of_past_disease**    | **str**                     |
| Histórico de condições anteriores do paciente                |
| **diagnosis**                  | **str**                     |
| Diagnóstico dado ao paciente pelo profissional de saúde      |
| **related_diseases**           | **str**                     |
| Condições relacionadas à do paciente                         |
| **medications**                | **str**                     |
| Medicações das quais o paciente faz uso                      |
| **physical_evaluation**        | **str**                     |
| Avaliação física do paciente realizada pelo profissional     |
| **number_of_movements**        | **int**                     |
| Número de Movimentos pertencentes à Sessão                   |
| **duration**                   | **float**                   |
| Duração total da Sessão. Equivale à soma das durações dos seus Movimentos |
| **movements**                  | **[[Movement](#movement)]** |
| Lista dos Movimentos pertencentes à Sessão                   |

**Métodos:**
| Método      | Tipo     | Parâmetros                                |
| :---------- | :------- | ----------------------------------------: |
| **to_dict** | **dict** | **exclude: list, movement_exclude: list** |
| Converte a Sessão para um dicionário. Recebe duas listas: uma lista de propriedades a serem ignoradas e uma outra lista de propriedades a serem ignoradas na conversão dos seus Movimentos |
| **to_json** | **str**  | **update: bool = False**                  |
| Converte a Sessão para json. O parâmetro update modifica o json gerado: para requisições de criação use update como `False` e para requisições de atualização use update como `True` |

### Erros
A biblioteca Python ReBase define alguns erros personalizados para os modelos de dados e casos de uso do ReBase. São eles:

1. **MismatchedArticulationsError:** disparado ao criar um Movimento com Registros que tenham articulações diferentes das definidas no Movimento ou ao adicionar a um Movimento um Registro que tenha articulações diferentes das do Movimento;
2. **MissingAttributeError:** disparado ao tentar enviar uma requisição ao ReBaseRS e algum parâmetro não tenha um atributo obrigatório;
3. **RepeatedArticulationError:** disparado ao criar um Movimento ou um Registro com uma lista de articulações que contenha articulações repetidas.
4. **UnauthorizedUserError:** disparado quando um objeto da classe ReBaseClient é inicializado com o parâmetro `try_authenticate=True` e a autenticação falha.

## Contato
* **Tiago Trotta**: *mrtrotta2010@gmail.com*
* **Diego Dias**: *diegocolombodias@gmail.com*
            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "python-rebase",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "",
    "keywords": "database,databases,gesture tracking,medical,movement tracking",
    "author": "",
    "author_email": "Tiago Trotta <mrtrotta2010@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/c2/f7/db60eef38568b2ebc64d63a97701f8fb9af1d4b44b6954f0b54094480aae/python_rebase-0.3.3.tar.gz",
    "platform": null,
    "description": "# Python ReBase [0.3.3]\nEste projeto \u00e9 uma API escrita em Python para comunica\u00e7\u00e3o com o ReBase, um banco de dados de sess\u00f5es de reabilita\u00e7\u00e3o f\u00edsica.\n\n## \u00cdndice\n- [Python ReBase \\[0.3.3\\]](#python-rebase-033)\n  - [\u00cdndice](#\u00edndice)\n  - [Vis\u00e3o Geral](#vis\u00e3o-geral)\n    - [Sobre o ReBase](#sobre-o-rebase)\n  - [Instala\u00e7\u00e3o](#instala\u00e7\u00e3o)\n  - [Requisitos](#requisitos)\n  - [Quick Start](#quick-start)\n    - [Inicializando o ReBaseClient](#inicializando-o-rebaseclient)\n    - [Criando um Movimento](#criando-um-movimento)\n    - [Criando uma Sess\u00e3o](#criando-uma-sess\u00e3o)\n    - [Buscando Movimentos e Sess\u00f5es](#buscando-movimentos-e-sess\u00f5es)\n    - [Atualizando e deletando](#atualizando-e-deletando)\n  - [T\u00f3picos Avan\u00e7ados](#t\u00f3picos-avan\u00e7ados)\n    - [Filtragem](#filtragem)\n    - [Pagina\u00e7\u00e3o](#pagina\u00e7\u00e3o)\n  - [Exemplos](#exemplos)\n  - [Documenta\u00e7\u00e3o Completa](#documenta\u00e7\u00e3o-completa)\n    - [ReBaseClient](#rebaseclient)\n    - [M\u00f3dulos](#m\u00f3dulos)\n      - [util](#util)\n    - [Modelos](#modelos)\n      - [APIResponse](#apiresponse)\n      - [Movement](#movement)\n      - [Register](#register)\n      - [Rotation](#rotation)\n      - [Session](#session)\n    - [Erros](#erros)\n  - [Contato](#contato)\n\n## Vis\u00e3o Geral\nO pacote Python ReBase cont\u00e9m classes-modelo para Sess\u00f5es e Movimentos. A classe `api_response` modela de forma generalizada as respostas enviadas pelo `ReBaseRS`. O m\u00f3dulo `rebase_client` \u00e9 respons\u00e1vel pelo envio de requisi\u00e7\u00f5es ao ReBaseRS. Est\u00e3o inclusas tamb\u00e9m algumas exce\u00e7\u00f5es personalizadas e fun\u00e7\u00f5es utilit\u00e1rias. Todos os m\u00f3dulos se encontram na pasta `src/python_rebase`.\n\n### Sobre o ReBase\nO ReBase, do ingl\u00eas *Rehabilitation Database*, \u00e9 um baco de dados dedicado ao armazenamento de movimentos corporais, com foco em reabilita\u00e7\u00e3o neurofuncional e neuromotora. Apesar do enfoque, o ReBase \u00e9 capaz de armazenar qualquer tipo de movimento corporal gravado por qualquer t\u00e9cnica de captura de movimentos, desde que siga o padr\u00e3o definido. Para isto serve a API Python ReBase!\n\nOs **Movimentos** do ReBase representam os movimentos corporais capturados e s\u00e3o compostos por metadados, uma lista de *Articula\u00e7\u00f5es* e uma lista de **Registros**, que representam as rota\u00e7\u00f5es em X, y e z da Articula\u00e7\u00e3o a cada instante do Movimento. Os Movimentos podem pertencer a **Sess\u00f5es**. Cada Sess\u00e3o tamb\u00e9m contem metadados e pode conter m\u00faltiplos movimentos.\n\nTodos os usu\u00e1rios que desejarem acessar o ReBase precisam ter um token de autentica\u00e7\u00e3o cadastrados no sistema. Para receber um token, o usu\u00e1rio deve entrar em contato com o time de desenvolvimento atrav\u00e9s dos emails `mrtrotta2010@gmail.com` ou `diegocolombodias@gmail.com` e enviar o endere\u00e7o de email que deseja cadastrar.\n\n## Instala\u00e7\u00e3o\nO Python ReBase pode ser instalado pelo terminal atrav\u00e9s do **PyPi** com os comandos:\n```\npip3 install python-rebase\n```\nou\n```\npython3 -m pip install python-rebase\n```\n\n## Requisitos\n* Esta biblioteca depende da biblioteca `requests`, utilizada para enviar requisi\u00e7\u00f5es HTTP;\n* O Python ReBase est\u00e1 dispon\u00edvel apenas para Python 3.10 ou superior;\n* \u00c9 necess\u00e1rio ter seu email e token de autentica\u00e7\u00e3o j\u00e1 cadastrados no ReBase.\n\n## Quick Start\nPara utilizar a API, basta importar a biblioteca no come\u00e7o do seu arquivo .py\n\n### Inicializando o ReBaseClient\n```Python\nfrom python_rebase.rebase_client import ReBaseClient\n\n# Inicialize o cliente do ReBase com seu email e token previamente cadastrados\nrebase_client = ReBaseClient('exemplo@gmail.com', 'tokenExemplo')\n```\n\n### Criando um Movimento\n```Python\nfrom python_rebase.movement import Movement\n\n# Crie um objeto Movement\nmovement = Movement({\n    'label': 'MyMovement',\n    'fps': 30, # Varia conforme sua aplica\u00e7\u00e3o\n    'professionalId': 'Prof',\n    'articulations': ['1', '2']\n})\n\n# Adicione os Registros ao Movimento\n# Cada registro representa um \"frame\" do movimento\n# Os registros cont\u00eam as rota\u00e7\u00f5es de cada articula\u00e7\u00e3o em um dado momento \n# Apesar de o Python ReBase incluir classes-modelo para os Registros e para Rota\u00e7\u00f5es, os m\u00e9todos tamb\u00e9m aceitam dicion\u00e1rios e listas como par\u00e2metros\nmovement.add_register(Register(\n    {\n        '1': Rotation(1.0, 1.0, 1.0), # Rota\u00e7\u00f5es da articula\u00e7\u00e3o \"1\"\n        '2': [2.0, 2.0, 2.0] # Rota\u00e7\u00f5es da articula\u00e7\u00e3o \"2\"\n    }\n))\n\n# Utilize o m\u00f3dulo rebase_client para inserir o movimento\nresponse = rebase_client.insert_movement(movement)\nprint(f'Inserted: {response}')\n```\n\n### Criando uma Sess\u00e3o\n```Python\nfrom python_rebase.session import Session\n\n# Crie um objeto Sess\u00e3o.\n# A Sess\u00e3o pode ser criada vazia ou com Movimentos, sejam eles da classe Movement ou dicion\u00e1rios simples\nsession = Session({\n    'title': 'Teste de Sess\u00e3o',\n    'professionalId': 'Prof',\n    'patientId': 'Pat',\n    'movements': [\n        # Da mesma forma, os Movimentos podem ser criados j\u00e1 com Registros\n        Movement({\n            'label': 'MyMovement',\n            'fps': 30,\n            'articulations': ['1', '2'],\n            'registers': [\n                Register({\n                    '1': Rotation(1.0, 1.0, 1.0),\n                    '2': Rotation(2.0, 2.0, 2.0)\n                })\n            ]\n        }),\n        {\n            'label': 'MyMovement',\n            'fps': 30,\n            'articulations': ['1', '2'],\n            'registers': [\n                {\n                    '1': [1.0, 1.0, 1.0],\n                    '2': [2.0, 2.0, 2.0]\n                }\n            ]\n        }\n    ]\n})\n\nresponse = rebase_client.insert_session(session)\n```\n\n### Buscando Movimentos e Sess\u00f5es\n```Python\n# \u00c9 poss\u00edvel encontrar um \u00fanico Movimento ou listar v\u00e1rios\nresponse = rebase_client.find_movement(id)\nprint(f'Movimento: {response.movement}')\n\n# A listagem permite filtros e suporta pagina\u00e7\u00e3o\n# Os filtros poss\u00edveis s\u00e3o: professional_id (id do profissional de sa\u00fade), patient_id (id do paciente),\n# movement_label (identifica\u00e7\u00e3o do movimento), articulations (articula\u00e7\u00f5es inclu\u00eddas no movimento)\nresponse = rebase_client.fetch_movements(professional_id='professional', patient_id='patient', page=1, per=10)\nprint(f'Movimentos: {response.movements}')\n\n# Da mesma forma, as Sess\u00f5es podem ser buscadas individualmente ou listadas\nresponse = rebase_client.find_session(id)\nprint(f'Sess\u00e3o: {response.session}')\n\n# Os filtros suportados pela listagem de Sess\u00e3o s\u00e3o: professional_id e patient_id.\n# Tamb\u00e9m s\u00e3o aceitos os filtros movement_label e articulations, mas estes filtram os movimentos das Sess\u00f5es\nresponse = rebase_client.fetch_sessions(professional_id='professional', patient_id='patient', page=1, per=10)\nprint(f'Sess\u00f5es: {response.sessions}')\n```\n\n### Atualizando e deletando\n```Python\n# S\u00e3o disponibilizados m\u00e9todos para deletar e excluir Movimentos e Sess\u00f5es\nresponse = rebase_client.update_movement(updatedMovement)\nresponse = rebase_client.delete_movement(id)\n\nresponse = rebase_client.update_session(updatedSession)\nresponse = rebase_client.delete_session(id)\n```\n\n## T\u00f3picos Avan\u00e7ados\nA seguir, ser\u00e3o abordados dois assuntos relevantes para as requisi\u00e7\u00f5es de listagem: **filtragem** e **pagina\u00e7\u00e3o**.\n\n### Filtragem\nAs requisi\u00e7\u00f5es de listagem do ReBase, de Movimentos ou de Sess\u00f5es, suportam alguns filtros, listados e explicados a seguir.\n\nListagem de Movimentos:\n* **professional_id:** recebe uma `string` que representa o ID do profissional de sa\u00fade respons\u00e1vel pelo Movimento;\n* **patient_id:** recebe uma `string` que representa o ID do paciente que executou o Movimento;\n* **movement_label:** recebe uma `string` que representa a propriedade `label` do Movimento;\n* **articulations:** recebe uma lista de `strings` que representam as articula\u00e7\u00f5es trabalhadas no Movimento.\n\nListagem de Sess\u00f5es:\n* **professional_id:** recebe uma `string` que representa o ID do profissional de sa\u00fade respons\u00e1vel pela Sess\u00e3o;\n* **patient_id:** recebe uma `string` que representa o ID do paciente que avaliado durante a Sess\u00e3o.\n\nA listagem de Sess\u00f5es pode recebe ainda dois filtros adicionais. Estes, no entanto, n\u00e3o filtrar\u00e3o a lista de Sess\u00f5es em si, mas sim as listas de Movimentos das Sess\u00f5es. S\u00e3o eles:\n* **movement_label:** recebe uma `string` que representa a propriedade `label` do Movimento;\n* **articulations:** recebe uma lista de `strings` que representam as articula\u00e7\u00f5es trabalhadas no Movimento.\n\nEstes filtros podem ser \u00fateis em alguns casos espec\u00edficos. Um exemplo de uso: listar as Sess\u00f5es de um paciente espec\u00edfico, mas incluir apenas os Movimentos que trabalharam um grupo espec\u00edfico de articula\u00e7\u00f5es.\n\nVale notar, por fim, que todos os filtros s\u00e3o **aditivos**, ou seja, ao utilizar `n` m\u00faltiplos filtros, ser\u00e3o retornados os documentos que satisfa\u00e7am **todos** os filtros, ou seja, os documentos que satisfa\u00e7am o filtro 1 **E** o filtro 2 **E** ... **E** o filtro n. \n\n### Pagina\u00e7\u00e3o\nAs requisi\u00e7\u00f5es de listagem, tanto de Movimentos quanto de Sess\u00f5es, tamb\u00e9m suportam pagina\u00e7\u00e3o. Utilizando pagina\u00e7\u00e3o, elimina-se a necessidade de carregar todos os items de uma listagem de uma s\u00f3 vez, o que pode significar um ganho de velocidade e desempenho para uma aplica\u00e7\u00e3o. O ReBaseRS suporta dois tipos de pagina\u00e7\u00e3o: baseada em **per e page** e baseada em **IDs**.\n\nO primeiro tipo utiliza dois par\u00e2metros: `per`, que representa a quantidade de itens presentes em cada p\u00e1gina, e `page`, que representa qual p\u00e1gina deve ser carregada. Desta forma, supondo que quis\u00e9ssemos carregar 10 elementos por p\u00e1gina, para carregar a primeira p\u00e1gina usar\u00edamos `{ per: 10, page: 1 }` e receber\u00edamos os primeiros 10 itens da lista. Para carregar a segunda p\u00e1gina usar\u00edamos `{ per: 10, page: 2 }` e receber\u00edamos os 10 itens seguintes e assim por diante. Este m\u00e9todo \u00e9 simples de se utilizar e de se entender e permite o carregamento de qualquer p\u00e1gina, por\u00e9m possui uma desvantagem: para recuperar uma p\u00e1gina `n`, \u00e9 necess\u00e1rio recuperar todas as p\u00e1ginas anteriores, o que faz com que as requisi\u00e7\u00f5es fiquem mais lentas conforme o n\u00famero `n` da p\u00e1gina cresce. Para mitigar este problema, \u00e9 poss\u00edvel utilizar a pagina\u00e7\u00e3o baseada em IDs.\n\nA pagina\u00e7\u00e3o baseada em IDs tamb\u00e9m depende de dois par\u00e2metros: `per`, a quantidade de itens por p\u00e1gina, e `previous_id`, o ID do \u00faltimo item da p\u00e1gina anterior. Pela forma como o banco de dados do ReBase \u00e9 modelado, as listas de Movimentos e de Sess\u00f5es s\u00e3o ordenadas pelos IDs dos documentos, que s\u00e3o sequenciais. Ou seja, se quisermos recuperar os 10 itens seguintes a um item `i`, basta recuperar os primeiros 10 itens cujo ID seja maior do que o ID de `i`. Explorando essa caracter\u00edstica, \u00e9 poss\u00edvel implementar um m\u00e9todo de pagina\u00e7\u00e3o que permite que todas as p\u00e1ginas sejam recuperadas em tempos equivalentes. Desta forma, para recuperar a primeira p\u00e1gina usar\u00edamos `{ per: 10, previous_id: null }`, j\u00e1 que n\u00e3o existe uma p\u00e1gina anterior. Supondo que o ID do \u00faltimo item da primeira p\u00e1gina seja \"ABC\", para recuperar a segunda p\u00e1gina usar\u00edamos `{ per: 10, previous_id: \"ABC\" }`. Apesar de tudo, este m\u00e9todo de pagina\u00e7\u00e3o tamb\u00e9m tem uma desvantagem: para recuperar uma p\u00e1gina espec\u00edfica, \u00e9 necess\u00e1rio ter recuperado todas as p\u00e1ginas anteriores a ela, j\u00e1 que \u00e9 preciso saber os IDs dos documentos que est\u00e3o contidos nelas.\n\nAssim, cabe ao desenvolvedor analisar sua aplica\u00e7\u00e3o e decidir qual m\u00e9todo de pagina\u00e7\u00e3o dever\u00e1 ser utilizado (ou se a pagina\u00e7\u00e3o \u00e9 mesmo necess\u00e1ria). Aplica\u00e7\u00f5es que devem permitir a qualquer momento o acesso a qualquer p\u00e1gina, dever\u00e3o usar a pagina\u00e7\u00e3o baseada em per e page. Por outro lado, para uma aplica\u00e7\u00e3o que precisa exibir uma lista com scroll infinito, por exemplo, na qual os itens s\u00e3o carregados sequencialmente, se beneficiar\u00e1 mais do m\u00e9todo baseado em IDs. Para mais informa\u00e7\u00f5es, [este artigo](https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3) pode ser \u00fatil. \n\n## Exemplos\nEsta biblioteca inclui a pasta `examples`, que inclui alguns c\u00f3digos-exemplo b\u00e1sicos de utiliza\u00e7\u00e3o da API.\n\n## Documenta\u00e7\u00e3o Completa\nA seguir, est\u00e3o inclu\u00eddas tabelas e descri\u00e7\u00f5es detalhando todas as classes e m\u00f3dulos da API Python ReBase.\n\n### ReBaseClient\nEsta classe \u00e9 respons\u00e1vel por toda a comunica\u00e7\u00e3o com o ReBaseRS. Seus m\u00e9todos retornam objetos da classe [APIResponse](#apiresponse). Exemplos de uso podem ser encontrados na se\u00e7\u00e3o [Quick Start:](#quick-start). O ReBaseClient deve ser inicializado com o email e o token do usu\u00e1rios previamente cadastrados.\n\n**Atributos:**\n| Atributo       | Tipo    |\n| :------------- | ------- |\n| **user_email** | **str** |\n| Email do usu\u00e1rio         |\n| **user_token** | **str** |\n| Token de autentica\u00e7\u00e3o do usu\u00e1rio |\n\n**M\u00e9todos:**\n| M\u00e9todo              | Retorno                         | Par\u00e2metros                           |\n| :------------------ | :------------------------------ | -----------------------------------: |\n| **\\_\\_init\\_\\_**        | None                            | **user_email: str, user_token: str, try_authenticate: bool = False** |\n| M\u00e9todo de inicializa\u00e7\u00e3o da classe. Recebe o endere\u00e7o de email e o token de acesso do usu\u00e1rio. \u00c9 poss\u00edvel tentar autenticar o usu\u00e1rio no momento da inicializa\u00e7\u00e3o, passando o argumento `try_authenticate=True`, por\u00e9m, caso a autentica\u00e7\u00e3o falhe neste ponto, ser\u00e1 lan\u00e7ado um erro `UnauthorizedUserError` |\n| **authenticate**    | **[APIResponse](#apiresponse)** |                                      |\n| Envia uma requisi\u00e7\u00e3o de autentica\u00e7\u00e3o que n\u00e3o executa nenhum opera\u00e7\u00e3o sobre o banco de dados. O envio desta requisi\u00e7\u00e3o n\u00e3o \u00e9 obrigat\u00f3rio, visto que todas as outras requisi\u00e7\u00f5es tamb\u00e9m realizam autentica\u00e7\u00e3o |\n| **fetch_movements** | **[APIResponse](#apiresponse)** | **professional_id: str = \"\", patient_id: str = \"\", movementLabel: str = \"\", articulations: list = None, legacy: bool = False, page: int = 0, per: int = 0, previous_id: str = \"\"** |\n| Recupera uma lista de Movimentos armazenados no ReBaseRS. Suporta diversos filtros e pagina\u00e7\u00e3o |\n| **find_movement**   | **[APIResponse](#apiresponse)** | **id: str, legacy: bool = False**    |\n| Recupera um Movimento espec\u00edfico a partir do ID. O par\u00e2metro `legacy`, se `True`, retorna o Movimento no formato antigo do ReBase |\n| **insert_movement**  | **[APIResponse](#apiresponse)** | **movement: [Movement](#movement)** |\n| Insere um Movimento no ReBase                                                                |\n| **update_movement**  | **[APIResponse](#apiresponse)** | **movement: [Movement](#movement)** |\n| Atualiza um Movimento j\u00e1 existente no ReBase                                                 |\n| **delete_movement** | **[APIResponse](#apiresponse)** | **id: str**                          |\n| Exclui um Movimento do ReBase                                                                |\n| **fetch_sessions**  | **[APIResponse](#apiresponse)** | **professional_id: str = \"\", patient_id: str = \"\", movement_label: str = \"\", articulations: list = None, legacy: bool = False, deep: bool = False, page: int = 0, per: int = 0, previous_id: str = \"\"** |\n| Recupera uma lista de Sess\u00f5es armazenadas no ReBaseRS. Suporta diversos filtros e pagina\u00e7\u00e3o. O par\u00e2metro `legacy`, se `True`, retorna as Sess\u00f5es no formato antigo do ReBase. Caso o par\u00e2metro `deep` seja `True`, retorna tamb\u00e9m os Movimentos das Sess\u00f5es, caso contr\u00e1rio, retorna apenas os IDs dos Movimentos |\n| **find_session**    | **[APIResponse](#apiresponse)** | **id: str, legacy: bool = False, deep: bool = False** |\n| Recupera uma Sess\u00e3o espec\u00edfica a partir do ID. O par\u00e2metro `legacy`, se `True`, retorna a Sess\u00e3o no formato antigo do ReBase. Caso o par\u00e2metro `deep` seja `True`, retorna tamb\u00e9m os Movimentos da Sess\u00e3o, caso contr\u00e1rio, retorna apenas os IDs dos Movimentos |\n| **insert_session**  | **[APIResponse](#apiresponse)** | **session: [Session](#session)**     |\n| Insere uma Sess\u00e3o no ReBase                                                                  |\n| **update_session**  | **[APIResponse](#apiresponse)** | **session: [Session](#session)**     |\n| Atualiza uma Sess\u00e3o j\u00e1 existente no ReBase                                                   |\n| **delete_session**  | **[APIResponse](#apiresponse)** | **id: str, deep: bool = False**      |\n| Exclui uma Sess\u00e3o do ReBase. Caso o par\u00e2metro `deep` seja `True`, deleta tamb\u00e9m seus Movimentos |\n\n### M\u00f3dulos\n\n#### util\nO m\u00f3dulo `util` cont\u00e9m diversos m\u00e9todos utilit\u00e1rios. \n\n**M\u00e9todos:**\n| M\u00e9todo                           | Retorno  | Par\u00e2metros                       |\n| :------------------------------- | :------- | -------------------------------: |\n| **is_valid_str**                 | **bool** | **value: any**                   |\n| Retorna `True` se `value` for uma string v\u00e1lida (uma inst\u00e2ncia da classe `str`). Caso contr\u00e1rio, retorna `False` |\n| **is_valid_number**              | **bool** | **value: any**                   |\n| Retorna `True` se `value` for um n\u00famero v\u00e1lido (uma inst\u00e2ncia da classe `int` ou da classe `float`). Caso contr\u00e1rio, retorna `False` |\n| **is_valid_id**                  | **bool** | **value: any**                   |\n| Retorna `True` se `value` for considerado um id v\u00e1lido para o ReBase (uma string v\u00e1lida n\u00e3o vazia ou um inteiro maior que 0). Caso contr\u00e1rio, retorna `False` |\n| **is_valid_movement_field**      | **bool** | **field: str, value: any**       |\n| Retorna `True` se `field` for um campo v\u00e1lido para um Movimento do ReBase e se `value` for um valor v\u00e1lido para esse campo. Retorna `False` caso contr\u00e1rio |\n| **is_valid_session_field**       | **bool** | **field: str, value: any**       |\n| Retorna `True` se `field` for um campo v\u00e1lido para um Movimento do ReBase e se `value` for um valor v\u00e1lido para esse campo. Retorna `False` caso contr\u00e1rio |\n| **exclude_keys_from_dict**       | **None** | **dictionary: dict, keys: list** |\n| Remove uma dada lista de chaves de um dado dicion\u00e1rio                          |\n| **validate_initialization_dict** | **None** | **validation_function: Callable[[str, any], bool], resource_name: str, field_rules: dict, dictionary: dict** |\n| Valida um dicion\u00e1rio de inicializa\u00e7\u00e3o `dictionary` com base nos campos definidos em `field_rules` utilizando a fun\u00e7\u00e3o de valida\u00e7\u00e3o `validation_function`. Caso encontre algum campo inv\u00e1lido, lan\u00e7a um `ValueError` cuja mensagem cont\u00e9m o nome apropriado do recurso `resource_name` |\n\n### Modelos\n\n#### APIResponse\nA classe APIResponse modela uma resposta generalizada do servidor ReBaseRS.\n\n**Atributos:**\n| Atributo          | Tipo                   |\n| :---------------- | ---------------------: |\n| **response_type** | **ResponseType(Enum)** |\n| Tipo da requisi\u00e7\u00e3o enviada. Valores poss\u00edveis: { 0: FetchMovements, 1: FindMovement, 3: InsertMovement, 4: UpdateMovement, 5: DeleteMovement, 6: FetchSessions, 7: FindSession, 8: InsertSession, 9: UpdateSession, 10: DeleteSession, 11: APIError } |\n| **status**        | **int**                |\n| Status da resposta. 0 representa sucesso e qualquer outro valor representa um erro |\n| **code**          | **int**                |\n| C\u00f3digo HTTP da resposta (E.g. 200, 201, 404, etc. ) |\n| **success**       | **bool**               |\n| Diz se a requisi\u00e7\u00e3o foi bem sucedida ou n\u00e3o. Em outras palavras, diz se status == 0 |\n\n**M\u00e9todos:**\n| M\u00e9todo            | Retorno  | Par\u00e2metros   |\n| :---------------- | :------- | ------------ |\n| **has_data**      | **bool** | **key: str** |\n| Retorna `True` se o atributo `key` estiver presente nos dados da resposta e `False` caso contr\u00e1rio |\n| **get_data**      | **bool** | **key: str** |\n| Retorna o valor do atributo `key` nos dados da resposta. Os poss\u00edveis atributos s\u00e3o: 'message', 'HTMLError', 'error', 'warning', 'movements', 'movement', 'sessions', 'session', 'deletedId', 'deletedCount' |\n| **has_meta_data** | **bool** | **key: str** |\n| Retorna `True` se o atributo `key` estiver presente nos metadados da resposta e `False` caso contr\u00e1rio |\n| **get_meta_data** | **bool** | **key: str** |\n| Retorna o valor do atributo `key` nos metadados da resposta. Os poss\u00edveis atributos s\u00e3o: 'current_page', 'next_page', 'total_count', 'total_page_count' |\n\n#### Movement\nModela um Movimento do ReBase.\n\n**Atributos:**\n| Atributo                | Tipo                        |\n| :---------------------- | --------------------------: |\n| **id**                  | **str**                     |\n| ID do Movimento                                       |\n| **label**               | **str**                     |\n| Label, ou etiqueta, de identifica\u00e7\u00e3o do Movimento. Normalmente representa uma categoria ou grupo de Movimentos |\n| **description**         | **str**                     |\n| Descri\u00e7\u00e3o do Movimento                                |\n| **device**              | **str**                     |\n| Dispositivo respons\u00e1vel pela captura do Movimento (E.g. Kinect, MediaPipe, etc.) |\n| **fps**                 | **float**                   |\n| Quantidade de quadros por segundo do Movimento        |\n| **duration**            | **float**                   |\n| Dura\u00e7\u00e3o do Movimento                                  |\n| **number_of_registers** | **int**                     |\n| Quantidade de Registros presentes no Movimento (os Registros ser\u00e3o descritos a seguir) |\n| **articulations**       | **list**                    |\n| Articula\u00e7\u00f5es utilizadas pelo Movimento. As Articula\u00e7\u00f5es s\u00e3o identificadas por strings arbitr\u00e1rias definidas pelo usu\u00e1rio da API. Cabe a cada desenvolvedor definir e seguir seu padr\u00e3o. Desta maneira, o ReBase pode armazenar movimentos com um conjunto vari\u00e1vel de Articula\u00e7\u00f5es |\n| **insertion_date**      | **str**                     |\n| Data de inser\u00e7\u00e3o do Movimento                         |\n| **update_date**         | **str**                     |\n| Data da \u00faltima atualiza\u00e7\u00e3o do Movimento               |\n| **session_id**          | **str**                     |\n| ID da Sess\u00e3o \u00e0 qual o Movimento pertence              |\n| **professional_id**     | **str**                     |\n| Identifica\u00e7\u00e3o do profissional da sa\u00fade respons\u00e1vel pela captura do Movimento |\n| **app_code**            | **int**                     |\n| C\u00f3digo da aplica\u00e7\u00e3o que gerou o Movimento. Um inteiro positivo, maior que zero, arbitr\u00e1rio definido pelos desenvolvedores da aplica\u00e7\u00e3o |\n| **app_data**            | **str**                     |\n| Dados arbitr\u00e1rios utilizados pela aplica\u00e7\u00e3o que gerou o Movimento. Pode ser utilizado pelos usu\u00e1rios da API para armazenar dados no formato que quiserem, como um json ou uma string |\n| **patient_id**          | **str**                     |\n| Identifica\u00e7\u00e3o an\u00f4nima do paciente que realizou o Movimento |\n| **registers**           | **[[Register](#register)]** |\n| Lista de Registros que representam o Movimento em si. Ao adicionar um registro a um Movimento, mesmo que ele seja um dicion\u00e1rio, ser\u00e1 automaticamente convertido \u00e0 classe [Register](#register) |\n\n**M\u00e9todos:**\n| M\u00e9todo                       | Retorno  | Par\u00e2metros                          |\n| :--------------------------- | :------- | ----------------------------------: |\n| **add_register**             | **None** | **register: [Register](#register)** |\n| Adiciona um novo Registro ao Movimento                                        |\n| **to_dict**                  | **dict** | **exclude: list**                   |\n| Converte o Movimento para um dicion\u00e1rio. Recebe uma lista de propriedades a serem ignoradas |\n| **to_json**                  | **str**  | **update: bool = False**            |\n| Converte o Movimento para json. O par\u00e2metro update modifica o json gerado: para requisi\u00e7\u00f5es de cria\u00e7\u00e3o use update como `False` e para requisi\u00e7\u00f5es de atualiza\u00e7\u00e3o use update como `True` |\n\n#### Register\nModela um Registro do ReBase, essencialmente um quadro, ou um frame, de um Movimento. Um Registro cont\u00e9m as rota\u00e7\u00f5es nos eixos x, y e z de cada Articula\u00e7\u00e3o do Movimento em um determinado instante. A classe Register se comporta como um dicion\u00e1rio, ou seja, cada articula\u00e7\u00e3o deve ser acessada atrav\u00e9s do operador `[]` (ex: `register['articulation1'] = Rotation(1.0, 2.0, 3.0)`)\n\n**Atributos:**\n| Atributo               | Tipo              |\n| :--------------------- | ----------------: |\n| **articulation_count** | **int**           |\n| A quantidade de Articula\u00e7\u00f5es presentes no Registro |\n| **articulations**      | **readonly list** |\n| A lista das Articula\u00e7\u00f5es presentes no Registro |\n| **is_empty**           | **bool**          |\n| Indica se o registro est\u00e1 vazio, ou seja, n\u00e3o contem nenhuma Articula\u00e7\u00e3o |\n\n**M\u00e9todos:**\n| M\u00e9todo              | Retorno  | Par\u00e2metros |\n| :------------------ | :------- | ---------- |\n| **to_dict**         | **dict** |            |\n| Converte o Registro em um dicion\u00e1rio        |\n\n#### Rotation\nRepresenta um conjunto de rota\u00e7\u00f5es de uma Articula\u00e7\u00e3o.\n\n**Atributos:**\n| Atributo | Tipo       |\n| :------- | ---------: |\n| **x**    | **number** |\n| A rota\u00e7\u00e3o no eixo X   |\n| **y**    | **number** |\n| A rota\u00e7\u00e3o no eixo Y   |\n| **z**    | **number** |\n| A rota\u00e7\u00e3o no eixo Z   |\n\n**M\u00e9todos:**\n| M\u00e9todo        | Tipo     | Par\u00e2metros |\n| :------------ | :------- | ---------: |\n| **to_list**   | **list** |            |\n| Converte a Rota\u00e7\u00e3o para uma lista     |\n| **to_tuple**  | **dict** |            |\n| Converte a Rota\u00e7\u00e3o para uma tupla     |\n\n#### Session\nModela uma Sess\u00e3o do ReBase.\n\n**Atributos:**\n| Atributo                       | Tipo                       |\n| :----------------------------- | -------------------------: |\n| **id**                         | **str**                    |\n| ID da Sess\u00e3o                                                |\n| **title**                      | **str**                    |\n| T\u00edtulo da Sess\u00e3o                                            |\n| **description**                | **str**                    |\n| Descri\u00e7\u00e3o da Sess\u00e3o                                         |\n| **professional_id**            | **str**                    |\n| Identifica\u00e7\u00e3o do profissional de sa\u00fade respons\u00e1vel pela captura da Sess\u00e3o |\n| **patient_session_number**     | **int**                     |\n| N\u00famero da Sess\u00e3o do paciente (Ex.: 1 para a primeira Sess\u00e3o, 2 para a segunda, etc.) |\n| **insertion_date**             | **str**                     |\n| Data de cria\u00e7\u00e3o da Sess\u00e3o                                    |\n| **update_date**                | **str**                     |\n| Data de atualiza\u00e7\u00e3o da Sess\u00e3o                                |\n| **patient_id**                 | **str**                     |\n| Identifica\u00e7\u00e3o an\u00f4nima do paciente que realizou a Sess\u00e3o      |\n| **patient_age**                | **int**                     |\n| Idade do paciente                                            |\n| **patient_height**             | **float**                   |\n| Altura do paciente                                           |\n| **patient_weight**             | **float**                   |\n| Peso do paciente                                             |\n| **main_complaint**             | **str**                     |\n| Queixa principal do paciente                                 |\n| **history_of_current_disease** | **str**                     |\n| Hist\u00f3rico da condi\u00e7\u00e3o atual do paciente                      |\n| **history_of_past_disease**    | **str**                     |\n| Hist\u00f3rico de condi\u00e7\u00f5es anteriores do paciente                |\n| **diagnosis**                  | **str**                     |\n| Diagn\u00f3stico dado ao paciente pelo profissional de sa\u00fade      |\n| **related_diseases**           | **str**                     |\n| Condi\u00e7\u00f5es relacionadas \u00e0 do paciente                         |\n| **medications**                | **str**                     |\n| Medica\u00e7\u00f5es das quais o paciente faz uso                      |\n| **physical_evaluation**        | **str**                     |\n| Avalia\u00e7\u00e3o f\u00edsica do paciente realizada pelo profissional     |\n| **number_of_movements**        | **int**                     |\n| N\u00famero de Movimentos pertencentes \u00e0 Sess\u00e3o                   |\n| **duration**                   | **float**                   |\n| Dura\u00e7\u00e3o total da Sess\u00e3o. Equivale \u00e0 soma das dura\u00e7\u00f5es dos seus Movimentos |\n| **movements**                  | **[[Movement](#movement)]** |\n| Lista dos Movimentos pertencentes \u00e0 Sess\u00e3o                   |\n\n**M\u00e9todos:**\n| M\u00e9todo      | Tipo     | Par\u00e2metros                                |\n| :---------- | :------- | ----------------------------------------: |\n| **to_dict** | **dict** | **exclude: list, movement_exclude: list** |\n| Converte a Sess\u00e3o para um dicion\u00e1rio. Recebe duas listas: uma lista de propriedades a serem ignoradas e uma outra lista de propriedades a serem ignoradas na convers\u00e3o dos seus Movimentos |\n| **to_json** | **str**  | **update: bool = False**                  |\n| Converte a Sess\u00e3o para json. O par\u00e2metro update modifica o json gerado: para requisi\u00e7\u00f5es de cria\u00e7\u00e3o use update como `False` e para requisi\u00e7\u00f5es de atualiza\u00e7\u00e3o use update como `True` |\n\n### Erros\nA biblioteca Python ReBase define alguns erros personalizados para os modelos de dados e casos de uso do ReBase. S\u00e3o eles:\n\n1. **MismatchedArticulationsError:** disparado ao criar um Movimento com Registros que tenham articula\u00e7\u00f5es diferentes das definidas no Movimento ou ao adicionar a um Movimento um Registro que tenha articula\u00e7\u00f5es diferentes das do Movimento;\n2. **MissingAttributeError:** disparado ao tentar enviar uma requisi\u00e7\u00e3o ao ReBaseRS e algum par\u00e2metro n\u00e3o tenha um atributo obrigat\u00f3rio;\n3. **RepeatedArticulationError:** disparado ao criar um Movimento ou um Registro com uma lista de articula\u00e7\u00f5es que contenha articula\u00e7\u00f5es repetidas.\n4. **UnauthorizedUserError:** disparado quando um objeto da classe ReBaseClient \u00e9 inicializado com o par\u00e2metro `try_authenticate=True` e a autentica\u00e7\u00e3o falha.\n\n## Contato\n* **Tiago Trotta**: *mrtrotta2010@gmail.com*\n* **Diego Dias**: *diegocolombodias@gmail.com*",
    "bugtrack_url": null,
    "license": "",
    "summary": "Python implementation of the ReBase API",
    "version": "0.3.3",
    "project_urls": {
        "Changelog": "https://github.com/MrTrotta2010/python-rebase/blob/main/CHANGELOG.md",
        "Repository": "https://github.com/MrTrotta2010/python-rebase"
    },
    "split_keywords": [
        "database",
        "databases",
        "gesture tracking",
        "medical",
        "movement tracking"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6686ade34beda14e640ef69ddff8fa131027c99aa6096f9ad2f00fd3b361dae0",
                "md5": "f8dcfe3aa177c47548c31d5cd0b808fe",
                "sha256": "95e37599f2eaf3aaf643e4f2137e660c78c6fb26e2fe81b096c83d24d9580d5a"
            },
            "downloads": -1,
            "filename": "python_rebase-0.3.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f8dcfe3aa177c47548c31d5cd0b808fe",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 37613,
            "upload_time": "2024-02-23T15:47:36",
            "upload_time_iso_8601": "2024-02-23T15:47:36.369519Z",
            "url": "https://files.pythonhosted.org/packages/66/86/ade34beda14e640ef69ddff8fa131027c99aa6096f9ad2f00fd3b361dae0/python_rebase-0.3.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c2f7db60eef38568b2ebc64d63a97701f8fb9af1d4b44b6954f0b54094480aae",
                "md5": "c9ef1cc44036dbbf39a15c324f17f697",
                "sha256": "843ff09ef87af037ba384388b622710fab2f08987b5f7ca49f7ba22fb69ea7ae"
            },
            "downloads": -1,
            "filename": "python_rebase-0.3.3.tar.gz",
            "has_sig": false,
            "md5_digest": "c9ef1cc44036dbbf39a15c324f17f697",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 43648,
            "upload_time": "2024-02-23T15:47:38",
            "upload_time_iso_8601": "2024-02-23T15:47:38.862057Z",
            "url": "https://files.pythonhosted.org/packages/c2/f7/db60eef38568b2ebc64d63a97701f8fb9af1d4b44b6954f0b54094480aae/python_rebase-0.3.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-23 15:47:38",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "MrTrotta2010",
    "github_project": "python-rebase",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "python-rebase"
}
        
Elapsed time: 0.19287s