buildify-api


Namebuildify-api JSON
Version 1.0.2 PyPI version JSON
download
home_pagehttps://unrealos.com
SummaryBuildify API is a Python library for real estate data processing.
upload_time2025-01-13 06:24:20
maintainerNone
docs_urlNone
authorUnrealos
requires_python>=3.8
licenseMIT
keywords buildify real-estate api data-processing python-library
VCS
bugtrack_url
requirements requests python-slugify python-dateutil dateparser python-dotenv questionary build twine
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Buildify API Library: The Ultimate Guide for Developers

## Overview

The **Buildify API Library** is a powerful Python package tailored for developers looking to seamlessly integrate with the **[Buildify API](https://www.getbuildify.com/)**. It simplifies the process of accessing, parsing, and processing data for **real estate projects**, making it an essential tool for those building applications in real estate analytics, property management, or related industries.

This library provides an end-to-end solution for developers, encompassing data extraction, normalization, and processing. With built-in utilities for handling associated project assets like floor plans and photos, the library bridges the gap between raw API data and actionable insights.

---

## Why Use Buildify API Library?

- **Simplified API Integration**: Automates the fetching of real estate project data directly from the Buildify API.  
- **Data Processing Tools**: Handles deposit schedules, occupancy dates, and project structures effortlessly.  
- **File Management**: Automates downloading and organizing project files such as images and floor plans.  
- **Customizable**: Easily adaptable to meet the unique needs of your application.

Here's an improved version of the **Key Takeaways** block, with clear and concise points:

---

### Key Takeaways:

- **`ProjectDataReader`**: Dynamically scans the specified directory for project folders and identifies valid structures. It initializes `SchemaProject` instances for each folder, streamlining the processing pipeline.  
- **`SchemaProject`**: Simplifies access to project-related data (e.g., `data.json`, `map.json`) by abstracting file-specific logic, ensuring developers can focus on higher-level workflows instead of low-level file handling.  
- **`ProjectDataImporter`**: Demonstrates how `SchemaProject` can be utilized to build custom workflows. This class offers flexibility for extending the library's core functionality to meet unique project requirements.  
- **Scalable Workflow**: The combination of `ProjectDataReader` and `SchemaProject` provides a modular, scalable way to parse and process real estate data, making the library suitable for projects of any size.  

---

## Step-by-Step Workflow: Parse, Process, and Generate

---

## Installation

1. Install the package and its dependencies:
   ```bash
   pip install buildify-api
   ```

2. Ensure you have an API key from [Buildify API](https://buildify.readme.io/reference/welcome-api) to access the data.

---

## Workflow

The library's workflow consists of multiple sequential steps. Below is a detailed explanation of each step:

### 1. Define API Key and Output Directory
Before starting, you need to specify your API key and the directory where the data will be stored.

```python
api_key = "YOUR_API_KEY"
output_directory = "./data/projects"
```

This directory will hold all processed files, including:
- **Raw project data**: Saved as `data.json`.
- **Associated files**: Photos, floor plans, etc., saved in `files/`.

---

### 2. Parse and Save Project Data

The `BuildifyApiParser` fetches project data from the API and saves it in a structured format. Each project is stored in its own folder, with raw data saved as `data.json`.

```python
from buildify_api import BuildifyApiParser

parser = BuildifyApiParser(
    api_key=api_key,
    provinces=['on', 'bc'],  # Specify provinces to parse
    page_start=0,            # Starting page for API pagination
    limit=None,              # Maximum number of projects (None for no limit)
    output_dir=output_directory,
    clean_output_dir=True    # Clear the directory before parsing
)

def process_project_callback(project_data):
    print(f"Processed project: {project_data['name']}")

parser.parse(process_project_callback)
```

**Generated Files:**
- `data.json`: Raw project data fetched from the API.

---

### 3. Download and Process Related Files

Use the `DataDownloader` to download associated files, such as photos and floor plans. These are saved in organized directories with metadata stored in `map.json`.

```python
from buildify_api import DataDownloader

processor = DataDownloader(
    output_directory=output_directory,
    download_files=True  # Set to True to download files
)
processor.process()
```

**Generated Files:**
- `files/`: Folder containing downloaded assets (e.g., photos, floor plans).
- `map.json`: Metadata file mapping assets to their respective projects.

---

### 4. Process Deposit Data

The `DepositParser` parses deposit structures from `data.json` and generates a `deposits.json` file with structured information.

```python
from buildify_api import DepositParser

processor = DepositParser(output_directory)
processor.process_all_object_folders()
```

**Generated Files:**
- `deposits.json`: Contains structured deposit data and original milestones.

---

### 5. Generate Deposits for Projects and Suites

Deposit schedules can be generated for both projects and individual suites using the `ProjectDepositsGenerator` and `SuiteDepositsGenerator`.

#### Project Deposits
```python
from buildify_api import ProjectDepositsGenerator

ProjectDepositsGenerator.test_method()
```

#### Suite Deposits
```python
from buildify_api import SuiteDepositsGenerator

SuiteDepositsGenerator.test_method()
```

**Generated Files:**
- `deposits_project.json`: Contains generated project-level deposit schedules.
- `deposits_suites.json`: Contains generated suite-level deposit schedules.

---

### 6. Parse Occupancy Dates

Normalize occupancy-related dates using `OccupancyDateParser`. Dates like `firstOccupancyDate` and `estimatedCompletionDate` are processed and saved as `parsed_date.json`.

```python
from buildify_api import OccupancyDateParser

occupancy_parser = OccupancyDateParser(output_directory)
occupancy_parser.parse()
```

**Generated Files:**
- `parsed_date.json`: Contains normalized occupancy dates.

---

### 7. Process Final Deposits

Consolidate all processed data, including deposit schedules and occupancy dates, into final deposit files for integration or reporting.

```python
from buildify_api import DepositsFinal

final_processor = DepositsFinal(output_directory)
final_processor.process()
```

**Generated Files:**
- `deposits_project.json`: Consolidated project-level deposit data.
- `deposits_suites.json`: Consolidated suite-level deposit data.

---

## File Structure

After completing the workflow, the output directory will look like this:
```
./data/projects/
├── PROJECT_ID/
│   ├── data.json             # Raw project data
│   ├── deposits.json         # Structured deposit data
│   ├── deposits_project.json # Project-level deposit schedules
│   ├── deposits_suites.json  # Suite-level deposit schedules
│   ├── files/
│   │   ├── photos/           # Downloaded photos
│   │   └── floorPlans/       # Downloaded floor plans
│   ├── map.json              # Metadata for associated files
│   └── parsed_date.json      # Normalized occupancy dates
```

---

## Example Code

Here’s the full workflow combined:

```python
from buildify_api import (
    BuildifyApiParser,
    DataDownloader,
    DepositParser,
    ProjectDepositsGenerator,
    SuiteDepositsGenerator,
    OccupancyDateParser,
    DepositsFinal
)

# Define API key and output directory
api_key = "YOUR_API_KEY"
output_directory = "./data/projects"

# Step 1: Parse project data
parser = BuildifyApiParser(
    api_key=api_key,
    provinces=['on', 'bc'],
    output_dir=output_directory,
    clean_output_dir=True
)
parser.parse(lambda project: print(f"Processed: {project['name']}"))

# Step 2: Download associated files
downloader = DataDownloader(output_directory, download_files=True)
downloader.process()

# Step 3: Parse deposit data
deposit_parser = DepositParser(output_directory)
deposit_parser.process_all_object_folders()

# Step 4: Generate deposits for projects and suites
ProjectDepositsGenerator.test_method()
SuiteDepositsGenerator.test_method()

# Step 5: Parse occupancy dates
occupancy_parser = OccupancyDateParser(output_directory)
occupancy_parser.parse()

# Step 6: Process final deposits
final_processor = DepositsFinal(output_directory)
final_processor.process()
```

---

### Output Example

Given a `data` directory structured like this:
```
data/
├── project_1/
│   ├── data.json
│   ├── deposits_project.json
│   ├── deposits_suites.json
│   ├── map.json
│   ├── parsed_date.json
├── project_2/
│   ├── data.json
│   ├── deposits_project.json
│   ├── map.json
│   ├── parsed_date.json
```

---

# Data Reader

The **Data Reader** module provides a streamlined way to parse, process, and load real estate project data stored in a directory structure. The workflow is built around two primary classes:

1. **`ProjectDataReader`**:
   - Reads and validates project directories from the specified `data` folder.
   - Returns a list of `SchemaProject` instances, each representing a single project's data.

2. **`SchemaProject`**:
   - Provides methods to access key project files (e.g., `data.json`, `map.json`, etc.).
   - Simplifies file handling by abstracting JSON file reads and error handling.

---

# ProjectDataReader

### 1. **ProjectDataReader**: Scanning the Data Directory
The `ProjectDataReader` initializes with the path to a `data` folder. It scans for subdirectories, each representing a project. For every valid project directory, a `SchemaProject` instance is created.

### 2. **SchemaProject**: Accessing Project Files
The `SchemaProject` class provides methods to retrieve data from key JSON files in a project folder, such as:
- `data.json`: General project information.
- `map.json`: Metadata for associated files like photos and floor plans.
- `deposits_project.json`: Deposit schedules at the project level.
- `parsed_date.json`: Normalized occupancy and completion dates.

---

## Example Usage

### Full Workflow Example

```python
import os
from buildify_api import ProjectDataReader, SchemaProject, get_logger

# Configure logger
logger = get_logger(__name__)

# Define ProjectDataImporter class
class ProjectDataImporter:
    def __init__(self, project: SchemaProject):
        """
        Initializes the ProjectDataImporter with the data extracted from a SchemaProject instance.

        Args:
            project (SchemaProject): An instance of SchemaProject containing project data.
        """
        self.project_id = project.project_id
        self.data = project.get_data()
        self.parsed_date = project.get_parsed_date()
        self.deposits_project = project.get_deposits_project()
        self.deposits_suites = project.get_deposits_suites()
        self.map_data = project.get_map()

    def process(self):
        """
        Processes and returns the data for the project.
        """
        return {
            "project_id": self.project_id,
            "data": self.data,
            "parsed_date": self.parsed_date,
            "deposits_project": self.deposits_project,
            "deposits_suites": self.deposits_suites,
            "map_data": self.map_data,
        }

# Define the main function
if __name__ == "__main__":
    # Define the directory containing project data
    base_dir = os.path.dirname(os.path.abspath(__file__))
    data_directory = os.path.join(base_dir, "data")

    # Initialize ProjectDataReader
    reader = ProjectDataReader(data_directory)
    projects = reader.process_projects()

    # Process each project
    processed_projects = []
    for project in projects:
        try:
            importer = ProjectDataImporter(project)
            processed_project = importer.process()
            processed_projects.append(processed_project)
            logger.info(f"Successfully processed project: {project.project_id}")
        except Exception as e:
            logger.error(f"Failed to process project {project.project_id}: {e}")

    # Final summary
    logger.info(f"Processed {len(processed_projects)} projects successfully.")
```

---

## About Developer

The **Buildify API Library** is developed by [Unrealos](https://unrealos.com)  , a leading software development company specializing in **PaaS**, **SaaS**, and **web services**. Our expertise lies in integrating advanced AI solutions into business processes to create robust tools for real estate, finance, and other complex industries.

---

## License

This library is licensed under the MIT License. See [LICENSE](./LICENSE) for more details.

            

Raw data

            {
    "_id": null,
    "home_page": "https://unrealos.com",
    "name": "buildify-api",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "buildify, real-estate, api, data-processing, python-library",
    "author": "Unrealos",
    "author_email": "m@unrealos.com",
    "download_url": "https://files.pythonhosted.org/packages/09/ce/939819b3fb0ad3746f3524cc89ed50b9a5f4902f702c4320300213659a60/buildify_api-1.0.2.tar.gz",
    "platform": null,
    "description": "# Buildify API Library: The Ultimate Guide for Developers\n\n## Overview\n\nThe **Buildify API Library** is a powerful Python package tailored for developers looking to seamlessly integrate with the **[Buildify API](https://www.getbuildify.com/)**. It simplifies the process of accessing, parsing, and processing data for **real estate projects**, making it an essential tool for those building applications in real estate analytics, property management, or related industries.\n\nThis library provides an end-to-end solution for developers, encompassing data extraction, normalization, and processing. With built-in utilities for handling associated project assets like floor plans and photos, the library bridges the gap between raw API data and actionable insights.\n\n---\n\n## Why Use Buildify API Library?\n\n- **Simplified API Integration**: Automates the fetching of real estate project data directly from the Buildify API.  \n- **Data Processing Tools**: Handles deposit schedules, occupancy dates, and project structures effortlessly.  \n- **File Management**: Automates downloading and organizing project files such as images and floor plans.  \n- **Customizable**: Easily adaptable to meet the unique needs of your application.\n\nHere's an improved version of the **Key Takeaways** block, with clear and concise points:\n\n---\n\n### Key Takeaways:\n\n- **`ProjectDataReader`**: Dynamically scans the specified directory for project folders and identifies valid structures. It initializes `SchemaProject` instances for each folder, streamlining the processing pipeline.  \n- **`SchemaProject`**: Simplifies access to project-related data (e.g., `data.json`, `map.json`) by abstracting file-specific logic, ensuring developers can focus on higher-level workflows instead of low-level file handling.  \n- **`ProjectDataImporter`**: Demonstrates how `SchemaProject` can be utilized to build custom workflows. This class offers flexibility for extending the library's core functionality to meet unique project requirements.  \n- **Scalable Workflow**: The combination of `ProjectDataReader` and `SchemaProject` provides a modular, scalable way to parse and process real estate data, making the library suitable for projects of any size.  \n\n---\n\n## Step-by-Step Workflow: Parse, Process, and Generate\n\n---\n\n## Installation\n\n1. Install the package and its dependencies:\n   ```bash\n   pip install buildify-api\n   ```\n\n2. Ensure you have an API key from [Buildify API](https://buildify.readme.io/reference/welcome-api) to access the data.\n\n---\n\n## Workflow\n\nThe library's workflow consists of multiple sequential steps. Below is a detailed explanation of each step:\n\n### 1. Define API Key and Output Directory\nBefore starting, you need to specify your API key and the directory where the data will be stored.\n\n```python\napi_key = \"YOUR_API_KEY\"\noutput_directory = \"./data/projects\"\n```\n\nThis directory will hold all processed files, including:\n- **Raw project data**: Saved as `data.json`.\n- **Associated files**: Photos, floor plans, etc., saved in `files/`.\n\n---\n\n### 2. Parse and Save Project Data\n\nThe `BuildifyApiParser` fetches project data from the API and saves it in a structured format. Each project is stored in its own folder, with raw data saved as `data.json`.\n\n```python\nfrom buildify_api import BuildifyApiParser\n\nparser = BuildifyApiParser(\n    api_key=api_key,\n    provinces=['on', 'bc'],  # Specify provinces to parse\n    page_start=0,            # Starting page for API pagination\n    limit=None,              # Maximum number of projects (None for no limit)\n    output_dir=output_directory,\n    clean_output_dir=True    # Clear the directory before parsing\n)\n\ndef process_project_callback(project_data):\n    print(f\"Processed project: {project_data['name']}\")\n\nparser.parse(process_project_callback)\n```\n\n**Generated Files:**\n- `data.json`: Raw project data fetched from the API.\n\n---\n\n### 3. Download and Process Related Files\n\nUse the `DataDownloader` to download associated files, such as photos and floor plans. These are saved in organized directories with metadata stored in `map.json`.\n\n```python\nfrom buildify_api import DataDownloader\n\nprocessor = DataDownloader(\n    output_directory=output_directory,\n    download_files=True  # Set to True to download files\n)\nprocessor.process()\n```\n\n**Generated Files:**\n- `files/`: Folder containing downloaded assets (e.g., photos, floor plans).\n- `map.json`: Metadata file mapping assets to their respective projects.\n\n---\n\n### 4. Process Deposit Data\n\nThe `DepositParser` parses deposit structures from `data.json` and generates a `deposits.json` file with structured information.\n\n```python\nfrom buildify_api import DepositParser\n\nprocessor = DepositParser(output_directory)\nprocessor.process_all_object_folders()\n```\n\n**Generated Files:**\n- `deposits.json`: Contains structured deposit data and original milestones.\n\n---\n\n### 5. Generate Deposits for Projects and Suites\n\nDeposit schedules can be generated for both projects and individual suites using the `ProjectDepositsGenerator` and `SuiteDepositsGenerator`.\n\n#### Project Deposits\n```python\nfrom buildify_api import ProjectDepositsGenerator\n\nProjectDepositsGenerator.test_method()\n```\n\n#### Suite Deposits\n```python\nfrom buildify_api import SuiteDepositsGenerator\n\nSuiteDepositsGenerator.test_method()\n```\n\n**Generated Files:**\n- `deposits_project.json`: Contains generated project-level deposit schedules.\n- `deposits_suites.json`: Contains generated suite-level deposit schedules.\n\n---\n\n### 6. Parse Occupancy Dates\n\nNormalize occupancy-related dates using `OccupancyDateParser`. Dates like `firstOccupancyDate` and `estimatedCompletionDate` are processed and saved as `parsed_date.json`.\n\n```python\nfrom buildify_api import OccupancyDateParser\n\noccupancy_parser = OccupancyDateParser(output_directory)\noccupancy_parser.parse()\n```\n\n**Generated Files:**\n- `parsed_date.json`: Contains normalized occupancy dates.\n\n---\n\n### 7. Process Final Deposits\n\nConsolidate all processed data, including deposit schedules and occupancy dates, into final deposit files for integration or reporting.\n\n```python\nfrom buildify_api import DepositsFinal\n\nfinal_processor = DepositsFinal(output_directory)\nfinal_processor.process()\n```\n\n**Generated Files:**\n- `deposits_project.json`: Consolidated project-level deposit data.\n- `deposits_suites.json`: Consolidated suite-level deposit data.\n\n---\n\n## File Structure\n\nAfter completing the workflow, the output directory will look like this:\n```\n./data/projects/\n\u251c\u2500\u2500 PROJECT_ID/\n\u2502   \u251c\u2500\u2500 data.json             # Raw project data\n\u2502   \u251c\u2500\u2500 deposits.json         # Structured deposit data\n\u2502   \u251c\u2500\u2500 deposits_project.json # Project-level deposit schedules\n\u2502   \u251c\u2500\u2500 deposits_suites.json  # Suite-level deposit schedules\n\u2502   \u251c\u2500\u2500 files/\n\u2502   \u2502   \u251c\u2500\u2500 photos/           # Downloaded photos\n\u2502   \u2502   \u2514\u2500\u2500 floorPlans/       # Downloaded floor plans\n\u2502   \u251c\u2500\u2500 map.json              # Metadata for associated files\n\u2502   \u2514\u2500\u2500 parsed_date.json      # Normalized occupancy dates\n```\n\n---\n\n## Example Code\n\nHere\u2019s the full workflow combined:\n\n```python\nfrom buildify_api import (\n    BuildifyApiParser,\n    DataDownloader,\n    DepositParser,\n    ProjectDepositsGenerator,\n    SuiteDepositsGenerator,\n    OccupancyDateParser,\n    DepositsFinal\n)\n\n# Define API key and output directory\napi_key = \"YOUR_API_KEY\"\noutput_directory = \"./data/projects\"\n\n# Step 1: Parse project data\nparser = BuildifyApiParser(\n    api_key=api_key,\n    provinces=['on', 'bc'],\n    output_dir=output_directory,\n    clean_output_dir=True\n)\nparser.parse(lambda project: print(f\"Processed: {project['name']}\"))\n\n# Step 2: Download associated files\ndownloader = DataDownloader(output_directory, download_files=True)\ndownloader.process()\n\n# Step 3: Parse deposit data\ndeposit_parser = DepositParser(output_directory)\ndeposit_parser.process_all_object_folders()\n\n# Step 4: Generate deposits for projects and suites\nProjectDepositsGenerator.test_method()\nSuiteDepositsGenerator.test_method()\n\n# Step 5: Parse occupancy dates\noccupancy_parser = OccupancyDateParser(output_directory)\noccupancy_parser.parse()\n\n# Step 6: Process final deposits\nfinal_processor = DepositsFinal(output_directory)\nfinal_processor.process()\n```\n\n---\n\n### Output Example\n\nGiven a `data` directory structured like this:\n```\ndata/\n\u251c\u2500\u2500 project_1/\n\u2502   \u251c\u2500\u2500 data.json\n\u2502   \u251c\u2500\u2500 deposits_project.json\n\u2502   \u251c\u2500\u2500 deposits_suites.json\n\u2502   \u251c\u2500\u2500 map.json\n\u2502   \u251c\u2500\u2500 parsed_date.json\n\u251c\u2500\u2500 project_2/\n\u2502   \u251c\u2500\u2500 data.json\n\u2502   \u251c\u2500\u2500 deposits_project.json\n\u2502   \u251c\u2500\u2500 map.json\n\u2502   \u251c\u2500\u2500 parsed_date.json\n```\n\n---\n\n# Data Reader\n\nThe **Data Reader** module provides a streamlined way to parse, process, and load real estate project data stored in a directory structure. The workflow is built around two primary classes:\n\n1. **`ProjectDataReader`**:\n   - Reads and validates project directories from the specified `data` folder.\n   - Returns a list of `SchemaProject` instances, each representing a single project's data.\n\n2. **`SchemaProject`**:\n   - Provides methods to access key project files (e.g., `data.json`, `map.json`, etc.).\n   - Simplifies file handling by abstracting JSON file reads and error handling.\n\n---\n\n# ProjectDataReader\n\n### 1. **ProjectDataReader**: Scanning the Data Directory\nThe `ProjectDataReader` initializes with the path to a `data` folder. It scans for subdirectories, each representing a project. For every valid project directory, a `SchemaProject` instance is created.\n\n### 2. **SchemaProject**: Accessing Project Files\nThe `SchemaProject` class provides methods to retrieve data from key JSON files in a project folder, such as:\n- `data.json`: General project information.\n- `map.json`: Metadata for associated files like photos and floor plans.\n- `deposits_project.json`: Deposit schedules at the project level.\n- `parsed_date.json`: Normalized occupancy and completion dates.\n\n---\n\n## Example Usage\n\n### Full Workflow Example\n\n```python\nimport os\nfrom buildify_api import ProjectDataReader, SchemaProject, get_logger\n\n# Configure logger\nlogger = get_logger(__name__)\n\n# Define ProjectDataImporter class\nclass ProjectDataImporter:\n    def __init__(self, project: SchemaProject):\n        \"\"\"\n        Initializes the ProjectDataImporter with the data extracted from a SchemaProject instance.\n\n        Args:\n            project (SchemaProject): An instance of SchemaProject containing project data.\n        \"\"\"\n        self.project_id = project.project_id\n        self.data = project.get_data()\n        self.parsed_date = project.get_parsed_date()\n        self.deposits_project = project.get_deposits_project()\n        self.deposits_suites = project.get_deposits_suites()\n        self.map_data = project.get_map()\n\n    def process(self):\n        \"\"\"\n        Processes and returns the data for the project.\n        \"\"\"\n        return {\n            \"project_id\": self.project_id,\n            \"data\": self.data,\n            \"parsed_date\": self.parsed_date,\n            \"deposits_project\": self.deposits_project,\n            \"deposits_suites\": self.deposits_suites,\n            \"map_data\": self.map_data,\n        }\n\n# Define the main function\nif __name__ == \"__main__\":\n    # Define the directory containing project data\n    base_dir = os.path.dirname(os.path.abspath(__file__))\n    data_directory = os.path.join(base_dir, \"data\")\n\n    # Initialize ProjectDataReader\n    reader = ProjectDataReader(data_directory)\n    projects = reader.process_projects()\n\n    # Process each project\n    processed_projects = []\n    for project in projects:\n        try:\n            importer = ProjectDataImporter(project)\n            processed_project = importer.process()\n            processed_projects.append(processed_project)\n            logger.info(f\"Successfully processed project: {project.project_id}\")\n        except Exception as e:\n            logger.error(f\"Failed to process project {project.project_id}: {e}\")\n\n    # Final summary\n    logger.info(f\"Processed {len(processed_projects)} projects successfully.\")\n```\n\n---\n\n## About Developer\n\nThe **Buildify API Library** is developed by [Unrealos](https://unrealos.com)  , a leading software development company specializing in **PaaS**, **SaaS**, and **web services**. Our expertise lies in integrating advanced AI solutions into business processes to create robust tools for real estate, finance, and other complex industries.\n\n---\n\n## License\n\nThis library is licensed under the MIT License. See [LICENSE](./LICENSE) for more details.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Buildify API is a Python library for real estate data processing.",
    "version": "1.0.2",
    "project_urls": {
        "Company": "https://unrealos.com",
        "Homepage": "https://unrealos.com",
        "Source": "https://github.com/markolofsen/buildify-api/",
        "Tracker": "https://github.com/markolofsen/buildify-api/issues"
    },
    "split_keywords": [
        "buildify",
        " real-estate",
        " api",
        " data-processing",
        " python-library"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "93f5a40be841d80b208f417aa889c7593b5ece8aca83d48f1179aa277acc6eae",
                "md5": "ef3d5a422bc8fe10e795be68f22b935e",
                "sha256": "c7ec16b96af8f162fc444341270063749adb600c98800df118fc8718ea3101c9"
            },
            "downloads": -1,
            "filename": "buildify_api-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ef3d5a422bc8fe10e795be68f22b935e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 26391,
            "upload_time": "2025-01-13T06:24:18",
            "upload_time_iso_8601": "2025-01-13T06:24:18.576723Z",
            "url": "https://files.pythonhosted.org/packages/93/f5/a40be841d80b208f417aa889c7593b5ece8aca83d48f1179aa277acc6eae/buildify_api-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "09ce939819b3fb0ad3746f3524cc89ed50b9a5f4902f702c4320300213659a60",
                "md5": "83ee24233c11b31bedfe6cd4746c448c",
                "sha256": "e1cbae5eddb17a3d59d08d99f1172823d27c2c78f605396113a8440e00ecb70a"
            },
            "downloads": -1,
            "filename": "buildify_api-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "83ee24233c11b31bedfe6cd4746c448c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 24904,
            "upload_time": "2025-01-13T06:24:20",
            "upload_time_iso_8601": "2025-01-13T06:24:20.508010Z",
            "url": "https://files.pythonhosted.org/packages/09/ce/939819b3fb0ad3746f3524cc89ed50b9a5f4902f702c4320300213659a60/buildify_api-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-13 06:24:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "markolofsen",
    "github_project": "buildify-api",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.3"
                ]
            ]
        },
        {
            "name": "python-slugify",
            "specs": [
                [
                    "==",
                    "8.0.4"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.9.0.post0"
                ]
            ]
        },
        {
            "name": "dateparser",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "python-dotenv",
            "specs": [
                [
                    "==",
                    "0.19.1"
                ]
            ]
        },
        {
            "name": "questionary",
            "specs": []
        },
        {
            "name": "build",
            "specs": []
        },
        {
            "name": "twine",
            "specs": []
        }
    ],
    "lcname": "buildify-api"
}
        
Elapsed time: 0.50999s