init
This commit is contained in:
		
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| __pycache__/ | ||||
| *.egg-info/ | ||||
| build/ | ||||
| dist/ | ||||
| *.pyc | ||||
| *.swp | ||||
| *~ | ||||
							
								
								
									
										24
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| This is free and unencumbered software released into the public domain. | ||||
|  | ||||
| Anyone is free to copy, modify, publish, use, compile, sell, or | ||||
| distribute this software, either in source code form or as a compiled | ||||
| binary, for any purpose, commercial or non-commercial, and by any | ||||
| means. | ||||
|  | ||||
| In jurisdictions that recognize copyright laws, the author or authors | ||||
| of this software dedicate any and all copyright interest in the | ||||
| software to the public domain. We make this dedication for the benefit | ||||
| of the public at large and to the detriment of our heirs and | ||||
| successors. We intend this dedication to be an overt act of | ||||
| relinquishment in perpetuity of all present and future rights to this | ||||
| software under copyright law. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||
| OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
| OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| For more information, please refer to <http://unlicense.org/> | ||||
							
								
								
									
										23
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| # jwrap | ||||
|  | ||||
| **jwrap** — is a single-file micro-library that implements JSON wrapper. Its mission is to make interacting with JSON a little bit easier without writing extra code. | ||||
|  | ||||
| More information is available in docstrings: | ||||
|  | ||||
| ``` | ||||
| >>> import jwrap | ||||
| >>> help(jwrap) | ||||
| ``` | ||||
|  | ||||
| ## Quickstart | ||||
|  | ||||
| For example, you can write some data to json file by this: | ||||
|  | ||||
| ```python | ||||
| from jwrap import Jwrap | ||||
|  | ||||
| j = Jwrap('myfile.json') | ||||
| j.json['mykey'] = 'my value' | ||||
| # or: j.ins('mykey', 'my value') | ||||
| j.commit()  # write data to file | ||||
| ``` | ||||
							
								
								
									
										121
									
								
								jwrap.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								jwrap.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| """jwrap -- is a single-file micro-library that implements | ||||
| JSON wrapper. Its mission is to make interacting with JSON | ||||
| a little bit easier without writing extra code. | ||||
|  | ||||
| License: Unlicense (See LICENSE for details). | ||||
| """ | ||||
|  | ||||
| __version__ = '0.3' | ||||
|  | ||||
| import os | ||||
| import json | ||||
|  | ||||
|  | ||||
| def read_file(path_to_file: str): | ||||
|     """Return the file data from `path_to_file`.""" | ||||
|     with open(path_to_file, 'r') as json_file: | ||||
|         return json_file.read() | ||||
|  | ||||
| def write_to_file(path_to_file: str, data): | ||||
|     """Write `data` to file from `path_to_file`.""" | ||||
|     with open(path_to_file, 'w') as json_file: | ||||
|         return json_file.write(data) | ||||
|  | ||||
| def load_json_from_file(path_to_file: str): | ||||
|     """Load JSON data from file from `path_to_file` by `json.load()`. | ||||
|     Previously call `read_file()`. | ||||
|     """ | ||||
|     return json.loads(read_file(path_to_file)) | ||||
|  | ||||
| def dump_json_to_file(path_to_file: str, data): | ||||
|     """Dump JSON data and write it to file from `path_to_file`. | ||||
|     `ensure_ascii` option is disabled, indentation is enabled. | ||||
|     """ | ||||
|     write_to_file( | ||||
|             path_to_file, | ||||
|             json.dumps(data, ensure_ascii=False, indent=4) | ||||
|         ) | ||||
|  | ||||
| class Jwrap(object): | ||||
|     """The Jwrap object provides a JSON file connection and implements | ||||
|     a number of methods for manipulating data. | ||||
|     Some of them duplicate the standard functionality of Python dicts | ||||
|     and they can be easily replaced with equivalents. For example:: | ||||
|  | ||||
|     obj.ins('key', 'value') | ||||
|     # is equivalent to: | ||||
|     obj.json()['key'] = 'value' | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, path_to_file): | ||||
|         """Check `path_to_file`, create directory if not exist | ||||
|         and create file if not exist. If file is empty write empty | ||||
|         dict into it. Load JSON from file. | ||||
|  | ||||
|         Varisbles: | ||||
|         `__file`      -- contains path to json file (`path_to_file`). | ||||
|         `__json_data` -- contains loaded JSON data from `__file`. | ||||
|         """ | ||||
|         dirname = os.path.dirname(path_to_file) | ||||
|         if dirname == '' or dirname == '.': | ||||
|             self.__file = path_to_file | ||||
|         else: | ||||
|             try: | ||||
|                 os.makedirs(dirname, exist_ok=True) | ||||
|                 self.__file = path_to_file | ||||
|             except OSError: | ||||
|                 return 'Error: Cannot create path: {}'.format(dirname) | ||||
|         if self.__file: | ||||
|             if not os.path.exists(self.__file) \ | ||||
|                or os.path.getsize(self.__file) == 0: | ||||
|                 write_to_file(self.__file, '{}') | ||||
|             self.__json_data = load_json_from_file(self.__file) | ||||
|  | ||||
|     def get_file(self) -> str: | ||||
|         """Return abspath to `__file`.""" | ||||
|         return os.path.abspath(self.__file) | ||||
|  | ||||
|     def json(self) -> dict: | ||||
|         """Return `__json_data`.""" | ||||
|         return self.__json_data | ||||
|  | ||||
|     def reload(self): | ||||
|         """Reload JSON data from file.""" | ||||
|         self.__json_data = load_json_from_file(self.__file) | ||||
|  | ||||
|     def commit(self): | ||||
|         """Write JSON data to file.""" | ||||
|         dump_json_to_file(self.__file, self.__json_data) | ||||
|  | ||||
|     def keys(self) -> list: | ||||
|         """Return root level key list.""" | ||||
|         return list(self.__json_data.keys()) | ||||
|  | ||||
|     def subkeys(self, key: str) -> list: | ||||
|         """Return list of `key` subkeys.""" | ||||
|         return list(self.__json_data[key].keys()) | ||||
|  | ||||
|     def keys_by_value(self, value) -> list: | ||||
|         """Return list of keys by value `value`""" | ||||
|         return [key for key, val in self.__json_data.items() if val == value] | ||||
|  | ||||
|     def ins(self, key: str, value): | ||||
|         """Insert `key` with value `value`.""" | ||||
|         self.__json_data[key] = value | ||||
|  | ||||
|     def inssub(self, key: str, subkey: str, value): | ||||
|         """Similar to `ins`, but for subset.""" | ||||
|         self.__json_data[key][subkey] = value | ||||
|  | ||||
|     def rem(self, key: str): | ||||
|         """Remove value from JSON by `key`.""" | ||||
|         del self.__json_data[key] | ||||
|  | ||||
|     def remsub(self, key: str, subkey: str): | ||||
|         """Similar to `rem`, but for subset. | ||||
|         Remove value by `subkey` of `key`. | ||||
|         """ | ||||
|         del self.__json_data[key][subkey] | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     pass | ||||
							
								
								
									
										24
									
								
								setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								setup.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| import setuptools | ||||
|  | ||||
|  | ||||
| with open("README.md", "r") as lg: | ||||
|     long_description = lg.read() | ||||
|  | ||||
| setuptools.setup( | ||||
|     name="jwrap", | ||||
|     py_modules=['jwrap'], | ||||
|     version="0.3", | ||||
|     author="gd", | ||||
|     author_email="gechandev@gmail.com", | ||||
|     description="Wrapper for easy interacting with JSON files.", | ||||
|     long_description=long_description, | ||||
|     long_description_content_type="text/markdown", | ||||
|     url="https://gitea.gch.icu/gd/jwrap/", | ||||
|     packages=setuptools.find_packages(), | ||||
|     classifiers=[ | ||||
|         "Programming Language :: Python :: 3.9", | ||||
|         "License :: OSI Approved :: The Unlicense (Unlicense)", | ||||
|         "Operating System :: OS Independent", | ||||
|     ], | ||||
|     python_requires='>=3.6', | ||||
| ) | ||||
		Reference in New Issue
	
	Block a user