# Customise supported formats

By default, the extensions supported by the loader/saver the following: csv, docx, jpg, json, md, parquet, pdf, pickle, png, pptx, sql, toml, txt, xlsx, xml, yaml, yml.

However, through the `extra_loader_config` and `extra_saver_config` parameters, Easy Environment allows you to customise any file format and integrate it into the tool.

1. **Create a loader/saver function**: create a loader or saver function for the corresponding extension.

A load function must contain the path argument, which represents the path to the file. It is also recommanded to pass a `**kwargs` arguments in order to allows greater flexibility when calling the loader though the EasyEnvironment instance.

```python
def new_format_loader(path, **kwargs):
    # Loading process
    func.load(path, **kwargs)
        
    return object
```

A save function must contain the `path` and `obj` arguments, representing respectively the object to be saved and the access path to which to save.

```python
def new_format_saver(obj, path, **kwargs):
    # saving process
    func.save(path, **kwargs)
    ...
```

2. **Initialise Easy Environment**: create an instance of the EasyEnvironment class by specifying your loader and/or saver functions.

Loader and saver functions must be specified by a dictionnary in which the keys correspond to the extensions and the values correspond to a tuple. The tuple contains two elements : the created function and a string representing the reading/writing mode (either "rb" or "rt" for a loader / either "wb" or "wt" for a saver).

```python
envi = EasyEnvironment(
    local_path='path/to/project/root',
    
    gcloud_project_id='your-project-id',
    gcloud_credential_path="path/to/credentials.json",
    GCS_path='gs://your-bucket-name/',
    
    extra_loader_config={'new_format': (new_format_loader, 'rb')},
    extra_saver_config={'new_format': (new_format_saver, 'wb')}
)
```

#### Example of customisation:

In the above example, you can specify custom loader and saver functions for file extensions not covered by the default configurations. Just replace `txt_loader_function` and `txt_saver_function` with your own loader and saver functions, respectively.

Make sure to import the necessary functions and libraries for your custom loaders and savers.

```python
# Defining loader and saver functions

def txt_loader(path, **kwargs):
    return path.read(**kwargs)

def txt_saver(obj, path, **kwargs):
    path.write(obj, **kwargs)

def json_loader(path, **kwargs):
    import json
    return json.load(path, **kwargs)

def json_saver(obj, path, **kwargs):
    import json
    json.dump(obj, path, **kwargs)

# Creating an instance of the EasyEnvironment class specifying the loader and saver
extra_loader_config = {
    'json': (json_loader, 'rt'),
    'txt':  (txt_loader, 'rt')
}

extra_writer_config = {
    'json': (json_writer, 'wt'),
    'txt':  (txt_writer, 'wt')
}

envi = EasyEnvironment(
    local_path='path/to/project/root',
    
    gcloud_project_id='your-project-id',
    gcloud_credential_path="path/to/credentials.json",
    GCS_path='gs://your-bucket-name/',
    
    extra_loader_config=extra_loader_config ,
    extra_saver_config=extra_saver_config 
)

# Using the tool
my_text = envi.local.load("folder/my_text.txt")
my_dict = {"text": my_text}
envi.local.save("folder/my_json.json")
```

Other examples of loader/saver functions are available in [Source Code](https://github.com/AntoinePinto/easy-environment/blob/master/easyenvi/file_manager.py).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://antoinepinto.gitbook.io/easyenvi/extra/customise-supported-formats.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
