Repo to store back end infrastructure for Message in a Bottle

Overview


Message in a Bottle Backend API

RESTful API for Message in a Bottle frontend application consumption.

contributors_badge forks_badge stars_badge issues_badge

About The ProjectTools UsedLocal Set UpInstallationHow To UseDatabase SchemaContributingAcknowledgements

About The Project

Message in a Bottle is an application where users can discover stories about the communities around them. This app was designed as a way to interact with cities, neighborhoods, and the people that inhabit them. The Message in a Bottle backend is built with a Django framework that stores story and user data through PostgreSQL. We expose this data to our frontend team to build out the user interface.

Learning Goals

  • Building a RESTful API with a Python Django backend
  • Collaborating with a Front-End dev team
  • Geolocation calls and tracking
  • Applying best practices learned during Turing to a new language and framework
    • e.g. TDD, OOP, REST, MVC(Rails) <--> MTV(Django)
  • Making use of the git rebase workflow

Tools Used

Development Testing Packages
Python 3.9.7 Pytest-Django Django
Django Pytest-Cov Django CORS Headers
CircleCI Postman Django Heroku
PostgreSQL VCRPY Django REST Framework
Git/Github Gunicorn
Heroku Psycopg2
Pycodestyle
Python-Decouple
Python-DotENV
Requests

Local Set Up

  1. To clone and run this application, you'll need Python 3.9.7 and Django 3.2.8. Using the official Python docs, follow instructions to install python3 for your local OS.

  2. You can check for a successful installation using this command:

$ python3 -V
> Python 3.9.7

Installation

  1. Fork this repo
  2. Clone your new repo:
git clone https://github.com/MIBFB-COLLAB/message_in_a_bottle_backend.git
  1. Create and Invoke your virtual environment:
python3 -m virtualenv venv
source venv/bin/activate
  1. Install dependencies:
(venv) python -m pip install -r requirements.txt
  1. Set up the database:
$ psql

CREATE DATABASE <project name>;
CREATE USER <user name> WITH PASSWORD <password>;
ALTER ROLE <user name> SET client_encoding TO 'utf8';
ALTER ROLE <user name> SET default_transaction_isolation TO 'read committed';
ALTER ROLE <user name> SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE <project name> TO <user name>;
\q
  1. Add PostgreSQL database info to settings.py file:
DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.postgresql_psycopg2',
      'NAME': '
   
    '
   ,
      'USER': '
   
    '
   ,
      'PASSWORD': '
   
    '
   ,
      'HOST': '
   
    '
   ,
      'PORT': '
   
    '
   ,
  }
}
  1. Migrate database:
(venv) python manage.py makemigrations
(venv) python manage.py migrate
  1. Update CORS allowed origins in settings.py. Domains currently allowed are:
CORS_ALLOWED_ORIGINS = [
  'http://localhost:3000',
  'https://message-in-a-bottle-fe-app.herokuapp.com',
  'https://app-message-in-a-bottle.herokuapp.com',
]
  1. Run the test suite with:
(venv) export DJANGO_SETTINGS_MODULE=message_in_a_bottle.settings
(venv) pytest --cov
  1. Run your local Python server with:
(venv) python manage.py runserver

How To Use

To experience the front-end UI, please visit the application here. You can also hit our endpoints through an API client, such as Postman or HTTPie.

Endpoint Documentation

Domain: https://message-in-a-bottle-api.herokuapp.com

Stories Index Endpoint
The GET stories endpoint retrieves stories near you. You must supply valid longitude and latitude coordinates.

Query Params Required? Example Notes
latitude Yes /api/v1/stories?latitude=12.345&longitude=4.5968 requires longitude
longitude Yes /api/v1/stories?latitude=12.345&longitude=4.5968 requires latitude

Request: GET /api/v1/stories?latitude=12.3456&longitude=4.5968

Response:

{
  "data": {
    "input_location": "phoenix,az",
    "stories":[
      {
      "id": 1,
      "type": "story",
      "attributes": {
        "title": "my cool story",
        "latitude": 13.201,
        "longitude": 9.2673,
        "distance_in_miles": 1.2,
        "created_at": "2021-10-27T03:45:34.165600Z",
        "updated_at": "2021-10-27T03:45:36.855162Z"
        }
      },
      {
      "id": 2,
      "type": "story",
      "attributes": {
        "title": "story",
        "latitude": 13.563,
        "longitude": 10.2673,
        "distance_in_miles": 3,
        "created_at": "2021-10-27T04:45:34.165600Z",
        "updated_at": "2021-10-27T04:45:36.855162Z"
        }
      }
    ]
  }
}

Story Show Endpoint
Request: GET /api/v1/stories/:id?latitude=12.3456&longitude=-4.5968

Response:

{
  "data": {
    "id": 1,
    "type": "story",
    "attributes": {
      "title": "my cool story",
      "message": "This one time I saw a bird",
      "name": "Anonymous",
      "created_at": "2021-10-08T23:28:51.897746Z",
      "updated_at": "2021-10-08T23:28:51.897746Z",
      "latitude": 30.071945143440377,,
      "longitude": 31.225164325479227,
      "distance_in_miles": 1.2,
      "location": "Cairo Governorate, EG"
      }
   }
}

Directions Endpoint
Request: GET /api/v1/stories/:id/directions?latitude=1230&longitude=1209.3

Response:

{
  "data": [
    {
      "id": null,
      "type": "directions",
      "attributes": {
        "narrative": "Turn left on Bob St.",
        "distance": ".8 miles"
      }
    },
    {
      "id": null,
      "type": "directions",
      "attributes": {
        "narrative": "Turn right on Starry Road",
        "distance": ".2 miles"
      }
    }
  ]
}

Create Story Endpoint
Request: POST /api/v1/stories

Request Body:

{
  "title": "A new title",
  "message": "I'm coming up",
  "latitude": 27.717311514603534,
  "longitude": 85.32098499247293
}

Response:

{
  "data": {
    "id": 2,
    "type": "story",
    "attributes": {
      "title": "A new title",
      "message": "I'm coming up",
      "name": "Anonymous",
      "created_at": "2021-10-08T23:28:51.897746Z",
      "updated_at": "2021-10-08T23:28:51.897746Z",
      "latitude": 27.717311514603534,
      "longitude": 85.32098499247293,
      "location": "Kathmandu, NP"
    }
  }
}

Update Story Endpoint
Request: PATCH /api/v1/stories/:id

Request Body:

{
  "title": "My Fixed Title",
  "message": "Hello World.",
  "name": "Sally"
}

Response:

{
  "data": {
    "id": 1,
    "type": "story",
    "attributes": {
      "title": "My Fixed Title",
      "message": "Hello World.",
      "name": "Sally",
      "created_at": "2021-10-08T23:28:51.897746Z",
      "updated_at": "2021-10-18T23:28:51.897746Z",
      "latitude": 40.3830,
      "longitude": 105.5190,
      "location": "Estes Park, CO"
    }
  }
}

Delete Story Endpoint
Request: DELETE /api/v1/stories/:id

Error Handling
Here are some examples of error messages you could receive if you send an invalid request:

Bad Request URI: GET /api/v1/stories/:id or /api/v1/stories/:id?latitude=&longitude=

Response:

{
    "errors": {
        "messages": [
            "Latitude or longitude can't be blank."
        ],
        "code": 1
    }
}

Bad Request URI: GET /api/v1/stories/:id?latitude=1000&longitude=1000

Response:

{
    "errors": {
        "messages": [
            "Invalid latitude or longitude."
        ],
        "code": 1
    }
}

Bad Request URI: GET /api/v1/stories/:id?latitude=0&longitude=0

Response:

{
    "errors": {
        "messages": [
            "Impossible route."
        ],
        "code": 2
    }
}

POST /api/v1/stories Bad Request Body:

{
    "title":"Here's Johnny!",
    "message": "allworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboyallworkandnoplaymakesjackadullboy",
    "name":"Jack Torrance",
    "latitude":40.3830,
    "longitude":105.5190
}

Response:

{
    "errors": {
        "message": [
            "Ensure this field has no more than 1000 characters."
        ],
        "location": [
            "This field may not be blank."
        ]
    }
}

Database Schema

Screen Shot 2021-10-27 at 17 33 14

Contributing

👤 Marla Schulz

👤 Taylor Varoglu

👤 Matt Kragen

👤 Mae Duphorne

👤 Fara Akhatova

👤 Justin Anthony

Acknowledgements

Comments
  • Reverse geocode

    Reverse geocode

    • Changes Implemented:
      • Minor cleanup of test_services (i.e. noticed some duplicated imports, I suspect again due to merge conflict resolution along the way, and added additional self keywords to maintain consistency in syntax)
      • Abstracted base_urls() and api_key() to separate function calls to dry up code in MapService
      • Added a reverse geocode API call to convert lat/lon into a City, State output for GET /stories (index) and POST /stories endpoints. See example attribute for location within the following response, records are no longer blank (per default field value) Screen Shot 2021-10-24 at 16 29 32
        • Note, production and local DBs need to be reseeded to remove records with blank location fields
      • Refactor logic in GET /stories (index) endpoint to troubleshoot bug raised by FE team:
        • For the record, the coordinates submitted with the issue vs the coordinates Justin provided me earlier are not within a 25mi radius.. see outputs below from MapQuest reverse geocode and route API calls. So even after this PR, if we continue to troubleshoot based on these input coordinates, we will not be able to view stories across these distances, unless we expand the radius for MVP
          • Mae's coordinates: Screen Shot 2021-10-24 at 14 48 39
          • Justin's coordinates: Screen Shot 2021-10-24 at 14 48 59
          • Distance between the two: Screen Shot 2021-10-24 at 14 49 24

    TODO - Discuss the following:

    • Need to agree as a team if we would like to expand this distance radius. 1 degree of latitude is ~70 miles, so users have to be posting stories within <0.33 latitude delta (assuming exact same longitude) to view stories across different locations. I might suggest we expand the distance calc to 50 miles for MVP. We can easily scale back for a more manageable payload later on, but for troubleshooting, a wider distance radius might be easier to work with.

    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    • Blockers (if applicable):

    • Next Steps & Additional Notes:

      • [ ] Reseed production DB now that reverse geocoding logic is in place
      • [ ] Double-check bug resolution via Postman suite post-merge and/or expand distance radius based on team consensus
      • [ ] Confirm consistencies in distance calc for stories index vs stories show endpoints.. FE team mentioned inconsistency between the two, but with the changes implemented by this PR, we're now using the exact same API call to return distance_in_miles across all endpoints, so I suspect this bug may be resolved by this PR 🤞🏽
    bug Back-End Endpoint 
    opened by tvaroglu 1
  • Divergence in API Issues

    Divergence in API Issues

    Justin has pulled down main and is able to view all stories that have been added in the last few days, regardless of the mileage from his house. My main (which references the same endpoint) is no longer able to view any of these stories. I am able to post and view my own stories still, but do not have access to any Justin posts. Justin's main does not have access to any stories I post.

    Request: Screen Shot 2021-10-23 at 9 00 54 PM Response: {"data":{"input_location":"This is a temporary location!","stories":[{"id":"91","type":"story","attributes":{"title":"This is a test","distance_in_miles":0,"latitude":40.337408,"longitude":-104.9460736}}]}}

    The response is copy and pasted since the view screenshot on my dev tools cut half of it off. The response is only the story I posted while experimenting with this issue.

    bug Back-End Endpoint 
    opened by maeduphorne 1
  • Response refactor

    Response refactor

    • Changes Implemented:

      • Add endpoint PATCH /api/v1/stories/<int:pk>
      • Remove PUT from CORS_ALLOWED_METHODS in settings.py (only doing partial updates from FE for name, title, and message, and do not need a PUT request to update all attributes)
      • Refactor JSON responses for all deployed endpoints to adhere to 1.0 Spec
      • Backfill missing request tests for deployed endpoints, happy and sad path
      • Add function to capture lat/lon validation within POST /api/v1/stories endpoint, to ensure database is clear of stories with invalid coordinates
      • Refactor function call to validate coordinates for GET /stories?latitude=<lat>&longitude=<lon> to use same function call and DRY up code
      • Update Postman collection and environment variables now that DB is reseeded (pk's were reset so the GET request for a single story would produce a 404; already pre-wrote the env var for Prod, so this will all still pass post-merge)
      • Update Circle build commands to run pytest --cov for that fancy schmancy coverage report that is so uber-satisfying to look at
    • Quality Control Checklist:

      • [x] >= 20% test coverage
        • 99% yo!!!
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
    • Blockers (if applicable): None

    • Next Steps & Additional Notes:

      • Wrap up GeoLoc logic for index and show endpoints
    bug DevOps Back-End Database Architecture Endpoint 
    opened by tvaroglu 1
  • Stories index logic

    Stories index logic

    • Changes Implemented:

      • Connect stories index endpoint to mapquest radius search call.
      • Add logic to validate longitude and latitude.
      • Add validation errors and flow to views story POST action
      • Testing for all of the above
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    • Blockers (if applicable):

    • Had to sanitize database to remove invalid longitudes and latitudes.

    • Connecting original serializer to validation flow

    • Next Steps & Additional Notes:

    • Check work on POST action between branches before merge.

    Back-End Database Endpoint 
    opened by marlitas 1
  • Consume

    Consume

    • Changes Implemented:

      • Created services file for API endpoint requests.
      • Added logic to Story model to parse stories into dicts.
      • Testing for model methods and service methods.
      • Used dotenv to access environment variables in MapService class
      • Dropped database and removed sessions and static files default Django apps
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    • Blockers (if applicable):

    • Getting pytest fixtures up and running was tricky, but finally able to get django talking to test database by updating authorization for defaultuser.

    • Next Steps & Additional Notes:

    • Must update directory structure and settings files to match main for circleCI build pass.

    opened by marlitas 1
  • Post request

    Post request

    • Changes Implemented:

      • Refactor api.urls.py to dry up logic (keep api/v1 namespacing within Django project root vs app module)
      • Refactor api.views.py to use Class-based views (vs Function-based views in prior implementation)
      • Add the following endpoints with a fully functional Postman suite to test the implementation of the following:
        • [x] GET /api/v1/stories (index of all stories, note, still more work to be done here once geoloc API is integrated)
        • [x] GET /api/v1/stories/<id:pk> (retrieve an individual story)
        • [x] POST /api/v1/stories (create a new story)
        • [x] DEL /api/v1/stories/<id:pk> (delete an individual story)
      • Add Postman environment vars for Dev and Prod into postman dir, so you can import both and toggle between the two, for future testing phases
      • Update PR Template to add check / step to update Postman collection (if any changes made to endpoints that could break tests as currently written).
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
    • Blockers (if applicable): None, but a special thank you to the Django docs for the incorrect tutorial on how to build routes!! 🤦🏽‍♂️

    • Next Steps & Additional Notes:

      • [x] Complete PATCH / PUT endpoint to update a story
      • [x] Integrate 3rd Party Geoloc API to complete the stories 'index' endpoint implementation
      • [x] Continue to add to Postman suite and write pytest request specs (if they exist). Admittedly, have done zero research on this, and have just been using Postman to get our endpoints tested and deployed as quickly as possible for the FE team.
    DevOps Back-End Architecture Endpoint 
    opened by tvaroglu 1
  • Cors config

    Cors config

    • Changes Implemented: A lot

      • Slim down .circleci/config.yml to remove duplicated requirements.txt install step during builds
      • Rename quickstart across the entire repo to be api for correct namespacing of our urls
        • EXTREMELY IMPORTANT NOTE: You have recreate your default postgres user for the 'new' database. The only commands you have to run are:
          • [x] CREATE DATABASE api;
          • [x] GRANT ALL PRIVILEGES ON DATABASE api TO defaultuser;
          • [x] \q
      • Remove all static files that are technically unneeded given that this is an api-only backend that doesn't have traditional rendered views. FYI - I tried just removing the directory entirely, but it kept recreating (empty) each time I re-ran my server, so I think the easiest solution is to just delete all files locally. I am nervous to .gitignore the directory entirely, in case that causes issues with production. I remember in the initial setup this directory was needed for some reason.
        • [x] Please take note and update local directories accordingly, so these files do not re-merge on the next PR(s). I'm probably being overly-cautious here, but this is all uncharted territory after all!
      • Add urls, serializer methods, and view actions for the following endpoints:
        • GET api/v1/stories (index)
        • GET api/v1/stories/<:id> (show)
        • POST api/v1/stories (create)
        • PUT api/v1/stories/<:id> (update)
        • DEL api/v1/stories/<:id> (delete)
      • Add CORS configuration to settings.py, and clean up the file a bit (comments, extra empty lines)
      • Refreeze requirements.txt based on additional packages to support CORS configs
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Last Commit passes CircleCI build
    • Blockers (if applicable): None, but good golly this was some tricky stuff!!

    • Next Steps & Additional Notes:

      • Ensure FE team can fetch off the new endpoint, once deployed (will just be an empty array)
      • Create data for FE team to work with (assuming no additional endpoint troubleshooting to complete)
      • Customize serializers to format our data based on our proposed JSON contracts
      • Figure out how we are gonna test all this... if we can't find an rspec-like equivalent for request specs, I would propose we just write a Postman suite. This would be great JavaScript practice (I wrote one for SweaterWeather and had a ton of fun with it actually!!)
    Back-End Architecture Endpoint 
    opened by tvaroglu 1
  • Add additional origin to settings.py

    Add additional origin to settings.py

    • Changes Implemented:

      • Add additional origin to settings.py to test newest front-end build via mars buildpack
      • Shorten conditionals in views.py (remove unnecessary else statements)
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    bug Refactor 
    opened by tvaroglu 0
  • Docs

    Docs

    • Changes Implemented:

      • Updated endpoint documentation
      • Remove/Correct deprecated syntax
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [ ] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    • Blockers (if applicable):

    • Next Steps & Additional Notes:

    documentation Back-End 
    opened by matt-kragen 0
  • Api error handling

    Api error handling

    • Changes Implemented:

      • Refactor MapService function calls to account for MapQuest API rate limit being hit
      • Update Postman collection
      • Swap API keys in Heroku and CircleCI (not reflected in this PR, just noting for team visibility)
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [x] ReadMe updated if any changes to JSON Contracts
    • Additional Notes:

      • New Error Handling implemented as follows:
        • GET /stories (index): Instead of a 500 error, you'll just get back an empty stories array and no city_state (empty string), because we're unable to access MapQuest to retrieve the necessary data to complete this call.
        • GET /stories/<int:pk> and GET /stories/<int:pk>/directions: Instead of a 500 error, you'll get back the impossible route error that we've built in (because literally, it's impossible for us to route you there 🤣)
        • POST /stories: Instead of a 500, you'll get the location can't be blank error (because we're unable to convert lat/long into a city state, which is required to save new stories to the database)
      • All other endpoints are unaffected by this, so this (rare) edge case will now keep the app from erroring out completely, and will leverage the existing error handling for a 'fully functional' app status
    bug Back-End Error Handling 
    opened by tvaroglu 0
  • Vcr config

    Vcr config

    • Changes Implemented:

      • Configure and implement VCR for test suite
      • Update CircleCI configs to delete old cassettes on new build
      • Add additional Postman tests for directions endpoint
      • Fix broken loop in Postman test for Stories Index (use .forEach vs for loop)
      • Refreeze requirements.txt
    • Quality Control Checklist:

      • [x] >= 20% test coverage
      • [x] Postman collection updated (if any changes to endpoints)
      • [x] Last Commit passes CircleCI build
      • [ ] ReadMe updated if any changes to JSON Contracts
    • Blockers (if applicable):

    • Next Steps & Additional Notes:

      • [ ] Remove junk data from DB
      • [ ] Clean up docs
      • [ ] Perform demo for FE team
    DevOps Back-End Refactor Testing 
    opened by matt-kragen 0
Owner
null
Parametric Bottle in CADQuery

Parametric Bottle using CADQuery The proposed code makes it possible to generate different types and sizes of 3D bottles in order to train Pixel2mesh

Ayoub EL HOUDRI 1 May 22, 2022
A collection of repositories used to realise various end-to-end high-level synthesis (HLS) flows centering around the CIRCT project.

circt-hls What is this?: A collection of repositories used to realise various end-to-end high-level synthesis (HLS) flows centering around the CIRCT p

null 29 Dec 14, 2022
An end-to-end encrypted chat

An end-to-end encrypted chat, that allows users to anonymously talk without ip logs, personal info, or need for registration.

Privalise 1 Nov 27, 2021
Safely pass trusted data to untrusted environments and back.

ItsDangerous ... so better sign this Various helpers to pass data to untrusted environments and to get it back safe and sound. Data is cryptographical

The Pallets Projects 2.6k Jan 1, 2023
Compile Binary Ninja's HLIL IR to LLVM, for purposes of compiling it back to a binary again.

Compiles BinaryNinja's HLIL to LLVM Approach Sweep binary for global variables, create them Sweep binary for (used?) external functions, declare those

Kyle Martin 31 Nov 10, 2022
NORETURN is an esoteric programming language, based around the idea of not going back

NORETURN NORETURN is an esoteric programming language, based around the idea of not going back Concept Program coded in noreturn runs over one array,

null 1 Dec 15, 2021
This is the core of the program which takes 5k SYMBOLS and looks back N years to pull in the daily OHLC data of those symbols and saves them to disc.

This is the core of the program which takes 5k SYMBOLS and looks back N years to pull in the daily OHLC data of those symbols and saves them to disc.

Daniel Caine 1 Jan 31, 2022
Repo Home WPDrawBot - (Repo, Home, WP) A powerful programmatic 2D drawing application for MacOS X which generates graphics from Python scripts. (graphics, dev, mac)

DrawBot DrawBot is a powerful, free application for macOS that invites you to write Python scripts to generate two-dimensional graphics. The built-in

Frederik Berlaen 342 Dec 27, 2022
Konomi: Kind and Optimized Next brOadcast watching systeM Infrastructure

Konomi 備考・注意事項 現在 α 版で、まだ実験的なプロダクトです。通常利用には耐えないでしょうし、サポートもできません。 安定しているとは到底言いがたい品質ですが、それでも構わない方のみ導入してください。 使い方などの説明も用意できていないため、自力でトラブルに対処できるエンジニアの方以外に

tsukumi 243 Dec 30, 2022
HiSim - House Infrastructure Simulator

HiSim is a Python package for simulation and analysis of household scenarios using modern components as alternative to fossil fuel based ones.

FZJ-IEK3 17 Dec 17, 2022
MuMMI Core is the underlying infrastructure and generalizable component of the MuMMI framework

MuMMI Core is the underlying infrastructure and generalizable component of the MuMMI framework, which facilitates the coordination of massively parallel multiscale simulations.

null 4 Aug 17, 2022
Basic infrastructure for writing scripts in Python

Base Script Python is an excellent language that makes writing scripts very straightforward. Over the course of writing many scripts, we realized that

Deep Compute, LLC 9 Jan 7, 2023
This repository holds those infrastructure-level modules, that every application requires that follows the core 12-factor principles.

py-12f-common About This repository holds those infrastructure-level modules, that every application requires that follows the core 12-factor principl

Tamás Benke 1 Dec 15, 2022
To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio and Selenium. It works on my Raspberry Pi computer.

COVID-19_vaccine_appointment To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio a

Ayyuce Demirbas 24 Dec 17, 2022
Check a discord message and give it a percentage of scamminess

scamChecker Check a discord message and give it a percentage of scamminess Run the bot, and run the command !scamCheck and it will return a percentage

null 3 Sep 22, 2022
Provide error messages for Python exceptions, even if the original message is empty

errortext is a Python package to provide error messages for Python exceptions, even if the original message is empty.

Thomas Aglassinger 0 Dec 7, 2021
Very Simple 2 Message Spammer!

Very Simple 2 Message Spammer!

Syntax. 4 Dec 6, 2022
Blender addon for executing the operator in response to the received OSC message.

I/F Joiner 受信したOSCメッセージに応じてオペレータ(bpy.ops)を実行するアドオンです. OSC通信に対応したコントローラやアプリをインストールしたスマートフォンを使用してBlenderを操作することが可能になります. 同時開発しているAndroidコントローラ化アプリMocopa

simasimataiyo 6 Oct 2, 2022
This is a Python 3.10 port of mock, a library for manipulating human-readable message strings.

This is a Python 3.10 port of mock, a library for manipulating human-readable message strings.

Alexander Bartolomey 1 Dec 31, 2021