Backend
This commit is contained in:
		
							parent
							
								
									a03953a0ab
								
							
						
					
					
						commit
						84a1e7d972
					
				
					 71 changed files with 22530 additions and 0 deletions
				
			
		
							
								
								
									
										0
									
								
								.gitignore → ember-ui/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								.gitignore → ember-ui/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
								
								
									
										0
									
								
								package-lock.json → ember-ui/package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										0
									
								
								package-lock.json → ember-ui/package-lock.json
									
										
									
										generated
									
									
									
								
							
							
								
								
									
										1
									
								
								python-api/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								python-api/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| /__pycache__ | ||||
							
								
								
									
										112
									
								
								python-api/.ropeproject/config.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								python-api/.ropeproject/config.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,112 @@ | |||
| # The default ``config.py`` | ||||
| # flake8: noqa | ||||
| 
 | ||||
| 
 | ||||
| def set_prefs(prefs): | ||||
|     """This function is called before opening the project""" | ||||
| 
 | ||||
|     # Specify which files and folders to ignore in the project. | ||||
|     # Changes to ignored resources are not added to the history and | ||||
|     # VCSs.  Also they are not returned in `Project.get_files()`. | ||||
|     # Note that ``?`` and ``*`` match all characters but slashes. | ||||
|     # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' | ||||
|     # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' | ||||
|     # '.svn': matches 'pkg/.svn' and all of its children | ||||
|     # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' | ||||
|     # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' | ||||
|     prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', | ||||
|                                   '.hg', '.svn', '_svn', '.git', '.tox'] | ||||
| 
 | ||||
|     # Specifies which files should be considered python files.  It is | ||||
|     # useful when you have scripts inside your project.  Only files | ||||
|     # ending with ``.py`` are considered to be python files by | ||||
|     # default. | ||||
|     #prefs['python_files'] = ['*.py'] | ||||
| 
 | ||||
|     # Custom source folders:  By default rope searches the project | ||||
|     # for finding source folders (folders that should be searched | ||||
|     # for finding modules).  You can add paths to that list.  Note | ||||
|     # that rope guesses project source folders correctly most of the | ||||
|     # time; use this if you have any problems. | ||||
|     # The folders should be relative to project root and use '/' for | ||||
|     # separating folders regardless of the platform rope is running on. | ||||
|     # 'src/my_source_folder' for instance. | ||||
|     #prefs.add('source_folders', 'src') | ||||
| 
 | ||||
|     # You can extend python path for looking up modules | ||||
|     #prefs.add('python_path', '~/python/') | ||||
| 
 | ||||
|     # Should rope save object information or not. | ||||
|     prefs['save_objectdb'] = True | ||||
|     prefs['compress_objectdb'] = False | ||||
| 
 | ||||
|     # If `True`, rope analyzes each module when it is being saved. | ||||
|     prefs['automatic_soa'] = True | ||||
|     # The depth of calls to follow in static object analysis | ||||
|     prefs['soa_followed_calls'] = 0 | ||||
| 
 | ||||
|     # If `False` when running modules or unit tests "dynamic object | ||||
|     # analysis" is turned off.  This makes them much faster. | ||||
|     prefs['perform_doa'] = True | ||||
| 
 | ||||
|     # Rope can check the validity of its object DB when running. | ||||
|     prefs['validate_objectdb'] = True | ||||
| 
 | ||||
|     # How many undos to hold? | ||||
|     prefs['max_history_items'] = 32 | ||||
| 
 | ||||
|     # Shows whether to save history across sessions. | ||||
|     prefs['save_history'] = True | ||||
|     prefs['compress_history'] = False | ||||
| 
 | ||||
|     # Set the number spaces used for indenting.  According to | ||||
|     # :PEP:`8`, it is best to use 4 spaces.  Since most of rope's | ||||
|     # unit-tests use 4 spaces it is more reliable, too. | ||||
|     prefs['indent_size'] = 4 | ||||
| 
 | ||||
|     # Builtin and c-extension modules that are allowed to be imported | ||||
|     # and inspected by rope. | ||||
|     prefs['extension_modules'] = [] | ||||
| 
 | ||||
|     # Add all standard c-extensions to extension_modules list. | ||||
|     prefs['import_dynload_stdmods'] = True | ||||
| 
 | ||||
|     # If `True` modules with syntax errors are considered to be empty. | ||||
|     # The default value is `False`; When `False` syntax errors raise | ||||
|     # `rope.base.exceptions.ModuleSyntaxError` exception. | ||||
|     prefs['ignore_syntax_errors'] = False | ||||
| 
 | ||||
|     # If `True`, rope ignores unresolvable imports.  Otherwise, they | ||||
|     # appear in the importing namespace. | ||||
|     prefs['ignore_bad_imports'] = False | ||||
| 
 | ||||
|     # If `True`, rope will insert new module imports as | ||||
|     # `from <package> import <module>` by default. | ||||
|     prefs['prefer_module_from_imports'] = False | ||||
| 
 | ||||
|     # If `True`, rope will transform a comma list of imports into | ||||
|     # multiple separate import statements when organizing | ||||
|     # imports. | ||||
|     prefs['split_imports'] = False | ||||
| 
 | ||||
|     # If `True`, rope will remove all top-level import statements and | ||||
|     # reinsert them at the top of the module when making changes. | ||||
|     prefs['pull_imports_to_top'] = True | ||||
| 
 | ||||
|     # If `True`, rope will sort imports alphabetically by module name instead of | ||||
|     # alphabetically by import statement, with from imports after normal | ||||
|     # imports. | ||||
|     prefs['sort_imports_alphabetically'] = False | ||||
| 
 | ||||
|     # Location of implementation of rope.base.oi.type_hinting.interfaces.ITypeHintingFactory | ||||
|     # In general case, you don't have to change this value, unless you're an rope expert. | ||||
|     # Change this value to inject you own implementations of interfaces | ||||
|     # listed in module rope.base.oi.type_hinting.providers.interfaces | ||||
|     # For example, you can add you own providers for Django Models, or disable the search | ||||
|     # type-hinting in a class hierarchy, etc. | ||||
|     prefs['type_hinting_factory'] = 'rope.base.oi.type_hinting.factory.default_type_hinting_factory' | ||||
| 
 | ||||
| 
 | ||||
| def project_opened(project): | ||||
|     """This function is called after opening the project""" | ||||
|     # Do whatever you like here! | ||||
							
								
								
									
										
											BIN
										
									
								
								python-api/.ropeproject/globalnames
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								python-api/.ropeproject/globalnames
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								python-api/.ropeproject/history
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								python-api/.ropeproject/history
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								python-api/.ropeproject/objectdb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								python-api/.ropeproject/objectdb
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										13
									
								
								python-api/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								python-api/README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| # Python Backend for Sortable Recipes (EmberConf 2020) | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| ```bash | ||||
| pip3 install requests gunicorn pycnic | ||||
| gunicorn api:app | ||||
| ``` | ||||
| 
 | ||||
| ### Available Endpoints: | ||||
| 
 | ||||
| `http://localhost:8000/meals/random` | ||||
| `http://localhost:8000/meal/{meal_id}` | ||||
							
								
								
									
										
											BIN
										
									
								
								python-api/__pycache__/api.cpython-37.pyc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								python-api/__pycache__/api.cpython-37.pyc
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								python-api/__pycache__/key_replacer.cpython-37.pyc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								python-api/__pycache__/key_replacer.cpython-37.pyc
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										71
									
								
								python-api/api.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								python-api/api.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,71 @@ | |||
| from pycnic.core import WSGI, Handler | ||||
| from key_replacer import KeyReplacer | ||||
| import requests | ||||
| import json | ||||
| 
 | ||||
| class Base(Handler): | ||||
|     hostname = "https://www.themealdb.com/api/json/v1/1/" | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         self.replacable_keys = KeyReplacer( | ||||
|             [ | ||||
|                 ["idMeal", "id"], | ||||
|                 ["strMeal", "name"], | ||||
|                 ["strCategory", "category"], | ||||
|                 ["strArea", "area"], | ||||
|                 ["strInstructions", "instructions"], | ||||
|                 ["strDrinkAlternate", "alternate_drink"], | ||||
|                 ["strMealThumb", "thumbnail_url"], | ||||
|                 ["strTags", "tags"], | ||||
|                 ["strYoutube", "youtube_url"], | ||||
|                 ["strSource", "source_url"], | ||||
|                 ["dateModified", "date_modified"], | ||||
|             ]) | ||||
|     def cleanup(self, meal): | ||||
|         self.replacable_keys.do_replace(meal) | ||||
|         self.cleanup_ingredients(meal) | ||||
| 
 | ||||
|     def cleanup_ingredients(self, meal): | ||||
|         potential_length = 20 | ||||
|         true_length = 0 | ||||
|         # Cleanup Empty Values | ||||
|         for i in reversed(range(potential_length)): | ||||
|             x = str(i + 1) | ||||
|             if (meal["strIngredient" + x] == ''): | ||||
|                 true_length = i | ||||
|                 del meal["strIngredient" + x] | ||||
|                 del meal["strMeasure" + x] | ||||
| 
 | ||||
|         # Convert Ingredients/Measures to Array of Objects | ||||
|         meal["ingredients"] = [0]*true_length | ||||
|         for i in range(0, true_length): | ||||
|             x = str(i + 1) | ||||
|             meal["ingredients"][i] = { | ||||
|                     "name": meal["strIngredient" + x], | ||||
|                     "measure": meal["strMeasure" + x], | ||||
|                 } | ||||
|             del meal["strIngredient" + x] | ||||
|             del meal["strMeasure" + x] | ||||
| 
 | ||||
| class Details(Base): | ||||
|     def get(self, meal_id = ''): | ||||
|         response = json.loads(requests.get(self.hostname + "lookup.php?i=" + meal_id).text) | ||||
|         for meal in response["meals"]: | ||||
|             self.cleanup(meal) | ||||
| 
 | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
| 
 | ||||
| class Random(Base): | ||||
|     def get(self): | ||||
|         response = json.loads(requests.get(self.hostname + "random.php").text) | ||||
|         for meal in response["meals"]: | ||||
|             self.cleanup(meal) | ||||
| 
 | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
| class app(WSGI): | ||||
|   routes = [ | ||||
|     ("/meals/random", Random()), | ||||
|     ("/meal/([\w]+)", Details()) | ||||
|   ] | ||||
							
								
								
									
										22318
									
								
								python-api/get-pip.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22318
									
								
								python-api/get-pip.py
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										15
									
								
								python-api/key_replacer.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								python-api/key_replacer.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| class KeyReplacer(): | ||||
|     def __init__(self, replacements = []): | ||||
|         self.replacements = self._build_replacements(replacements) | ||||
| 
 | ||||
|     def _build_replacements(self, replacements): | ||||
|         return list(map(lambda r: { "old": r[0], "new": r[1] }, replacements)) | ||||
| 
 | ||||
|     def _rename(self, obj, old_key, new_key): | ||||
|         obj[new_key] = obj[old_key] | ||||
|         del obj[old_key] | ||||
| 
 | ||||
|     def do_replace(self, obj): | ||||
|         for replacement in self.replacements: | ||||
|             self._rename(obj, replacement["old"], replacement["new"]) | ||||
| 
 | ||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ava Gaiety Wroten
						Ava Gaiety Wroten