Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/frewtypebbles/jsonqm
A JSON query model tool that makes API requests more versatile.
https://github.com/frewtypebbles/jsonqm
json json-api model query
Last synced: 14 days ago
JSON representation
A JSON query model tool that makes API requests more versatile.
- Host: GitHub
- URL: https://github.com/frewtypebbles/jsonqm
- Owner: FrewtyPebbles
- License: mit
- Created: 2023-06-06T08:52:21.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-06-12T22:13:09.000Z (8 months ago)
- Last Synced: 2024-12-20T15:44:53.339Z (about 1 month ago)
- Topics: json, json-api, model, query
- Language: Python
- Homepage: https://pypi.org/project/jsonQM/
- Size: 15.6 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# jsonQM
A simple tool that can make your API endpoint json queries more functional.
`pip install jsonQM`
## Quick Start
The example model explains how to set up a model and query that model.
*tests/ExampleModel.py*
```py
from jsonQM import *# Make the model.
# Declare a model serializer
ms = ModelSerializer() # Each model must have its own serializer
class MyModel(Model):
def __init__(self) -> None:
# define the structure of the query model:
self.model = {
# we have a single query scope/section called functions
"functions":{},
"msg":"test" # non functional attributes also need to be included in the json query if you wish for them to be present in the response (see Example query 3 below)
}
# sync/add the model attribute functions to the model
ms.sync(self)
# Define attributes of the model (argument 2) along with the scope/section they are found in (argument 1)
@ms.add(["functions"], "repeater") # This attribute key is "repeater" and can be found in the "functions" dict
def repeater(self, arg:int):
# when the attribute is queried it will run this code and return the value
return ["repeat" for _ in range(arg)]# You can use anything as the attribute key that is a valid python dictionary key.
@ms.add(["functions"], 7)# Keep in mind that if used with json, you are limited to what is a valid json key.
def number_7(self):
return "abc"
@ms.token()# this marks this attribute as the model's token
@ms.add([], "token")
def token(self, tok:str):
#insert some logic to compare token to tokens in database
return tok == "token" # The token function must return true for the token to be valid.
@ms.requires_token()# this marks this attribute as requiring the token attribute to return true
@ms.add([], "secret")
def secret(self):
return "My super secret message" # if the token is false this will return 'errot:token:invalid' if the token is missing from the query this will return 'error:token:missing'#LOGIC
if __name__ == "__main__":
# If you are experiencing bugs related to concurrency, you should reinstantiate your model per thread/concurrent task where it is being used.
# note that instantiation may require many itterations depending on the ammount of attributes you've added and the length of their parent path.
# (parent path is the first list argument in `ms.add(["some","dictionary","key","path"], "attribute name")`)
model_instance = MyModel()# If you can avoid instantiating the model more than once for optimal performance.
#Example query 1
print(model_instance.get({
"functions":{
# programmed attribute values should be a list containing the function arguments.
"repeater":[5],
7:[]
}
}))# prints:
# {'functions': {'repeater': ['repeat', 'repeat', 'repeat', 'repeat', 'repeat'], 7: 'abc'}}#Example query 2
print(model_instance.get({
"functions":{
# The model will only run/return attributes which have been specified
"repeater":[5]
}
}))# prints:
# {'functions': {'repeater': ['repeat', 'repeat', 'repeat', 'repeat', 'repeat']}}#Example query 3
print(model_instance.get({
"token":["token"],
"secret":[]
}))# prints:
# {'token': True, 'secret': 'My super secret message'}#Example query 3
print(model_instance.get({
"token":["abc"],
"secret":[]
}))# prints:
# {'token': False, 'secret': 'error:token:invalid'}#Example query 3
print(model_instance.get({
"secret":[]
}))# prints:
# {'secret': 'error:token:missing'}#Example query 3
print(model_instance.get({
"msg":1
}))# prints:
# {'msg': 'test'}
```