Package: arkivist
arkivistArkivist is Python Dictionary wrapper for JSON files.Other behaviors are similar to native Python dictionaries, the tutorial below only covers add-on feature specific to Arkivist.Official ReleaseArkivistcan now be used on your Python projects through PyPi by running pip command on a Python-ready environment.pip install arkivist --upgradeCurrent version is 1.2.*, but more updates are coming soon. Installing it will also install required packages includingrequests.This is compatible with Python 3.9+ and is already used in various personal projects.Use-cases1.Need a lightweight data storage with zero application installations.2.The project is for personal or hobby with low number of users who simultaneously access the data storage.3.The project requires a data storage that has a fast learning curve due to resource or time constraints.Usage1. Import PackagefromarkivistimportArkivist2. Cast Python Dictionary to Arkivist objectCreate a new file if not yet existing.message=Arkivist({"hello":"world"})data={"a":"Ant","b":"Bug","c":"Cat"}animals=Arkivist(data,filepath="animals.json",mode="w+")3. Instantiate data from existing JSON fileBy default, autosave is set to True. To optimize, set autosave to False and perform manual saving after completely performing operations.storage=Arkivist("storage.json")4. Set JSON File indentation# indent = 1, 2, 3, or 4storage=Arkivist("storage.json",indent=2)5. Customize sorting optionsstorage=Arkivist("storage.json",autosort=True,reverse=False)6. Disable Autosavestorage=Arkivist("storage.json",autosave=False)storage.save()storage.save(save_as="storage-copy.json")7. Add new entryplaces=Arkivist("data/places.json")places.set(1,"Sun")places.set(2,"Earth")places.set(3,"Moon")# native update formatpeople=Arkivist("data/people.json")people.update({"juan":{"name":"Juan Dela Cruz"}})people.update({"maria":{"name":"Maria Dela Cruz"}})8. Get dictionary objectSet to read mode only, show an error if file does not exists.places=Arkivist("data/places.json",mode="r")print(places.show())9. Generate JSON-compliant stringplaces=Arkivist("data/places.json")print(places.string())10. Clear dictionary dataplaces=Arkivist("data/places.json",autosave=False)places.reset()11. Replace all contents# replace from a valid dictionarypeople=Arkivist("data/people.json")friends={"friend":{"name":"Friend"},"enemy":{"name":"Enemy"}}people.load(friends)# load from valid JSON stringanons="{\"robot\": {\"name\":\"Robot\"},\"ghost\": {\"name\":\"Ghost\"}}"people.load(anons)12. Check if empty or not## do not save to filepeople=Arkivist("data/people.json").reset()print("Count:",people.count(),"; Is empty: ",people.is_empty())13. Flatten the nested dictionarypeople=Arkivist("data/people.json")people.set("juan",{"name":"Juan Dela Cruz"})people.set("maria",{"name":"Maria Dela Cruz"})print(people.flatten())14. Fetch from a web APItodos=Arkivist()# autosave = False, data is only in memorytodos.fetch("https://jsonplaceholder.typicode.com/todos/1")print(todos.show())15. Get random key-value pairnames=Arkivist("names.json").reset()names.set("abc",{"name":"Abc"})names.set("dog",{"name":"Doggy"})names.set("juan",{"names":"Juan"})print("Random item:",names.random())16. Double check if expected key value is correctnumbers=Arkivist("numbers.json").reset()numbers.set("one":1)print("Doublecheck (1):",numbers.doublecheck("one",1))print("Doublecheck (2):",numbers.doublecheck("one",2))16. Perform shallow queriesnames=Arkivist("names.json")names.set("abc",{"name":"Abc"})names.set("dog",{"name":"Doggy"})names.set("juan",{"name":"Juan"})# exact matchforname,datainnames.where("name","Abc").query():print(name,data)# search containing the substringforname,datainnames.where("name","a",exact=False).query():print(name,data)# search containing the substring, case sensitivity = Falseforname,datainnames.where("name","a",exact=False,sensitivity=False).query():print(name,data)# search excluding the exact keywordforname,datainnames.where("name").exclude("Abc").query():print(name,data)# search excluding the items containing the keywordforname,datainnames.where("name").exclude("a",exact=False).query():print(name,data)# search excluding the items containing the keyword, case sensitivity = Falseforname,datainnames.where("name").exclude("A",exact=False,sensitivity=False).query():print(name,data)17. Find child of parentnames=Arkivist("names.json").reset()names.set("names",{})names.find("names").set("maria",1)print("Maria:",names.find("names").get("maria",0))print("Pedro:",names.find("names").get("pedro",0))18. Append/Extend/Remove items in listtest=Arkivist("tests.json").reset()test.append_in("colors","red")test.append_in("colors","orange")test.append_in("colors","yellow")test.append_in("colors",("blue","green"),unique=True,sort=True)test.remove_in("colors","yellow")test.remove_in("colors",("blue","purple"))test.set("numbers",{})test.find("numbers").append_in("odd",1)test.find("numbers").append_in("odd",(1,3,5,[7]))19. Encrypt JSON fileNOTE: Copy and securely store the auto-generated authetication file to maintain access to the JSON file. Otherwise, the actual data from the JSON file can no longer be accessed. Without the secure key, reading, writing, and decryption will not be allowed. If the authfile is invalid or not set, check for the filename of the auto-generated file and rename as needed and update the filename to your program source code to access the JSON file again.# Set the filename of the authentication fileweather=Arkivist("temp/encrypted.json",authfile="secret-key.txt")# To encrypt data, use the encrypt functionweather.encrypt()# Perform normal operations as neededweather.set("weather",{})weather.find("weather").set("2022-04-14","Cloudy")weather.find("weather").set("2022-04-15","Sunny")# to unencrypt, set to falseweather.encrypt(False)FuturesArkivist is an ongoing project and new features will be added in the future. In the future, it aims to add complex querying and also add a security layer to protect data from unauthorized access.ConclusionArkivist allows you to build your Python apps with a lightweight data storage, this can come handy especially when you are doing personal and hobby projects that handles simple data.Fun factArkivist is a play on the word Archive, which means a collection of historical documents or records. Arkivist is like your digital librarian that manages your important data for a lightweight and organized data storage.