diff --git a/.circleci/config.yml b/.circleci/config.yml index 24104c555..292183bb4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,39 +1,42 @@ version: 2.1 + +commands: + install: + steps: + - run: pip install . --user + - run: pip install -r requirements.txt --user + jobs: build: docker: - image: circleci/python:3.6 # primary container for the build job steps: - checkout - - run: make + - install - run: make test lint: docker: - image: circleci/python:3.6 # primary container for the build job steps: - checkout - - run: make + - install - run: make lint - python34: - docker: - - image: circleci/python:3.4 - steps: - - checkout - - run: make - - run: make test python35: docker: - - image: circleci/python:3.5 + - image: circleci/python:3.7 steps: - checkout - - run: make + - install - run: make test python37: docker: - - image: circleci/python:3.7 + - image: circleci/python:3.8.0b2-buster + auth: + username: jmancuso9 # can specify string literal values + password: $DOCKERHUB_PASSWORD steps: - checkout - - run: make + - install - run: make test python38: docker: @@ -47,31 +50,28 @@ jobs: - image: circleci/python:3.6 steps: - checkout + - install - run: pip install -r requirements.txt --user - run: make coverage - run: make deepsource orbs: - masonite: masonite/trigger@dev:latest + masonite: masonite/trigger@1.0.0 workflows: version: 2 build_and_test: jobs: - - build: + - build: # Python 3.6 filters: # required since `deploy` has tag filters AND requires `build` tags: only: /^.*/ - - lint: + - lint: # Python 3.6 requires: - build filters: # required since `deploy` has tag filters AND requires `build` tags: only: /^.*/ - - python34: - filters: # required since `deploy` has tag filters AND requires `build` - tags: - only: /^.*/ - python35: filters: # required since `deploy` has tag filters AND requires `build` tags: diff --git a/.deepsource.toml b/.deepsource.toml index fff2d73c3..8271570e0 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -3,8 +3,8 @@ version = 1 test_patterns = [ 'tests/**/*.py', - 'masonite/testing/*.py', - 'masonite/testsuite/*.py', + 'src/masonite/testing/*.py', + 'src/masonite/testsuite/*.py', 'testpackage/*.py' ] diff --git a/MANIFEST.in b/MANIFEST.in index 215c8789d..53600b6e4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,7 @@ -include masonite/snippets/exceptions/css/* -include masonite/snippets/exceptions/* -include masonite/snippets/* -include masonite/snippets/migrations/* -include masonite/snippets/scaffold/* -include masonite/snippets/auth/controllers/* -include masonite/snippets/auth/templates/auth/* \ No newline at end of file +include src/masonite/snippets/exceptions/css/* +include src/masonite/snippets/exceptions/* +include src/masonite/snippets/* +include src/masonite/snippets/migrations/* +include src/masonite/snippets/scaffold/* +include src/masonite/snippets/auth/controllers/* +include src/masonite/snippets/auth/templates/auth/* \ No newline at end of file diff --git a/Makefile b/Makefile index 8819192d8..e03e5722b 100644 --- a/Makefile +++ b/Makefile @@ -8,12 +8,12 @@ ci: make test make lint lint: - python -m flake8 masonite/ --ignore=E501,F401,E128,E402,E731,F821,E712,W503 + python -m flake8 src/masonite/ --ignore=E501,F401,E128,E402,E731,F821,E712,W503 deepsource: curl https://deepsource.io/cli | sh ./bin/deepsource report --analyzer test-coverage --key python --value-file ./coverage.xml coverage: - python -m pytest --cov-report term --cov-report xml --cov=masonite tests/ + python -m pytest --cov-report term --cov-report xml --cov=src/masonite tests/ python -m coveralls publish: pip install 'twine>=1.5.0' diff --git a/app/http/controllers/ConfirmController.py b/app/http/controllers/ConfirmController.py new file mode 100644 index 000000000..701178a42 --- /dev/null +++ b/app/http/controllers/ConfirmController.py @@ -0,0 +1,70 @@ +"""The ConfirmController Module.""" +import datetime + +from src.masonite.auth import Auth, MustVerifyEmail +from src.masonite.auth.Sign import Sign +from src.masonite.managers import MailManager +from src.masonite.request import Request +from src.masonite.view import View +from src.masonite.helpers import config + + +class ConfirmController: + """The ConfirmController class.""" + + def __init__(self): + """The ConfirmController Constructor.""" + pass + + def verify_show(self, view: View, auth: Auth): + """Show the Verify Email page for unverified users. + + Arguments: + request {masonite.request.request} -- The Masonite request class. + request {masonite.view.view} -- The Masonite view class. + request {masonite.auth.auth} -- The Masonite Auth class. + + Returns: + [type] -- [description] + """ + return view.render('auth/verify', {'app': config('application'), 'Auth': auth}) + + def confirm_email(self, request: Request, view: View, auth: Auth): + """Confirm User email and show the correct response. + + Arguments: + request {masonite.request.request} -- The Masonite request class. + request {masonite.view.view} -- The Masonite view class. + request {masonite.auth.auth} -- The Masonite Auth class. + + Returns: + [type] -- [description] + """ + sign = Sign() + token = sign.unsign(request.param('id')) + + if token is not None: + tokenParts = token.split("::") + if len(tokenParts) > 1: + user = auth.auth_model.find(tokenParts[0]) + + if user.verified_at is None: + timestamp = datetime.datetime.fromtimestamp(float(tokenParts[1])) + now = datetime.datetime.now() + timestamp_plus_10 = timestamp + datetime.timedelta(minutes=10) + + if now < timestamp_plus_10: + user.verified_at = datetime.datetime.now() + user.save() + + return view.render('auth/confirm', {'app': config('application'), 'Auth': auth}) + + return view.render('auth/error', {'app': config('application'), 'Auth': auth}) + + def send_verify_email(self, manager: MailManager, request: Request): + user = request.user() + + if isinstance(user, MustVerifyEmail): + user.verify_email(manager, request) + + return request.redirect('/home') diff --git a/app/http/controllers/ControllerTest.py b/app/http/controllers/ControllerTest.py index 660887315..b1176f7d3 100644 --- a/app/http/controllers/ControllerTest.py +++ b/app/http/controllers/ControllerTest.py @@ -1,5 +1,5 @@ -from masonite.request import Request -from masonite.view import View +from src.masonite.request import Request +from src.masonite.view import View class ControllerTest: diff --git a/app/http/controllers/TestController.py b/app/http/controllers/TestController.py index 2675d3dc8..ea92de22f 100644 --- a/app/http/controllers/TestController.py +++ b/app/http/controllers/TestController.py @@ -1,7 +1,7 @@ from app.jobs.TestJob import TestJob -from masonite import Queue -from masonite.request import Request -from masonite.view import View +from src.masonite import Queue, Mail +from src.masonite.request import Request +from src.masonite.view import View class TestController: @@ -29,7 +29,7 @@ def change_404(self, request: Request): def testing(self): return 'test' - def json_response(self, request: Request): + def json_response(self): return {'id': 2} def post_test(self): @@ -53,3 +53,6 @@ def queue(self, queue: Queue): # queue.driver('amqp').push(self.bad) queue.driver('amqp').push(TestJob, channel='default') return 'queued' + + def mail(self, mail: Mail): + return mail.to('idmann509@gmail.com').template('test', {'test': 'mail'}) diff --git a/app/http/controllers/UnitTestController.py b/app/http/controllers/UnitTestController.py index 3a75cef65..07d313e0f 100644 --- a/app/http/controllers/UnitTestController.py +++ b/app/http/controllers/UnitTestController.py @@ -1,7 +1,7 @@ """A UnitTestController Module.""" -from masonite.request import Request -from masonite.controllers import Controller +from src.masonite.request import Request +from src.masonite.controllers import Controller class UnitTestController(Controller): diff --git a/app/http/controllers/WelcomeController.py b/app/http/controllers/WelcomeController.py index 1d47598a2..d2c0ebd67 100644 --- a/app/http/controllers/WelcomeController.py +++ b/app/http/controllers/WelcomeController.py @@ -1,14 +1,13 @@ """Welcome The User To Masonite.""" -from masonite.view import View -from masonite.request import Request -from masonite.controllers import Controller +from src.masonite.view import View +from src.masonite.controllers import Controller class WelcomeController(Controller): """Controller For Welcoming The User.""" - def show(self, view: View, request: Request): + def show(self, view: View): """Show the welcome page. Arguments: diff --git a/app/http/middleware/AddAttributeMiddleware.py b/app/http/middleware/AddAttributeMiddleware.py index 2dfd92b93..5893e6e69 100644 --- a/app/http/middleware/AddAttributeMiddleware.py +++ b/app/http/middleware/AddAttributeMiddleware.py @@ -1,6 +1,6 @@ """Add Attribute Middleware.""" -from masonite.request import Request +from src.masonite.request import Request class AddAttributeMiddleware: @@ -8,7 +8,7 @@ class AddAttributeMiddleware: def __init__(self, request: Request): """Inject Any Dependencies From The Service Container.""" - self.request = Request + self.request = request def before(self): """Run This Middleware Before The Route Executes.""" diff --git a/app/http/middleware/AuthenticationMiddleware.py b/app/http/middleware/AuthenticationMiddleware.py index f62bcdd4e..d6c38eeb6 100644 --- a/app/http/middleware/AuthenticationMiddleware.py +++ b/app/http/middleware/AuthenticationMiddleware.py @@ -1,6 +1,6 @@ """Authentication Middleware.""" -from masonite.request import Request +from src.masonite.request import Request class AuthenticationMiddleware: diff --git a/app/http/middleware/CsrfMiddleware.py b/app/http/middleware/CsrfMiddleware.py index cb8d6214d..439bae5dc 100644 --- a/app/http/middleware/CsrfMiddleware.py +++ b/app/http/middleware/CsrfMiddleware.py @@ -1,6 +1,6 @@ """CSRF Middleware.""" -from masonite.middleware import CsrfMiddleware as Middleware +from src.masonite.middleware import CsrfMiddleware as Middleware class CsrfMiddleware(Middleware): diff --git a/app/http/middleware/LoadUserMiddleware.py b/app/http/middleware/LoadUserMiddleware.py index a87d38e62..4ca1c1368 100644 --- a/app/http/middleware/LoadUserMiddleware.py +++ b/app/http/middleware/LoadUserMiddleware.py @@ -1,7 +1,7 @@ """Load User Middleware.""" -from masonite.auth import Auth -from masonite.request import Request +from src.masonite.auth import Auth +from src.masonite.request import Request class LoadUserMiddleware: diff --git a/app/http/middleware/MiddlewareTest.py b/app/http/middleware/MiddlewareTest.py index e16ca6f7d..f36c55c8e 100644 --- a/app/http/middleware/MiddlewareTest.py +++ b/app/http/middleware/MiddlewareTest.py @@ -1,6 +1,6 @@ """Middleware Test.""" -from masonite.request import Request +from src.masonite.request import Request class MiddlewareTest: diff --git a/app/http/middleware/TestHttpMiddleware.py b/app/http/middleware/TestHttpMiddleware.py index 655404b57..168fcda76 100644 --- a/app/http/middleware/TestHttpMiddleware.py +++ b/app/http/middleware/TestHttpMiddleware.py @@ -1,4 +1,4 @@ -from masonite.request import Request +from src.masonite.request import Request class TestHttpMiddleware: diff --git a/app/http/middleware/TestMiddleware.py b/app/http/middleware/TestMiddleware.py index 9f68b7ef4..e8ef6efdf 100644 --- a/app/http/middleware/TestMiddleware.py +++ b/app/http/middleware/TestMiddleware.py @@ -1,4 +1,4 @@ -from masonite.request import Request +from src.masonite.request import Request class TestMiddleware: diff --git a/app/http/middleware/VerifyEmailMiddleware.py b/app/http/middleware/VerifyEmailMiddleware.py index e673697f9..33dde5517 100644 --- a/app/http/middleware/VerifyEmailMiddleware.py +++ b/app/http/middleware/VerifyEmailMiddleware.py @@ -1,6 +1,6 @@ """Verify Email Middleware.""" -from masonite.request import Request +from src.masonite.request import Request class VerifyEmailMiddleware: diff --git a/app/jobs/TestJob.py b/app/jobs/TestJob.py index cf1bf3783..1c8ef8947 100644 --- a/app/jobs/TestJob.py +++ b/app/jobs/TestJob.py @@ -1,6 +1,6 @@ """ A TestJob Queue Job """ -from masonite.queues import Queueable +from src.masonite.queues import Queueable class TestJob(Queueable): diff --git a/bootstrap/start.py b/bootstrap/start.py index 6e2c30bf0..5116f7f7f 100644 --- a/bootstrap/start.py +++ b/bootstrap/start.py @@ -1,6 +1,6 @@ """Start of Application. This function is the gunicorn server.""" -from masonite.environment import LoadEnvironment +from src.masonite.environment import LoadEnvironment """Load Environment Variables Take environment variables from the .env file and load them in. diff --git a/config/application.py b/config/application.py index 74b0a6dd9..f17c7a073 100644 --- a/config/application.py +++ b/config/application.py @@ -2,7 +2,7 @@ import os -from masonite import env +from src.masonite import env """Application Name This value is the name of your application. This value is used when the @@ -57,4 +57,9 @@ 'app', ] -FALSY = False \ No newline at end of file +FALSY = False + +TEMPLATES={ + 'statuscode': '/src/masonite/snippets/statuscode', + 'exceptions': '/src/masonite/snippets/exception' +} diff --git a/config/auth.py b/config/auth.py index 60f3f9e7e..bb1440ac0 100644 --- a/config/auth.py +++ b/config/auth.py @@ -1,7 +1,5 @@ """Authentication Settings.""" -from masonite import env - from app.User import User """Authentication Model @@ -17,16 +15,23 @@ """ AUTH = { - 'driver': env('AUTH_DRIVER', 'cookie'), - 'model': User, + 'defaults': { + 'guard': 'web' + }, + 'guards': { + 'web': { + 'driver': 'cookie', + 'model': User, + 'drivers': { # 'cookie', 'jwt' + 'jwt': { + 'reauthentication': True, + 'lifetime': '5 minutes' + } + } + }, + } } DRIVERS = { - 'jwt': { - """Whether or not to reauthenticate with the database when the token expires.""" - 'reauthentication': True, - - """How long the token should live for before being refreshed.""" - 'lifetime': '5 minutes' - } + } diff --git a/config/broadcast.py b/config/broadcast.py index 74617c9a9..1b2d564f3 100644 --- a/config/broadcast.py +++ b/config/broadcast.py @@ -1,6 +1,6 @@ """Broadcast Settings.""" -from masonite import env +from src.masonite import env """Broadcast Driver Realtime support is critical for any modern web application. Broadcast diff --git a/config/cache.py b/config/cache.py index 6ad80a4fe..589e04edf 100644 --- a/config/cache.py +++ b/config/cache.py @@ -1,6 +1,6 @@ """Cache Settings.""" -from masonite import env +from src.masonite import env """Cache Driver Caching is a great way to gain an instant speed boost to your application. diff --git a/config/database.py b/config/database.py index 98adad1e2..29cf94b5e 100644 --- a/config/database.py +++ b/config/database.py @@ -2,8 +2,8 @@ import logging -from masonite import env -from masonite.environment import LoadEnvironment +from src.masonite import env +from src.masonite.environment import LoadEnvironment from orator import DatabaseManager, Model """Load Environment Variables diff --git a/config/mail.py b/config/mail.py index c0c11f9d4..f6266063b 100644 --- a/config/mail.py +++ b/config/mail.py @@ -1,6 +1,6 @@ """Mail Settings.""" -from masonite import env +from src.masonite import env """From Address This value will be used for the default address when sending emails from diff --git a/config/middleware.py b/config/middleware.py index 2d1f32274..125c6b3cc 100644 --- a/config/middleware.py +++ b/config/middleware.py @@ -1,6 +1,6 @@ """Middleware Configuration Settings.""" -from masonite.middleware import (CorsMiddleware, ResponseMiddleware, +from src.masonite.middleware import (CorsMiddleware, ResponseMiddleware, SecureHeadersMiddleware, MaintenanceModeMiddleware) diff --git a/config/providers.py b/config/providers.py index 0b0e795ca..aa4400537 100644 --- a/config/providers.py +++ b/config/providers.py @@ -1,6 +1,6 @@ """Providers Configuration File.""" -from masonite.providers import (AppProvider, BroadcastProvider, CacheProvider, +from src.masonite.providers import (AppProvider, AuthenticationProvider, BroadcastProvider, CacheProvider, CsrfProvider, HelpersProvider, MailProvider, QueueProvider, RouteProvider, SassProvider, SessionProvider, StatusCodeProvider, @@ -22,6 +22,7 @@ StatusCodeProvider, WhitenoiseProvider, ViewProvider, + AuthenticationProvider, # Optional Framework Providers SassProvider, diff --git a/config/queue.py b/config/queue.py index 109d49b85..fcd586948 100644 --- a/config/queue.py +++ b/config/queue.py @@ -1,6 +1,6 @@ """Queue Settings.""" -from masonite import env +from src.masonite import env """Queue Driver Queues are an excellent way to send intensive and time consuming tasks diff --git a/config/session.py b/config/session.py index 8ea9c1537..3f9d18442 100644 --- a/config/session.py +++ b/config/session.py @@ -1,6 +1,6 @@ """Session Settings.""" -from masonite import env +from src.masonite import env """Session Driver Sessions are able to be linked to an individual user and carry data from diff --git a/config/storage.py b/config/storage.py index f6b856ba6..8d30ec820 100644 --- a/config/storage.py +++ b/config/storage.py @@ -1,6 +1,6 @@ """Storage Settings.""" -from masonite import env +from src.masonite import env """Storage Driver The default driver you will like to use for storing uploads. You may add diff --git a/masonite/commands/AuthCommand.py b/masonite/commands/AuthCommand.py deleted file mode 100644 index 85deb451a..000000000 --- a/masonite/commands/AuthCommand.py +++ /dev/null @@ -1,52 +0,0 @@ -"""New Authentication System Command.""" -import os -import shutil - -from cleo import Command - - -class AuthCommand(Command): - """ - Creates an authentication system. - - auth - """ - - def handle(self): - self.info('Scaffolding Application ...') - module_path = os.path.dirname(os.path.realpath(__file__)) - - with open('routes/web.py', 'a') as f: - # add all the routes - f.write('\nROUTES = ROUTES + [\n ') - f.write("Get().route('/login', 'LoginController@show').name('login'),\n ") - f.write("Get().route('/logout', 'LoginController@logout').name('logout'),\n ") - f.write("Post().route('/login', 'LoginController@store'),\n ") - f.write("Get().route('/register', 'RegisterController@show').name('register'),\n ") - f.write("Post().route('/register', 'RegisterController@store'),\n ") - f.write("Get().route('/home', 'HomeController@show').name('home'),\n ") - f.write("Get().route('/email/verify', 'ConfirmController@verify_show').name('verify'),\n ") - f.write("Get().route('/email/verify/send', 'ConfirmController@send_verify_email'),\n ") - f.write("Get().route('/email/verify/@id:signed', 'ConfirmController@confirm_email'),\n ") - f.write("Get().route('/password', 'PasswordController@forget').name('forgot.password'),\n ") - f.write("Post().route('/password', 'PasswordController@send'),\n ") - f.write("Get().route('/password/@token/reset', 'PasswordController@reset').name('password.reset'),\n ") - f.write("Post().route('/password/@token/reset', 'PasswordController@update'),\n") - f.write(']\n') - - # move controllers - shutil.copyfile(module_path + "/../snippets/auth/controllers/LoginController.py", - os.getcwd() + "/app/http/controllers/LoginController.py") - shutil.copyfile(module_path + "/../snippets/auth/controllers/RegisterController.py", - os.getcwd() + "/app/http/controllers/RegisterController.py") - shutil.copyfile(module_path + "/../snippets/auth/controllers/HomeController.py", - os.getcwd() + "/app/http/controllers/HomeController.py") - shutil.copyfile(module_path + "/../snippets/auth/controllers/ConfirmController.py", - os.getcwd() + "/app/http/controllers/ConfirmController.py") - shutil.copyfile(module_path + "/../snippets/auth/controllers/PasswordController.py", - os.getcwd() + "/app/http/controllers/PasswordController.py") - # move templates - shutil.copytree(module_path + "/../snippets/auth/templates/auth", - os.getcwd() + "/resources/templates/auth") - - self.info('Project Scaffolded. You now have 5 new controllers, 7 new templates and 9 new routes') diff --git a/masonite/providers/AppProvider.py b/masonite/providers/AppProvider.py deleted file mode 100644 index b64fcfb90..000000000 --- a/masonite/providers/AppProvider.py +++ /dev/null @@ -1,93 +0,0 @@ -"""An AppProvider Service Provider.""" - -from masonite.auth import Auth -from masonite.autoload import Autoload -from masonite.commands import (AuthCommand, CommandCommand, ControllerCommand, - DownCommand, InfoCommand, InstallCommand, - JobCommand, KeyCommand, MakeMigrationCommand, - MiddlewareCommand, MigrateCommand, - MigrateRefreshCommand, MigrateResetCommand, - MigrateRollbackCommand, MigrateStatusCommand, - ModelCommand, ModelDocstringCommand, - ProviderCommand, PublishCommand, - QueueTableCommand, QueueWorkCommand, - RoutesCommand, SeedCommand, SeedRunCommand, - ServeCommand, TestCommand, TinkerCommand, UpCommand, - ViewCommand) -from masonite.exception_handler import DumpHandler, ExceptionHandler -from masonite.helpers import config -from masonite.helpers.routes import flatten_routes -from masonite.hook import Hook -from masonite.provider import ServiceProvider -from masonite.request import Request -from masonite.response import Response -from masonite.routes import Route - -from masonite.managers import AuthManager -from masonite.drivers import AuthCookieDriver, AuthJwtDriver - - -class AppProvider(ServiceProvider): - - def register(self): - from routes import web - self.app.bind('HookHandler', Hook(self.app)) - self.app.bind('WebRoutes', flatten_routes(web.ROUTES)) - self.app.bind('Storage', config('storage')) - self.app.bind('Route', Route()) - self.app.bind('Request', Request()) - self.app.simple(Response(self.app)) - self.app.bind('Container', self.app) - self.app.bind('ExceptionHandler', ExceptionHandler(self.app)) - self.app.bind('ExceptionDumpExceptionHandler', DumpHandler) - self.app.bind('AuthCookieDriver', AuthCookieDriver) - self.app.bind('AuthJwtDriver', AuthJwtDriver) - self.app.bind('AuthManager', AuthManager(self.app).driver('cookie')) - self.app.bind('RouteMiddleware', config('middleware.route_middleware')) - self.app.bind('HttpMiddleware', config('middleware.http_middleware')) - self.app.bind('Auth', Auth) - - # Insert Commands - self._load_commands() - - self._autoload(config('application.autoload')) - - def boot(self, request: Request, route: Route): - self.app.bind('StatusCode', None) - route.load_environ(self.app.make('Environ')) - request.load_environ(self.app.make('Environ')).load_app(self.app) - - def _autoload(self, directories): - Autoload(self.app).load(directories) - - def _load_commands(self): - self.app.bind('MasoniteAuthCommand', AuthCommand()) - self.app.bind('MasoniteCommandCommand', CommandCommand()) - self.app.bind('MasoniteControllerCommand', ControllerCommand()) - self.app.bind('MasoniteDownCommand', DownCommand()) - self.app.bind('MasoniteInfoCommand', InfoCommand()) - self.app.bind('MasoniteInstallCommand', InstallCommand()) - self.app.bind('MasoniteJobCommand', JobCommand()) - self.app.bind('MasoniteKeyCommand', KeyCommand()) - self.app.bind('MasoniteMakeMigrationCommand', MakeMigrationCommand()) - self.app.bind('MasoniteMiddlewareCommand', MiddlewareCommand()) - self.app.bind('MasoniteMigrateCommand', MigrateCommand()) - self.app.bind('MasoniteMigrateRefreshCommand', MigrateRefreshCommand()) - self.app.bind('MasoniteMigrateResetCommand', MigrateResetCommand()) - self.app.bind('MasoniteMigrateStatusCommand', MigrateStatusCommand()) - self.app.bind('MasoniteMigrateRollbackCommand', - MigrateRollbackCommand()) - self.app.bind('MasoniteModelCommand', ModelCommand()) - self.app.bind('MasoniteModelDocstringCommand', ModelDocstringCommand()) - self.app.bind('MasoniteProviderCommand', ProviderCommand()) - self.app.bind('MasonitePublishCommand', PublishCommand()) - self.app.bind('MasoniteQueueWorkCommand', QueueWorkCommand()) - self.app.bind('MasoniteQueueTableCommand', QueueTableCommand()) - self.app.bind('MasoniteViewCommand', ViewCommand()) - self.app.bind('MasoniteRoutesCommand', RoutesCommand()) - self.app.bind('MasoniteServeCommand', ServeCommand()) - self.app.bind('MasoniteSeedCommand', SeedCommand()) - self.app.bind('MasoniteSeedRunCommand', SeedRunCommand()) - self.app.bind('MasoniteTestCommand', TestCommand()) - self.app.bind('MasoniteTinkerCommand', TinkerCommand()) - self.app.bind('MasoniteUpCommand', UpCommand()) diff --git a/masonite/providers/CacheProvider.py b/masonite/providers/CacheProvider.py deleted file mode 100644 index 838189272..000000000 --- a/masonite/providers/CacheProvider.py +++ /dev/null @@ -1,22 +0,0 @@ -"""A Cache Service Provider.""" - -from masonite import Cache -from masonite.drivers import CacheDiskDriver, CacheRedisDriver -from masonite.managers import CacheManager -from masonite.provider import ServiceProvider - - -class CacheProvider(ServiceProvider): - - wsgi = False - - def register(self): - from config import cache - self.app.bind('CacheConfig', cache) - self.app.bind('CacheDiskDriver', CacheDiskDriver) - self.app.bind('CacheRedisDriver', CacheRedisDriver) - self.app.bind('CacheManager', CacheManager(self.app)) - - def boot(self, cache: CacheManager): - self.app.bind('Cache', cache.driver(self.app.make('CacheConfig').DRIVER)) - self.app.swap(Cache, cache.driver(self.app.make('CacheConfig').DRIVER)) diff --git a/masonite/providers/QueueProvider.py b/masonite/providers/QueueProvider.py deleted file mode 100644 index 801af3f20..000000000 --- a/masonite/providers/QueueProvider.py +++ /dev/null @@ -1,24 +0,0 @@ -"""A RedirectionProvider Service Provider.""" - - -from masonite.drivers import QueueAsyncDriver, QueueAmqpDriver, QueueDatabaseDriver -from masonite.managers import QueueManager -from masonite.provider import ServiceProvider -from masonite import Queue - - -class QueueProvider(ServiceProvider): - - wsgi = False - - def register(self): - from config import queue - self.app.bind('QueueAsyncDriver', QueueAsyncDriver) - self.app.bind('QueueDatabaseDriver', QueueDatabaseDriver) - self.app.bind('QueueAmqpDriver', QueueAmqpDriver) - self.app.bind('QueueManager', QueueManager) - self.app.bind('QueueConfig', queue) - - def boot(self, queue: QueueManager): - self.app.bind('Queue', queue.driver(self.app.make('QueueConfig').DRIVER)) - self.app.swap(Queue, queue.driver(self.app.make('QueueConfig').DRIVER)) diff --git a/masonite/providers/UploadProvider.py b/masonite/providers/UploadProvider.py deleted file mode 100644 index 30651c8fa..000000000 --- a/masonite/providers/UploadProvider.py +++ /dev/null @@ -1,29 +0,0 @@ -"""An Upload Service Provider.""" - -from masonite.drivers import UploadDiskDriver, UploadS3Driver -from masonite.helpers.static import static -from masonite.managers import UploadManager -from masonite.provider import ServiceProvider -from masonite.view import View -from masonite import Upload - - -class UploadProvider(ServiceProvider): - - wsgi = False - - def register(self): - from config import storage - self.app.bind('StorageConfig', storage) - self.app.bind('UploadDiskDriver', UploadDiskDriver) - self.app.bind('UploadS3Driver', UploadS3Driver) - self.app.bind('UploadManager', UploadManager(self.app)) - - def boot(self, manager: UploadManager, view: View): - self.app.bind('Upload', manager.driver(self.app.make('StorageConfig').DRIVER)) - self.app.swap(Upload, manager.driver(self.app.make('StorageConfig').DRIVER)) - view.share( - { - 'static': static, - } - ) diff --git a/masonite/testing/MockController.py b/masonite/testing/MockController.py deleted file mode 100644 index ba955b132..000000000 --- a/masonite/testing/MockController.py +++ /dev/null @@ -1,4 +0,0 @@ -class MockController: - - def returns_instance_of(self, obj): - pass diff --git a/masonite/testing/MockJson.py b/masonite/testing/MockJson.py deleted file mode 100644 index 9ef3bc36d..000000000 --- a/masonite/testing/MockJson.py +++ /dev/null @@ -1,24 +0,0 @@ -from masonite.testsuite import TestSuite, generate_wsgi -from masonite.testing import BaseRequest - - -class MockJson(BaseRequest): - - def __init__(self, url, container): - self.url = url - self.container = container - - def json(self, request_method, url, data): - wsgi = generate_wsgi() - wsgi['PATH_INFO'] = url - wsgi['CONTENT_TYPE'] = 'application/json' - - def contains(self, value): - return value in self.container.make('Response') - - def _run_container(self, wsgi): - return TestSuite().create_container(wsgi, container=self.container) - - def _bind_user_to_request(self, request, container): - request.set_user(self._user) - return self diff --git a/masonite/testing/MockRequest.py b/masonite/testing/MockRequest.py deleted file mode 100644 index b56a8ca91..000000000 --- a/masonite/testing/MockRequest.py +++ /dev/null @@ -1,20 +0,0 @@ -from masonite.testsuite import TestSuite -from masonite.testing import BaseRequest - - -class MockRequest(BaseRequest): - - def __init__(self, url, container): - self.url = url - self.container = container - - def _run_container(self, wsgi): - return TestSuite().create_container(wsgi, container=self.container) - - def _bind_user_to_request(self, request, container): - request.set_user(self._user) - return self - - def contains(self, value): - print('response:', self.container.make('Response')) - return value in self.container.make('Response') diff --git a/masonite/testing/__init__.py b/masonite/testing/__init__.py deleted file mode 100644 index 929db5f82..000000000 --- a/masonite/testing/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from .BaseRequest import BaseRequest -from .TestCase import TestCase -from .MockJson import MockJson -from .MockRequest import MockRequest -from .MockRoute import MockRoute -from .MockController import MockController diff --git a/masonite/testsuite/TestRequest.py b/masonite/testsuite/TestRequest.py deleted file mode 100644 index af74e8f8a..000000000 --- a/masonite/testsuite/TestRequest.py +++ /dev/null @@ -1,25 +0,0 @@ -import requests - - -class TestRequest: - - def __init__(self): - self.request = None - pass - - def get(self, route_url): - from config import application - self.request = requests.get(application.URL + route_url) - return self - - def status_code(self, code): - if self.request.status_code == code: - return True - - return False - - def contains(self, content): - if content in self.request.text: - return True - - return False diff --git a/masonite/testsuite/TestRoute.py b/masonite/testsuite/TestRoute.py deleted file mode 100644 index 4915cbb47..000000000 --- a/masonite/testsuite/TestRoute.py +++ /dev/null @@ -1,18 +0,0 @@ -from masonite.routes import Get - - -class TestRoute: - - def __init__(self, route): - self.route = None - from routes import web - for routes in web.ROUTES: - if routes.route_url == route: - self.route = routes - break - - def exists(self): - return isinstance(self.route, Get) - - def hasMiddleware(self, middleware): - return middleware in self.route.list_middleware diff --git a/masonite/testsuite/TestSuite.py b/masonite/testsuite/TestSuite.py deleted file mode 100644 index bdbd32983..000000000 --- a/masonite/testsuite/TestSuite.py +++ /dev/null @@ -1,114 +0,0 @@ -from masonite.app import App -from masonite.testsuite.TestRoute import TestRoute -from masonite.testsuite.TestRequest import TestRequest - -import io - - -def generate_wsgi(): - return { - 'wsgi.version': (1, 0), - 'wsgi.multithread': False, - 'wsgi.multiprocess': True, - 'wsgi.run_once': False, - 'wsgi.input': io.BytesIO(), - 'SERVER_SOFTWARE': 'gunicorn/19.7.1', - 'REQUEST_METHOD': 'GET', - 'QUERY_STRING': 'application=Masonite', - 'RAW_URI': '/', - 'SERVER_PROTOCOL': 'HTTP/1.1', - 'HTTP_HOST': '127.0.0.1:8000', - 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', - 'HTTP_COOKIE': 'setcookie=value', - 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7', - 'HTTP_ACCEPT_LANGUAGE': 'en-us', - 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', - 'HTTP_CONNECTION': 'keep-alive', - 'wsgi.url_scheme': 'http', - 'REMOTE_ADDR': '127.0.0.1', - 'REMOTE_PORT': '62241', - 'SERVER_NAME': '127.0.0.1', - 'SERVER_PORT': '8000', - 'PATH_INFO': '/', - 'SCRIPT_NAME': '' - } - - -class TestSuite: - - def create_container(self, wsgi=generate_wsgi(), container=None, routes=[]): - from config import application, providers - if not container: - container = App(remember=False) - - container.bind('WSGI', wsgi) - container.bind('Application', application) - container.bind('Container', container) - container.bind('ProvidersConfig', providers) - container.bind('Providers', []) - container.bind('WSGIProviders', []) - - """ - |-------------------------------------------------------------------------- - | Bind all service providers - |-------------------------------------------------------------------------- - | - | Let's register everything into the Service Container. Once everything is - | in the container we can run through all the boot methods. For reasons - | some providers don't need to execute with every request and should - | only run once when the server is started. Providers will be ran - | once if the wsgi attribute on a provider is False. - | - """ - - for provider in container.make('ProvidersConfig').PROVIDERS: - located_provider = provider() - located_provider.load_app(container).register() - if located_provider.wsgi: - container.make('WSGIProviders').append(located_provider) - else: - container.make('Providers').append(located_provider) - - for provider in container.make('Providers'): - container.resolve(provider.boot) - - """ - |-------------------------------------------------------------------------- - | Startup the Service Container - |-------------------------------------------------------------------------- - | - | Instantiate the Service Container so we can bind classes into it and - | bind the environ variable that is created by the WSGI server into - | the container. - | - """ - - container.bind('Environ', wsgi) - - """ - |-------------------------------------------------------------------------- - | Execute All Service Providers - |-------------------------------------------------------------------------- - | - | Run all service provider boot methods if the wsgi attribute is true. - | - """ - - if routes: - container.bind('WebRoutes', routes) - - for provider in container.make('WSGIProviders'): - container.resolve(provider.boot) - - self.container = container - return self - - def get_container(self): - return self.container - - def route(self, route): - return TestRoute(route) - - def get(self, route_url): - return TestRequest().get(route_url) diff --git a/masonite/testsuite/__init__.py b/masonite/testsuite/__init__.py deleted file mode 100644 index 786267b4e..000000000 --- a/masonite/testsuite/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .TestRequest import TestRequest -from .TestRoute import TestRoute -from .TestSuite import TestSuite, generate_wsgi diff --git a/routes/web.py b/routes/web.py index 2dfb068b6..3430f8fca 100644 --- a/routes/web.py +++ b/routes/web.py @@ -1,6 +1,6 @@ """Web Routes.""" -from masonite.routes import Get, Post, Redirect, RouteGroup, Patch, Options +from src.masonite.routes import Get, Post, Redirect, RouteGroup, Patch, Options ROUTES = [ @@ -21,6 +21,7 @@ Get('/test/param/@id', 'TestController@testing'), Post('/test/json/response/@id', 'TestController@json'), Get('/test/set/test/session', 'TestController@session'), + Get('/test/mail', 'TestController@mail'), RouteGroup([ Get('/test/1', 'TestController@show'), Get('/test/2', 'TestController@show') diff --git a/setup.py b/setup.py index fc6bafc33..b80262786 100644 --- a/setup.py +++ b/setup.py @@ -4,12 +4,15 @@ here = os.path.abspath(os.path.dirname(__file__)) meta = {} -with open(os.path.join(here, 'masonite', '__version__.py'), 'r') as f: +with open(os.path.join(here, 'src/masonite', '__version__.py'), 'r') as f: exec(f.read(), meta) -with open('README.md', 'r') as f: - readme = f.read() - +try: + with open('README.md', 'r') as f: + readme = f.read() +except FileNotFoundError: + readme = "" + setup( name=meta['__title__'], packages=[ @@ -29,7 +32,6 @@ 'masonite.drivers.storage', 'masonite.drivers.upload', 'masonite.managers', - 'masonite.testsuite', 'masonite.queues', 'masonite.contracts', 'masonite.contracts.managers', @@ -44,9 +46,6 @@ 'cryptography>=2.3,<2.8', 'hupper>=1.0,<2.0', 'Jinja2>=2,<3', - 'masonite-events>=1.0,<2', - 'masonite-scheduler>=1.0.0,<=1.0.99', - 'masonite-validation>=2.2.0,<=2.2.99', 'orator>=0.9,<1', 'passlib>=1.7,<1.8', 'pendulum>=1.5,<1.6', @@ -62,12 +61,13 @@ long_description_content_type='text/markdown', author=meta['__author__'], author_email=meta['__author_email__'], + package_dir={'': 'src'}, url=meta['__url__'], keywords=['masonite', 'python web framework', 'python3'], licence=meta['__licence__'], - python_requires=">=3.4", + python_requires=">=3.5", classifiers=[ - 'Development Status :: 5 - Production/Stable', + 'Development Status :: 4 - Beta', 'Environment :: Web Environment', 'Framework :: Masonite', 'Intended Audience :: Developers', diff --git a/masonite/snippets/__init__.py b/src/__init__.py similarity index 100% rename from masonite/snippets/__init__.py rename to src/__init__.py diff --git a/masonite/__init__.py b/src/masonite/__init__.py similarity index 92% rename from masonite/__init__.py rename to src/masonite/__init__.py index 49e68acf7..988c25066 100644 --- a/masonite/__init__.py +++ b/src/masonite/__init__.py @@ -4,7 +4,7 @@ from .managers.QueueManager import Queue from .managers.SessionManager import Session from .managers.UploadManager import Upload -from masonite.environment import env +from .environment import env from .__version__ import (__title__, __description__, __url__, __version__, __author__, __author_email__, __licence__) diff --git a/masonite/__version__.py b/src/masonite/__version__.py similarity index 89% rename from masonite/__version__.py rename to src/masonite/__version__.py index 6d8e7eb92..5fcaadf73 100644 --- a/masonite/__version__.py +++ b/src/masonite/__version__.py @@ -2,7 +2,7 @@ __title__ = 'masonite' __description__ = 'The core for the Masonite framework' __url__ = 'https://github.com/MasoniteFramework/masonite' -__version__ = '2.2.26' +__version__ = '2.3.0b1.post2' __author__ = 'Joseph Mancuso' __author_email__ = 'joe@masoniteproject.com' __licence__ = 'MIT' diff --git a/masonite/app.py b/src/masonite/app.py similarity index 97% rename from masonite/app.py rename to src/masonite/app.py index ffa62ffb0..173b93ad1 100644 --- a/masonite/app.py +++ b/src/masonite/app.py @@ -2,9 +2,9 @@ import inspect -from masonite.exceptions import (ContainerError, - MissingContainerBindingNotFound, - StrictContainerException) +from .exceptions import (ContainerError, + MissingContainerBindingNotFound, + StrictContainerException) class App: @@ -39,6 +39,8 @@ def bind(self, name, class_obj): Returns: self """ + if inspect.ismodule(class_obj): + raise StrictContainerException("Cannot bind module '{}' with key '{}' into the container".format(class_obj, name)) if self.strict and name in self.providers: raise StrictContainerException( 'You cannot override a key inside a strict container') diff --git a/src/masonite/auth/Auth.py b/src/masonite/auth/Auth.py new file mode 100644 index 000000000..9d33a0ad1 --- /dev/null +++ b/src/masonite/auth/Auth.py @@ -0,0 +1,6 @@ +"""Authentication Class.""" + + +class Auth: + """Facade class for the Guard class""" + pass diff --git a/masonite/auth/Csrf.py b/src/masonite/auth/Csrf.py similarity index 100% rename from masonite/auth/Csrf.py rename to src/masonite/auth/Csrf.py diff --git a/masonite/auth/MustVerifyEmail.py b/src/masonite/auth/MustVerifyEmail.py similarity index 95% rename from masonite/auth/MustVerifyEmail.py rename to src/masonite/auth/MustVerifyEmail.py index 3379790a6..5e56d622a 100644 --- a/masonite/auth/MustVerifyEmail.py +++ b/src/masonite/auth/MustVerifyEmail.py @@ -2,7 +2,7 @@ import time -from masonite.auth.Sign import Sign +from ..auth.Sign import Sign class MustVerifyEmail: diff --git a/masonite/auth/Sign.py b/src/masonite/auth/Sign.py similarity index 91% rename from masonite/auth/Sign.py rename to src/masonite/auth/Sign.py index 331a412bd..b15f7da77 100644 --- a/masonite/auth/Sign.py +++ b/src/masonite/auth/Sign.py @@ -3,7 +3,7 @@ from cryptography.fernet import Fernet -from masonite.exceptions import InvalidSecretKey +from ..exceptions import InvalidSecretKey class Sign: @@ -49,7 +49,7 @@ def sign(self, value): raise InvalidSecretKey( "You have passed an invalid secret key of: {}. Make sure you have correctly added your secret key.".format(self.key)) - self.encryption = f.encrypt(bytes(value, 'utf-8')) + self.encryption = f.encrypt(bytes(str(value), 'utf-8')) return self.encryption.decode('utf-8') def unsign(self, value=None): @@ -65,4 +65,4 @@ def unsign(self, value=None): if not value: return f.decrypt(self.encryption).decode('utf-8') - return f.decrypt(bytes(value, 'utf-8')).decode('utf-8') + return f.decrypt(bytes(str(value), 'utf-8')).decode('utf-8') diff --git a/masonite/auth/__init__.py b/src/masonite/auth/__init__.py similarity index 100% rename from masonite/auth/__init__.py rename to src/masonite/auth/__init__.py diff --git a/src/masonite/auth/guards/AuthenticationGuard.py b/src/masonite/auth/guards/AuthenticationGuard.py new file mode 100644 index 000000000..9889cddab --- /dev/null +++ b/src/masonite/auth/guards/AuthenticationGuard.py @@ -0,0 +1,56 @@ + +class AuthenticationGuard: + + def guard(self, guard): + """Specify the guard you want to use + + Arguments: + guard {[type]} -- [description] + """ + from .Guard import Guard + return Guard(self.app).make(guard) + + def register_guard(self, key, cls=None): + """Registers a new guard class. + + Arguments: + key {string|dict} -- The key to name the guard to a dictionary of key: values + + Keyword Arguments: + cls {object} -- A guard class. (default: {None}) + + Returns: + None + """ + from .Guard import Guard + if isinstance(key, dict): + return Guard.guards.update(key) + + return Guard.guards.update({key: cls}) + + def register_driver(self, key, cls): + """Registers a new driver with the current guard class. + + Arguments: + key {string} -- The key to register the driver to. + cls {class} -- A guard class. + """ + self.drivers.update({key: cls}) + + def make(self, key): + """Makes a new driver from the current guard class. + + Arguments: + key {string} -- The key to for the driver to make. + + Raises: + DriverNotFound: Thrown when the driver is not registered. + + Returns: + object -- Returns a guard driver object. + """ + if key in self.drivers: + self.driver = self.app.resolve(self.drivers[key]) + return self.driver + + raise DriverNotFound("Could not find the driver {}".format(key)) diff --git a/src/masonite/auth/guards/Guard.py b/src/masonite/auth/guards/Guard.py new file mode 100644 index 000000000..e0d1ba3bd --- /dev/null +++ b/src/masonite/auth/guards/Guard.py @@ -0,0 +1,124 @@ +"""A Guard Class Module.""" +from ...app import App +from ...exceptions import DriverNotFound + + +class Guard: + + guards = {} + + def __init__(self, app: App): + """Guard Initializer + + Arguments: + app {masonite.app.App} -- The Masonite container + """ + self.app = app + + def make(self, key): + """Makes a guard that has been previously registered + + Arguments: + key {string} -- The key of the guard to fetch. + + Raises: + DriverNotFound: Raised when trying to fetch a guard that has not been registered yet. + + Returns: + [type] -- [description] + """ + if key in self.guards: + self._guard = self.app.resolve(self.guards[key]) + return self._guard + + raise DriverNotFound("Could not find the guard: '{}'".format(key)) + + def guard(self, key): + """Alias for the make method. + + Arguments: + key {string} -- The key of the guard to fetch. + + Returns: + masonite.guards.* -- An instance of a guard class. + """ + return self.make(key) + + def set(self, key): + """Sets the specified guard as the default guard to use. + + Arguments: + key {string} -- The key of the guard to set. + + Returns: + masonite.guards.* -- An instance of guard class. + """ + return self.make(key) + + def get(self): + """Gets the guard current class. + + Returns: + masonite.guards.* -- An instance of guard class. + """ + return self._guard + + def driver(self, key): + """Gets the driver for the currently set guard class. + + Arguments: + key {string} -- The key of the driver for the guard to get. + + Returns: + masonite.drivers.auth.* -- An auth driver class. + """ + return self._guard.make(key) + + def register_guard(self, key, cls=None): + """Registers a new guard class. + + Arguments: + key {string|dict} -- The key to name the guard to a dictionary of key: values + + Keyword Arguments: + cls {object} -- A guard class. (default: {None}) + + Returns: + None + """ + if isinstance(key, dict): + return self.guards.update(key) + + return self.guards.update({key: cls}) + + def login(self, *args, **kwargs): + """Wrapper method to call the guard class method. + + Returns: + * -- Returns what the guard class method returns. + """ + return self._guard.login(*args, **kwargs) + + def user(self, *args, **kwargs): + """Wrapper method to call the guard class method. + + Returns: + * -- Returns what the guard class method returns. + """ + return self._guard.user(*args, **kwargs) + + def register(self, *args, **kwargs): + """Wrapper method to call the guard class method. + + Returns: + * -- Returns what the guard class method returns. + """ + return self._guard.register(*args, **kwargs) + + def __getattr__(self, key, *args, **kwargs): + """Wrapper method to call the guard class methods. + + Returns: + * -- Returns what the guard class methods returns. + """ + return getattr(self._guard, key) diff --git a/masonite/auth/Auth.py b/src/masonite/auth/guards/WebGuard.py similarity index 74% rename from masonite/auth/Auth.py rename to src/masonite/auth/guards/WebGuard.py index ef45c073c..a28164585 100644 --- a/masonite/auth/Auth.py +++ b/src/masonite/auth/guards/WebGuard.py @@ -1,36 +1,28 @@ -"""Authentication Class.""" - import uuid import bcrypt -from masonite.helpers import password as bcrypt_password, config -from masonite.app import App - - -class Auth: - """This class will be used to authenticate users based on the config/auth.py file.""" - - _once = False +from ...app import App +from ...request import Request +from ...drivers import AuthCookieDriver, AuthJwtDriver +from ...helpers import config +from ...helpers import password as bcrypt_password +from .AuthenticationGuard import AuthenticationGuard - def __init__(self, app: App, auth_model=None): - """Auth constructor. - Arguments: - request {masonite.request.Request} -- The Request object. - - Keyword Arguments: - auth_model {object} -- The model you want to authenticate with (default: {None}) - """ - self.request = app.make('Request') +class WebGuard(AuthenticationGuard): - if auth_model: - self.auth_model = auth_model - else: - from config import auth - self.auth_model = auth.AUTH['model'] + drivers = { + 'cookie': AuthCookieDriver, + 'jwt': AuthJwtDriver + } - self.driver = config('auth.auth.driver', 'cookie') + def __init__(self, app: App, request: Request, driver=None, auth_model=None): + self.app = app + self.request = request + self._once = False + self.auth_model = auth_model or config('auth.auth.guards.web.model') + self.driver = self.make(driver or config('auth.auth.guards.web.driver')) def user(self): """Get the currently logged in user. @@ -42,7 +34,7 @@ def user(self): object|bool -- Returns the current authenticated user object or False or None if there is none. """ try: - return self.request.app().make('AuthManager').driver(self.driver).user(self.auth_model) + return self.driver.user(self.auth_model) except Exception as exception: raise exception @@ -84,8 +76,8 @@ def login(self, name, password): remember_token = str(uuid.uuid4()) model.remember_token = remember_token model.save() - self.request.app().make('AuthManager').driver(self.driver).save(remember_token, model=model) - + self.driver.save(remember_token, model=model) + self.request.set_user(model) return model @@ -100,8 +92,7 @@ def logout(self): Returns: self """ - self.request.app().make('AuthManager').driver(self.driver).delete() - self.request.reset_user() + self.driver.logout() return self def login_by_id(self, user_id): @@ -120,7 +111,7 @@ def login_by_id(self, user_id): remember_token = str(uuid.uuid4()) model.remember_token = remember_token model.save() - self.request.app().make('AuthManager').driver(self.driver).save(remember_token, model=model) + self.driver.save(remember_token, model=model) self.request.set_user(model) return model diff --git a/src/masonite/auth/guards/__init__.py b/src/masonite/auth/guards/__init__.py new file mode 100644 index 000000000..11d537565 --- /dev/null +++ b/src/masonite/auth/guards/__init__.py @@ -0,0 +1,3 @@ +from .Guard import Guard +from .AuthenticationGuard import AuthenticationGuard +from .WebGuard import WebGuard diff --git a/masonite/autoload.py b/src/masonite/autoload.py similarity index 97% rename from masonite/autoload.py rename to src/masonite/autoload.py index 012c89e08..b2e324f67 100644 --- a/masonite/autoload.py +++ b/src/masonite/autoload.py @@ -8,8 +8,8 @@ import pkgutil from pydoc import importlib -from masonite.exceptions import (AutoloadContainerOverwrite, ContainerError, - InvalidAutoloadPath) +from .exceptions import (AutoloadContainerOverwrite, ContainerError, + InvalidAutoloadPath) class Autoload: diff --git a/src/masonite/commands/AuthCommand.py b/src/masonite/commands/AuthCommand.py new file mode 100644 index 000000000..3b7f8808d --- /dev/null +++ b/src/masonite/commands/AuthCommand.py @@ -0,0 +1,52 @@ +"""New Authentication System Command.""" +import os +import shutil + +from cleo import Command + + +class AuthCommand(Command): + """ + Creates an authentication system. + + auth + """ + + def handle(self): + self.info('Scaffolding Application ...') + module_path = os.path.dirname(os.path.realpath(__file__)) + + with open('routes/web.py', 'a') as f: + # add all the routes + f.write('\nROUTES = ROUTES + [\n ') + f.write("Get().route('/login', 'auth.LoginController@show').name('login'),\n ") + f.write("Get().route('/logout', 'auth.LoginController@logout').name('logout'),\n ") + f.write("Post().route('/login', 'auth.LoginController@store'),\n ") + f.write("Get().route('/register', 'auth.RegisterController@show').name('register'),\n ") + f.write("Post().route('/register', 'auth.RegisterController@store'),\n ") + f.write("Get().route('/home', 'auth.HomeController@show').name('home'),\n ") + f.write("Get().route('/email/verify', 'auth.ConfirmController@verify_show').name('verify'),\n ") + f.write("Get().route('/email/verify/@id:signed', 'auth.ConfirmController@confirm_email'),\n ") + f.write("Get().route('/email/verify/@id:signed', 'auth.ConfirmController@confirm_email'),\n ") + f.write("Get().route('/password', 'auth.PasswordController@forget').name('forgot.password'),\n ") + f.write("Post().route('/password', 'auth.PasswordController@send'),\n ") + f.write("Get().route('/password/@token/reset', 'auth.PasswordController@reset').name('password.reset'),\n ") + f.write("Post().route('/password/@token/reset', 'auth.PasswordController@update'),\n") + f.write(']\n') + + # move controllers + shutil.copyfile(module_path + "/../snippets/auth/controllers/LoginController.py", + os.getcwd() + "/app/http/controllers/auth/LoginController.py") + shutil.copyfile(module_path + "/../snippets/auth/controllers/RegisterController.py", + os.getcwd() + "/app/http/controllers/auth/RegisterController.py") + shutil.copyfile(module_path + "/../snippets/auth/controllers/HomeController.py", + os.getcwd() + "/app/http/controllers/auth/HomeController.py") + shutil.copyfile(module_path + "/../snippets/auth/controllers/ConfirmController.py", + os.getcwd() + "/app/http/controllers/auth/ConfirmController.py") + shutil.copyfile(module_path + "/../snippets/auth/controllers/PasswordController.py", + os.getcwd() + "/app/http/controllers/auth/PasswordController.py") + # move templates + shutil.copytree(module_path + "/../snippets/auth/templates/auth", + os.getcwd() + "/resources/templates/auth") + + self.info('Project Scaffolded. You now have 5 new controllers, 7 new templates and 9 new routes') diff --git a/masonite/commands/BaseScaffoldCommand.py b/src/masonite/commands/BaseScaffoldCommand.py similarity index 91% rename from masonite/commands/BaseScaffoldCommand.py rename to src/masonite/commands/BaseScaffoldCommand.py index a500e9626..e88bb5bb0 100644 --- a/masonite/commands/BaseScaffoldCommand.py +++ b/src/masonite/commands/BaseScaffoldCommand.py @@ -1,8 +1,8 @@ from cleo import Command -from masonite.app import App -from masonite.helpers.filesystem import make_directory -from masonite.view import View +from ..app import App +from ..helpers.filesystem import make_directory +from ..view import View class BaseScaffoldCommand(Command): diff --git a/masonite/commands/CommandCommand.py b/src/masonite/commands/CommandCommand.py similarity index 87% rename from masonite/commands/CommandCommand.py rename to src/masonite/commands/CommandCommand.py index 7227f3b6b..cb59257f5 100644 --- a/masonite/commands/CommandCommand.py +++ b/src/masonite/commands/CommandCommand.py @@ -1,5 +1,5 @@ """Creates New Command Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class CommandCommand(BaseScaffoldCommand): diff --git a/masonite/commands/ControllerCommand.py b/src/masonite/commands/ControllerCommand.py similarity index 91% rename from masonite/commands/ControllerCommand.py rename to src/masonite/commands/ControllerCommand.py index 91675ef12..266b662fd 100644 --- a/masonite/commands/ControllerCommand.py +++ b/src/masonite/commands/ControllerCommand.py @@ -1,7 +1,7 @@ """New Controller Command.""" -from masonite.view import View -from masonite.app import App -from masonite.helpers.filesystem import make_directory +from ..view import View +from ..app import App +from ..helpers.filesystem import make_directory from cleo import Command diff --git a/masonite/commands/DownCommand.py b/src/masonite/commands/DownCommand.py similarity index 100% rename from masonite/commands/DownCommand.py rename to src/masonite/commands/DownCommand.py diff --git a/masonite/commands/InfoCommand.py b/src/masonite/commands/InfoCommand.py similarity index 94% rename from masonite/commands/InfoCommand.py rename to src/masonite/commands/InfoCommand.py index 43f6179bc..3348ace08 100644 --- a/masonite/commands/InfoCommand.py +++ b/src/masonite/commands/InfoCommand.py @@ -8,7 +8,7 @@ from cleo import Command from tabulate import tabulate -from masonite.__version__ import __version__ +from ..__version__ import __version__ class InfoCommand(Command): @@ -19,7 +19,7 @@ class InfoCommand(Command): """ def handle(self): - from masonite_cli.application import application + from ._cli.application import application rows = [] rows.append(['System Information', self._get_system_info()]) diff --git a/masonite/commands/InstallCommand.py b/src/masonite/commands/InstallCommand.py similarity index 100% rename from masonite/commands/InstallCommand.py rename to src/masonite/commands/InstallCommand.py diff --git a/masonite/commands/JobCommand.py b/src/masonite/commands/JobCommand.py similarity index 84% rename from masonite/commands/JobCommand.py rename to src/masonite/commands/JobCommand.py index 017bc5545..799d0e25a 100644 --- a/masonite/commands/JobCommand.py +++ b/src/masonite/commands/JobCommand.py @@ -1,5 +1,5 @@ """New Job Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class JobCommand(BaseScaffoldCommand): diff --git a/masonite/commands/KeyCommand.py b/src/masonite/commands/KeyCommand.py similarity index 100% rename from masonite/commands/KeyCommand.py rename to src/masonite/commands/KeyCommand.py diff --git a/masonite/commands/MakeMigrationCommand.py b/src/masonite/commands/MakeMigrationCommand.py similarity index 100% rename from masonite/commands/MakeMigrationCommand.py rename to src/masonite/commands/MakeMigrationCommand.py diff --git a/masonite/commands/MiddlewareCommand.py b/src/masonite/commands/MiddlewareCommand.py similarity index 87% rename from masonite/commands/MiddlewareCommand.py rename to src/masonite/commands/MiddlewareCommand.py index 77e7c9fcc..c8b7b2c5c 100644 --- a/masonite/commands/MiddlewareCommand.py +++ b/src/masonite/commands/MiddlewareCommand.py @@ -1,5 +1,5 @@ """New Middleware Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class MiddlewareCommand(BaseScaffoldCommand): diff --git a/masonite/commands/MigrateCommand.py b/src/masonite/commands/MigrateCommand.py similarity index 90% rename from masonite/commands/MigrateCommand.py rename to src/masonite/commands/MigrateCommand.py index a972b54b0..adc7c42bf 100644 --- a/masonite/commands/MigrateCommand.py +++ b/src/masonite/commands/MigrateCommand.py @@ -3,7 +3,7 @@ import sys from cleo import Command -from masonite.helpers.migrations import Migrations +from ..helpers.migrations import Migrations class MigrateCommand(Command): diff --git a/masonite/commands/MigrateRefreshCommand.py b/src/masonite/commands/MigrateRefreshCommand.py similarity index 100% rename from masonite/commands/MigrateRefreshCommand.py rename to src/masonite/commands/MigrateRefreshCommand.py diff --git a/masonite/commands/MigrateResetCommand.py b/src/masonite/commands/MigrateResetCommand.py similarity index 90% rename from masonite/commands/MigrateResetCommand.py rename to src/masonite/commands/MigrateResetCommand.py index 8424b2871..54494b720 100644 --- a/masonite/commands/MigrateResetCommand.py +++ b/src/masonite/commands/MigrateResetCommand.py @@ -3,7 +3,7 @@ import sys from cleo import Command -from masonite.helpers.migrations import Migrations +from ..helpers.migrations import Migrations class MigrateResetCommand(Command): diff --git a/masonite/commands/MigrateRollbackCommand.py b/src/masonite/commands/MigrateRollbackCommand.py similarity index 90% rename from masonite/commands/MigrateRollbackCommand.py rename to src/masonite/commands/MigrateRollbackCommand.py index 683f602ee..7da089809 100644 --- a/masonite/commands/MigrateRollbackCommand.py +++ b/src/masonite/commands/MigrateRollbackCommand.py @@ -3,7 +3,7 @@ import sys from cleo import Command -from masonite.helpers.migrations import Migrations +from ..helpers.migrations import Migrations class MigrateRollbackCommand(Command): diff --git a/masonite/commands/MigrateStatusCommand.py b/src/masonite/commands/MigrateStatusCommand.py similarity index 96% rename from masonite/commands/MigrateStatusCommand.py rename to src/masonite/commands/MigrateStatusCommand.py index a71a43427..07be04bee 100644 --- a/masonite/commands/MigrateStatusCommand.py +++ b/src/masonite/commands/MigrateStatusCommand.py @@ -4,7 +4,7 @@ from subprocess import check_output from cleo import Command -from masonite.packages import add_venv_site_packages +from ..packages import add_venv_site_packages class MigrateStatusCommand(Command): diff --git a/masonite/commands/ModelCommand.py b/src/masonite/commands/ModelCommand.py similarity index 92% rename from masonite/commands/ModelCommand.py rename to src/masonite/commands/ModelCommand.py index 32b77e3e9..0581b3cdf 100644 --- a/masonite/commands/ModelCommand.py +++ b/src/masonite/commands/ModelCommand.py @@ -1,7 +1,7 @@ """New Model Command.""" -from masonite.app import App -from masonite.helpers.filesystem import make_directory -from masonite.view import View +from ..app import App +from ..helpers.filesystem import make_directory +from ..view import View from cleo import Command diff --git a/masonite/commands/ModelDocstringCommand.py b/src/masonite/commands/ModelDocstringCommand.py similarity index 100% rename from masonite/commands/ModelDocstringCommand.py rename to src/masonite/commands/ModelDocstringCommand.py diff --git a/masonite/commands/ProviderCommand.py b/src/masonite/commands/ProviderCommand.py similarity index 87% rename from masonite/commands/ProviderCommand.py rename to src/masonite/commands/ProviderCommand.py index ce59c9fca..933200ad0 100644 --- a/masonite/commands/ProviderCommand.py +++ b/src/masonite/commands/ProviderCommand.py @@ -1,5 +1,5 @@ """New Providers Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class ProviderCommand(BaseScaffoldCommand): diff --git a/masonite/commands/PublishCommand.py b/src/masonite/commands/PublishCommand.py similarity index 90% rename from masonite/commands/PublishCommand.py rename to src/masonite/commands/PublishCommand.py index 01dd1a0c9..ea90ef50e 100644 --- a/masonite/commands/PublishCommand.py +++ b/src/masonite/commands/PublishCommand.py @@ -1,5 +1,6 @@ """Publish Service Providers""" from cleo import Command +from ..helpers import config class PublishCommand(Command): @@ -14,7 +15,7 @@ class PublishCommand(Command): def handle(self): from wsgi import container - for provider in container.make('Providers'): + for provider in config('providers.providers'): if provider.__class__.__name__ == self.argument('name'): if self.option('tag') != 'None': provider.publish(tag=self.option('tag')) diff --git a/masonite/commands/QueueTableCommand.py b/src/masonite/commands/QueueTableCommand.py similarity index 91% rename from masonite/commands/QueueTableCommand.py rename to src/masonite/commands/QueueTableCommand.py index b3501adcd..214d4904d 100644 --- a/masonite/commands/QueueTableCommand.py +++ b/src/masonite/commands/QueueTableCommand.py @@ -3,7 +3,7 @@ from cleo import Command -from masonite.helpers.filesystem import copy_migration +from ..helpers.filesystem import copy_migration class QueueTableCommand(Command): diff --git a/masonite/commands/QueueWorkCommand.py b/src/masonite/commands/QueueWorkCommand.py similarity index 96% rename from masonite/commands/QueueWorkCommand.py rename to src/masonite/commands/QueueWorkCommand.py index 73521b06c..414cd12f2 100644 --- a/masonite/commands/QueueWorkCommand.py +++ b/src/masonite/commands/QueueWorkCommand.py @@ -2,7 +2,7 @@ from cleo import Command -from masonite import Queue +from .. import Queue class QueueWorkCommand(Command): diff --git a/masonite/commands/RoutesCommand.py b/src/masonite/commands/RoutesCommand.py similarity index 100% rename from masonite/commands/RoutesCommand.py rename to src/masonite/commands/RoutesCommand.py diff --git a/masonite/commands/SeedCommand.py b/src/masonite/commands/SeedCommand.py similarity index 100% rename from masonite/commands/SeedCommand.py rename to src/masonite/commands/SeedCommand.py diff --git a/masonite/commands/SeedRunCommand.py b/src/masonite/commands/SeedRunCommand.py similarity index 100% rename from masonite/commands/SeedRunCommand.py rename to src/masonite/commands/SeedRunCommand.py diff --git a/masonite/commands/ServeCommand.py b/src/masonite/commands/ServeCommand.py similarity index 84% rename from masonite/commands/ServeCommand.py rename to src/masonite/commands/ServeCommand.py index d22026e63..3c4c19885 100644 --- a/masonite/commands/ServeCommand.py +++ b/src/masonite/commands/ServeCommand.py @@ -5,8 +5,8 @@ from hupper.logger import DefaultLogger, LogLevel from hupper.reloader import Reloader, find_default_monitor_factory from cleo import Command -from masonite.helpers import has_unmigrated_migrations -from masonite.exceptions import DriverLibraryNotFound +from ..helpers import has_unmigrated_migrations +from ..exceptions import DriverLibraryNotFound class ServeCommand(Command): @@ -20,6 +20,7 @@ class ServeCommand(Command): {--d|dont-reload : Make the server NOT automatically reload on file changes} {--i|reload-interval=1 : Number of seconds to wait to reload after changed are detected} {--l|live-reload : Make the server automatically refresh your web browser} + {--o|optimize} : Run a more robust server to handle more requests} """ def handle(self): @@ -66,7 +67,18 @@ def handle(self): self._run_reloader(reloader, extra_files=[".env", "storage/"]) + if self.option('optimize'): + + try: + from waitress import serve + except ImportError + raise DriverLibraryNotFound("Could not find the waitress server. Install it by running 'pip install waitress==1.4.0'") + + from wsgi import application + serve(application, host=self.option('host'), port=self.option('port')) + else: + from wsgi import application from ._devserver import run run(self.option("host"), self.option("port"), application) diff --git a/masonite/commands/TestCommand.py b/src/masonite/commands/TestCommand.py similarity index 87% rename from masonite/commands/TestCommand.py rename to src/masonite/commands/TestCommand.py index 8f4f389a8..ad3349dc1 100644 --- a/masonite/commands/TestCommand.py +++ b/src/masonite/commands/TestCommand.py @@ -1,5 +1,5 @@ """Creates New Test Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class TestCommand(BaseScaffoldCommand): diff --git a/masonite/commands/TinkerCommand.py b/src/masonite/commands/TinkerCommand.py similarity index 100% rename from masonite/commands/TinkerCommand.py rename to src/masonite/commands/TinkerCommand.py diff --git a/masonite/commands/UpCommand.py b/src/masonite/commands/UpCommand.py similarity index 100% rename from masonite/commands/UpCommand.py rename to src/masonite/commands/UpCommand.py diff --git a/masonite/commands/ViewCommand.py b/src/masonite/commands/ViewCommand.py similarity index 86% rename from masonite/commands/ViewCommand.py rename to src/masonite/commands/ViewCommand.py index 0753d68a0..c5a300a4e 100644 --- a/masonite/commands/ViewCommand.py +++ b/src/masonite/commands/ViewCommand.py @@ -1,5 +1,5 @@ """New View Command.""" -from masonite.commands import BaseScaffoldCommand +from ..commands import BaseScaffoldCommand class ViewCommand(BaseScaffoldCommand): diff --git a/masonite/commands/__init__.py b/src/masonite/commands/__init__.py similarity index 100% rename from masonite/commands/__init__.py rename to src/masonite/commands/__init__.py diff --git a/masonite/commands/_devserver.py b/src/masonite/commands/_devserver.py similarity index 100% rename from masonite/commands/_devserver.py rename to src/masonite/commands/_devserver.py diff --git a/masonite/contracts/AuthContract.py b/src/masonite/contracts/AuthContract.py similarity index 100% rename from masonite/contracts/AuthContract.py rename to src/masonite/contracts/AuthContract.py diff --git a/masonite/contracts/BroadcastContract.py b/src/masonite/contracts/BroadcastContract.py similarity index 100% rename from masonite/contracts/BroadcastContract.py rename to src/masonite/contracts/BroadcastContract.py diff --git a/masonite/contracts/CacheContract.py b/src/masonite/contracts/CacheContract.py similarity index 100% rename from masonite/contracts/CacheContract.py rename to src/masonite/contracts/CacheContract.py diff --git a/masonite/contracts/MailContract.py b/src/masonite/contracts/MailContract.py similarity index 100% rename from masonite/contracts/MailContract.py rename to src/masonite/contracts/MailContract.py diff --git a/masonite/contracts/QueueContract.py b/src/masonite/contracts/QueueContract.py similarity index 100% rename from masonite/contracts/QueueContract.py rename to src/masonite/contracts/QueueContract.py diff --git a/masonite/contracts/SessionContract.py b/src/masonite/contracts/SessionContract.py similarity index 100% rename from masonite/contracts/SessionContract.py rename to src/masonite/contracts/SessionContract.py diff --git a/masonite/contracts/StorageContract.py b/src/masonite/contracts/StorageContract.py similarity index 100% rename from masonite/contracts/StorageContract.py rename to src/masonite/contracts/StorageContract.py diff --git a/masonite/contracts/UploadContract.py b/src/masonite/contracts/UploadContract.py similarity index 100% rename from masonite/contracts/UploadContract.py rename to src/masonite/contracts/UploadContract.py diff --git a/masonite/contracts/__init__.py b/src/masonite/contracts/__init__.py similarity index 100% rename from masonite/contracts/__init__.py rename to src/masonite/contracts/__init__.py diff --git a/masonite/contracts/managers/BroadcastManagerContract.py b/src/masonite/contracts/managers/BroadcastManagerContract.py similarity index 100% rename from masonite/contracts/managers/BroadcastManagerContract.py rename to src/masonite/contracts/managers/BroadcastManagerContract.py diff --git a/masonite/contracts/managers/CacheManagerContract.py b/src/masonite/contracts/managers/CacheManagerContract.py similarity index 100% rename from masonite/contracts/managers/CacheManagerContract.py rename to src/masonite/contracts/managers/CacheManagerContract.py diff --git a/masonite/contracts/managers/MailManagerContract.py b/src/masonite/contracts/managers/MailManagerContract.py similarity index 100% rename from masonite/contracts/managers/MailManagerContract.py rename to src/masonite/contracts/managers/MailManagerContract.py diff --git a/masonite/contracts/managers/QueueManagerContract.py b/src/masonite/contracts/managers/QueueManagerContract.py similarity index 100% rename from masonite/contracts/managers/QueueManagerContract.py rename to src/masonite/contracts/managers/QueueManagerContract.py diff --git a/masonite/contracts/managers/SessionManagerContract.py b/src/masonite/contracts/managers/SessionManagerContract.py similarity index 100% rename from masonite/contracts/managers/SessionManagerContract.py rename to src/masonite/contracts/managers/SessionManagerContract.py diff --git a/masonite/contracts/managers/StorageManagerContract.py b/src/masonite/contracts/managers/StorageManagerContract.py similarity index 100% rename from masonite/contracts/managers/StorageManagerContract.py rename to src/masonite/contracts/managers/StorageManagerContract.py diff --git a/masonite/contracts/managers/UploadManagerContract.py b/src/masonite/contracts/managers/UploadManagerContract.py similarity index 100% rename from masonite/contracts/managers/UploadManagerContract.py rename to src/masonite/contracts/managers/UploadManagerContract.py diff --git a/masonite/controllers/Controller.py b/src/masonite/controllers/Controller.py similarity index 100% rename from masonite/controllers/Controller.py rename to src/masonite/controllers/Controller.py diff --git a/masonite/controllers/__init__.py b/src/masonite/controllers/__init__.py similarity index 100% rename from masonite/controllers/__init__.py rename to src/masonite/controllers/__init__.py diff --git a/masonite/drivers/BaseDriver.py b/src/masonite/drivers/BaseDriver.py similarity index 100% rename from masonite/drivers/BaseDriver.py rename to src/masonite/drivers/BaseDriver.py diff --git a/masonite/drivers/__init__.py b/src/masonite/drivers/__init__.py similarity index 100% rename from masonite/drivers/__init__.py rename to src/masonite/drivers/__init__.py diff --git a/masonite/drivers/authentication/AuthCookieDriver.py b/src/masonite/drivers/authentication/AuthCookieDriver.py similarity index 80% rename from masonite/drivers/authentication/AuthCookieDriver.py rename to src/masonite/drivers/authentication/AuthCookieDriver.py index d4459a170..1ca61d1b2 100644 --- a/masonite/drivers/authentication/AuthCookieDriver.py +++ b/src/masonite/drivers/authentication/AuthCookieDriver.py @@ -1,8 +1,8 @@ """AuthCookieDriver Module.""" -from masonite.contracts import AuthContract -from masonite.drivers import BaseDriver -from masonite.request import Request +from ...contracts import AuthContract +from ...drivers import BaseDriver +from ...request import Request class AuthCookieDriver(BaseDriver, AuthContract): @@ -51,3 +51,12 @@ def delete(self): bool """ return self.request.delete_cookie('token') + + def logout(self): + """Deletes the state depending on the implementation of this driver. + + Returns: + bool + """ + self.delete() + self.request.reset_user() diff --git a/masonite/drivers/authentication/AuthJwtDriver.py b/src/masonite/drivers/authentication/AuthJwtDriver.py similarity index 86% rename from masonite/drivers/authentication/AuthJwtDriver.py rename to src/masonite/drivers/authentication/AuthJwtDriver.py index ccb8f3e09..5ae1313f4 100644 --- a/masonite/drivers/authentication/AuthJwtDriver.py +++ b/src/masonite/drivers/authentication/AuthJwtDriver.py @@ -1,12 +1,12 @@ """AuthJWTDriver Module.""" import pendulum -from masonite.auth import Auth -from masonite.contracts import AuthContract -from masonite.drivers import BaseDriver -from masonite.exceptions import DriverLibraryNotFound -from masonite.helpers import config, cookie_expire_time -from masonite.request import Request +from ...auth import Auth +from ...contracts import AuthContract +from ...drivers import BaseDriver +from ...exceptions import DriverLibraryNotFound +from ...helpers import config, cookie_expire_time +from ...request import Request class AuthJwtDriver(BaseDriver, AuthContract): @@ -64,7 +64,7 @@ def user(self, auth_model): def save(self, _, **kwargs): """Saves the state of authentication. - In this case the state is saving to a cookie. + In this case the state is serializing the user model and saving to a token cookie. Arguments: remember_token {string} -- A token containing the state. @@ -89,3 +89,7 @@ def delete(self): bool """ self.request.delete_cookie('token') + + def logout(self): + self.delete() + self.request.reset_user() diff --git a/masonite/drivers/broadcast/BroadcastAblyDriver.py b/src/masonite/drivers/broadcast/BroadcastAblyDriver.py similarity index 92% rename from masonite/drivers/broadcast/BroadcastAblyDriver.py rename to src/masonite/drivers/broadcast/BroadcastAblyDriver.py index 570176e01..3459d038a 100644 --- a/masonite/drivers/broadcast/BroadcastAblyDriver.py +++ b/src/masonite/drivers/broadcast/BroadcastAblyDriver.py @@ -1,9 +1,9 @@ """Module for using the Ably websocket driver.""" -from masonite.contracts import BroadcastContract -from masonite.drivers import BaseDriver -from masonite.exceptions import DriverLibraryNotFound -from masonite.app import App +from ...contracts import BroadcastContract +from ...drivers import BaseDriver +from ...exceptions import DriverLibraryNotFound +from ...app import App class BroadcastAblyDriver(BroadcastContract, BaseDriver): diff --git a/masonite/drivers/broadcast/BroadcastPusherDriver.py b/src/masonite/drivers/broadcast/BroadcastPusherDriver.py similarity index 92% rename from masonite/drivers/broadcast/BroadcastPusherDriver.py rename to src/masonite/drivers/broadcast/BroadcastPusherDriver.py index 328d0ec1f..bb54790f8 100644 --- a/masonite/drivers/broadcast/BroadcastPusherDriver.py +++ b/src/masonite/drivers/broadcast/BroadcastPusherDriver.py @@ -1,9 +1,9 @@ """Module for the Pusher websocket driver.""" -from masonite.contracts import BroadcastContract -from masonite.drivers import BaseDriver -from masonite.exceptions import DriverLibraryNotFound -from masonite.helpers import config +from ...contracts import BroadcastContract +from ...drivers import BaseDriver +from ...exceptions import DriverLibraryNotFound +from ...helpers import config class BroadcastPusherDriver(BroadcastContract, BaseDriver): diff --git a/masonite/drivers/cache/BaseCacheDriver.py b/src/masonite/drivers/cache/BaseCacheDriver.py similarity index 95% rename from masonite/drivers/cache/BaseCacheDriver.py rename to src/masonite/drivers/cache/BaseCacheDriver.py index c42c5a61b..a0f90b447 100644 --- a/masonite/drivers/cache/BaseCacheDriver.py +++ b/src/masonite/drivers/cache/BaseCacheDriver.py @@ -1,6 +1,6 @@ """Base cache driver module.""" -from masonite.drivers import BaseDriver +from ...drivers import BaseDriver class BaseCacheDriver(BaseDriver): diff --git a/masonite/drivers/cache/CacheDiskDriver.py b/src/masonite/drivers/cache/CacheDiskDriver.py similarity index 95% rename from masonite/drivers/cache/CacheDiskDriver.py rename to src/masonite/drivers/cache/CacheDiskDriver.py index 4ea93fe77..f1c767b95 100644 --- a/masonite/drivers/cache/CacheDiskDriver.py +++ b/src/masonite/drivers/cache/CacheDiskDriver.py @@ -4,23 +4,23 @@ import os import time -from masonite.app import App -from masonite.contracts import CacheContract -from masonite.drivers import BaseCacheDriver +from ...contracts import CacheContract +from ...drivers import BaseCacheDriver +from ...helpers import config class CacheDiskDriver(CacheContract, BaseCacheDriver): """Class for the cache disk driver.""" - def __init__(self, app: App): + def __init__(self): """Cache disk driver constructor. Arguments: CacheConfig {config.cache} -- Cache configuration module. Application {config.application} -- Application configuration module. """ - self.config = app.make('CacheConfig') - self.appconfig = app.make('Application') + self.config = config('cache') + self.appconfig = config('application') self.cache_forever = None def store(self, key, value, extension=".txt", location=None): diff --git a/masonite/drivers/cache/CacheRedisDriver.py b/src/masonite/drivers/cache/CacheRedisDriver.py similarity index 96% rename from masonite/drivers/cache/CacheRedisDriver.py rename to src/masonite/drivers/cache/CacheRedisDriver.py index d590f4c87..b629fd532 100644 --- a/masonite/drivers/cache/CacheRedisDriver.py +++ b/src/masonite/drivers/cache/CacheRedisDriver.py @@ -2,9 +2,9 @@ import os -from masonite.contracts import CacheContract -from masonite.drivers import BaseCacheDriver -from masonite.exceptions import DriverLibraryNotFound +from ...contracts import CacheContract +from ...drivers import BaseCacheDriver +from ...exceptions import DriverLibraryNotFound class CacheRedisDriver(CacheContract, BaseCacheDriver): diff --git a/masonite/drivers/mail/BaseMailDriver.py b/src/masonite/drivers/mail/BaseMailDriver.py similarity index 90% rename from masonite/drivers/mail/BaseMailDriver.py rename to src/masonite/drivers/mail/BaseMailDriver.py index 97502c220..d4350966e 100644 --- a/masonite/drivers/mail/BaseMailDriver.py +++ b/src/masonite/drivers/mail/BaseMailDriver.py @@ -1,11 +1,14 @@ """Base mail driver module.""" -from masonite.drivers import BaseDriver -from masonite.app import App import copy +from ...app import App +from ...helpers import config +from ...response import Responsable +from .. import BaseDriver -class BaseMailDriver(BaseDriver): + +class BaseMailDriver(BaseDriver, Responsable): """Base mail driver class. This class is inherited by all mail drivers.""" def __init__(self, app: App): @@ -15,7 +18,7 @@ def __init__(self, app: App): app {masonite.app.App} -- The Masonite container class. view {object} -- This is the masonite.view.View class. """ - self.config = app.make('MailConfig') + self.config = config('mail') self.app = app self.to_address = None self.from_address = self.config.FROM @@ -88,6 +91,9 @@ def subject(self, subject): self.message_subject = subject return self + def get_response(self): + return self.message_body + def reply_to(self, reply_to): """Set the Reply-To of an email. diff --git a/masonite/drivers/mail/MailLogDriver.py b/src/masonite/drivers/mail/MailLogDriver.py similarity index 93% rename from masonite/drivers/mail/MailLogDriver.py rename to src/masonite/drivers/mail/MailLogDriver.py index c761d1115..781e4576d 100644 --- a/masonite/drivers/mail/MailLogDriver.py +++ b/src/masonite/drivers/mail/MailLogDriver.py @@ -3,9 +3,9 @@ import logging import os -from masonite.app import App -from masonite.contracts import MailContract -from masonite.drivers import BaseMailDriver +from ...app import App +from ...contracts import MailContract +from ...drivers import BaseMailDriver class MailLogDriver(BaseMailDriver, MailContract): diff --git a/masonite/drivers/mail/MailMailgunDriver.py b/src/masonite/drivers/mail/MailMailgunDriver.py similarity index 91% rename from masonite/drivers/mail/MailMailgunDriver.py rename to src/masonite/drivers/mail/MailMailgunDriver.py index 83a99c6d4..f304e5bd3 100644 --- a/masonite/drivers/mail/MailMailgunDriver.py +++ b/src/masonite/drivers/mail/MailMailgunDriver.py @@ -1,8 +1,8 @@ """Mailgun Driver Module.""" import requests -from masonite.contracts.MailContract import MailContract -from masonite.drivers import BaseMailDriver +from ...contracts.MailContract import MailContract +from ...drivers import BaseMailDriver class MailMailgunDriver(BaseMailDriver, MailContract): @@ -20,7 +20,7 @@ def send(self, message=None): if self._queue: from wsgi import container - from masonite import Queue + from .. import Queue return container.make(Queue).push(self._send_mail, args=(message,)) return self._send_mail(message) diff --git a/masonite/drivers/mail/MailSmtpDriver.py b/src/masonite/drivers/mail/MailSmtpDriver.py similarity index 93% rename from masonite/drivers/mail/MailSmtpDriver.py rename to src/masonite/drivers/mail/MailSmtpDriver.py index 70e0a44e7..8ed96c0c5 100644 --- a/masonite/drivers/mail/MailSmtpDriver.py +++ b/src/masonite/drivers/mail/MailSmtpDriver.py @@ -4,8 +4,8 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText -from masonite.contracts.MailContract import MailContract -from masonite.drivers import BaseMailDriver +from ...contracts.MailContract import MailContract +from ...drivers import BaseMailDriver class MailSmtpDriver(BaseMailDriver, MailContract): @@ -47,7 +47,7 @@ def send(self, message_contents=None): if self._queue: from wsgi import container - from masonite import Queue + from .. import Queue container.make(Queue).push( self._send_mail, args=(self.config.FROM['name'], self.to_address, message.as_string()) diff --git a/masonite/drivers/mail/MailTerminalDriver.py b/src/masonite/drivers/mail/MailTerminalDriver.py similarity index 90% rename from masonite/drivers/mail/MailTerminalDriver.py rename to src/masonite/drivers/mail/MailTerminalDriver.py index a1ae326dc..121337902 100644 --- a/masonite/drivers/mail/MailTerminalDriver.py +++ b/src/masonite/drivers/mail/MailTerminalDriver.py @@ -2,9 +2,9 @@ import logging -from masonite.app import App -from masonite.contracts.MailContract import MailContract -from masonite.drivers import BaseMailDriver +from ...app import App +from ...contracts.MailContract import MailContract +from ...drivers import BaseMailDriver class MailTerminalDriver(BaseMailDriver, MailContract): diff --git a/masonite/drivers/queue/BaseQueueDriver.py b/src/masonite/drivers/queue/BaseQueueDriver.py similarity index 95% rename from masonite/drivers/queue/BaseQueueDriver.py rename to src/masonite/drivers/queue/BaseQueueDriver.py index 3e57823d7..5a5f44341 100644 --- a/masonite/drivers/queue/BaseQueueDriver.py +++ b/src/masonite/drivers/queue/BaseQueueDriver.py @@ -4,8 +4,8 @@ import pendulum -from masonite.drivers import BaseDriver -from masonite.helpers import HasColoredCommands +from ...drivers import BaseDriver +from ...helpers import HasColoredCommands class BaseQueueDriver(BaseDriver, HasColoredCommands): diff --git a/masonite/drivers/queue/QueueAmqpDriver.py b/src/masonite/drivers/queue/QueueAmqpDriver.py similarity index 94% rename from masonite/drivers/queue/QueueAmqpDriver.py rename to src/masonite/drivers/queue/QueueAmqpDriver.py index 3801e6d78..ab46268b4 100644 --- a/masonite/drivers/queue/QueueAmqpDriver.py +++ b/src/masonite/drivers/queue/QueueAmqpDriver.py @@ -5,11 +5,11 @@ import time import pendulum -from masonite.contracts import QueueContract -from masonite.drivers import BaseQueueDriver -from masonite.exceptions import DriverLibraryNotFound -from masonite.helpers import HasColoredCommands -from masonite.queues import Queueable +from ...contracts import QueueContract +from ...drivers import BaseQueueDriver +from ...exceptions import DriverLibraryNotFound +from ...helpers import HasColoredCommands +from ...queues import Queueable class QueueAmqpDriver(BaseQueueDriver, QueueContract, HasColoredCommands): @@ -40,7 +40,7 @@ def _publish(self, body): self.channel.close() self.connection.close() - def push(self, *objects, args=(), callback='handle', ran=1, channel=None, **options): + def push(self, *objects, args=(), callback='handle', ran=1, channel=None, **options): # skipcq PYL-W0613 """Push objects onto the amqp stack. Arguments: @@ -107,7 +107,7 @@ def basic_consume(self, callback, queue_name): except TypeError: self.channel.basic_consume(queue_name, callback) - def work(self, ch, method, properties, body): + def work(self, ch, method, _, body): from wsgi import container job = pickle.loads(body) obj = job['obj'] diff --git a/masonite/drivers/queue/QueueAsyncDriver.py b/src/masonite/drivers/queue/QueueAsyncDriver.py similarity index 92% rename from masonite/drivers/queue/QueueAsyncDriver.py rename to src/masonite/drivers/queue/QueueAsyncDriver.py index c827c5b18..60f731f27 100644 --- a/masonite/drivers/queue/QueueAsyncDriver.py +++ b/src/masonite/drivers/queue/QueueAsyncDriver.py @@ -5,11 +5,11 @@ from concurrent.futures import (ProcessPoolExecutor, ThreadPoolExecutor, as_completed) -from masonite.app import App -from masonite.contracts import QueueContract -from masonite.drivers import BaseQueueDriver -from masonite.exceptions import QueueException -from masonite.helpers import HasColoredCommands, config +from ...app import App +from ...contracts import QueueContract +from ...drivers import BaseQueueDriver +from ...exceptions import QueueException +from ...helpers import HasColoredCommands, config class QueueAsyncDriver(BaseQueueDriver, HasColoredCommands, QueueContract): diff --git a/masonite/drivers/queue/QueueDatabaseDriver.py b/src/masonite/drivers/queue/QueueDatabaseDriver.py similarity index 92% rename from masonite/drivers/queue/QueueDatabaseDriver.py rename to src/masonite/drivers/queue/QueueDatabaseDriver.py index c22eefabf..5739fc191 100644 --- a/masonite/drivers/queue/QueueDatabaseDriver.py +++ b/src/masonite/drivers/queue/QueueDatabaseDriver.py @@ -5,10 +5,10 @@ import time import pendulum -from masonite.contracts import QueueContract -from masonite.drivers import BaseQueueDriver -from masonite.helpers import HasColoredCommands, parse_human_time -from masonite.queues import Queueable +from ...contracts import QueueContract +from ...drivers import BaseQueueDriver +from ...helpers import HasColoredCommands, parse_human_time +from ...queues import Queueable class QueueDatabaseDriver(BaseQueueDriver, HasColoredCommands, QueueContract): @@ -34,7 +34,6 @@ def push(self, *objects, args=(), kwargs={}, **options): """ from config.database import DB as schema - from config import queue callback = options.get('callback', 'handle') wait = options.get('wait', None) @@ -48,7 +47,7 @@ def push(self, *objects, args=(), kwargs={}, **options): for job in objects: if schema.get_schema_builder().has_table('queue_jobs'): - payload = pickle.dumps({'obj': job, 'args': args, 'callback': callback}) + payload = pickle.dumps({'obj': job, 'args': args, 'kwargs': kwargs, 'callback': callback}) schema.table('queue_jobs').insert({ 'name': str(job), 'serialized': payload, @@ -58,9 +57,8 @@ def push(self, *objects, args=(), kwargs={}, **options): 'wait_until': wait, }) - def consume(self, channel, fair=False, **options): + def consume(self, channel, **options): # skipcq from config.database import DB as schema, DATABASES - from config import queue from wsgi import container if not channel or channel == 'default': @@ -109,7 +107,7 @@ def consume(self, channel, fair=False, **options): self.success('[\u2713] Job Successfully Processed') except UnicodeEncodeError: self.success('[Y] Job Successfully Processed') - except Exception as e: + except Exception as e: # skipcq self.danger('Job Failed: {}'.format(str(e))) if not obj.run_again_on_fail: diff --git a/masonite/drivers/session/SessionCookieDriver.py b/src/masonite/drivers/session/SessionCookieDriver.py similarity index 90% rename from masonite/drivers/session/SessionCookieDriver.py rename to src/masonite/drivers/session/SessionCookieDriver.py index 1adb3f793..e63579abc 100644 --- a/masonite/drivers/session/SessionCookieDriver.py +++ b/src/masonite/drivers/session/SessionCookieDriver.py @@ -2,23 +2,21 @@ import json -from masonite.contracts import SessionContract -from masonite.drivers import BaseDriver -from masonite.request import Request -from masonite.app import App +from ...contracts import SessionContract +from ...drivers import BaseDriver +from ...request import Request class SessionCookieDriver(SessionContract, BaseDriver): """Cookie Session Driver.""" - def __init__(self, request: Request, app: App): + def __init__(self, request: Request): """Cookie Session Constructor. Arguments: Environ {dict} -- The WSGI environment Request {masonite.request.Request} -- The Request class. """ - self.environ = app.make('Environ') self.request = request def get(self, key): @@ -97,8 +95,8 @@ def __collect_data(self): dict """ cookies = {} - if 'HTTP_COOKIE' in self.environ and self.environ['HTTP_COOKIE']: - cookies_original = self.environ['HTTP_COOKIE'].split(';') + if 'HTTP_COOKIE' in self.request.environ and self.request.environ['HTTP_COOKIE']: + cookies_original = self.request.environ['HTTP_COOKIE'].split(';') for cookie in cookies_original: if cookie.strip().startswith('s_') or cookie.strip().startswith('f_'): data = cookie.split("=", 1) diff --git a/masonite/drivers/session/SessionMemoryDriver.py b/src/masonite/drivers/session/SessionMemoryDriver.py similarity index 90% rename from masonite/drivers/session/SessionMemoryDriver.py rename to src/masonite/drivers/session/SessionMemoryDriver.py index 1037dcbd8..b3e6eff86 100644 --- a/masonite/drivers/session/SessionMemoryDriver.py +++ b/src/masonite/drivers/session/SessionMemoryDriver.py @@ -1,8 +1,8 @@ """Session Memory Module.""" -from masonite.contracts import SessionContract -from masonite.drivers import BaseDriver -from masonite.app import App +from ...contracts import SessionContract +from ...drivers import BaseDriver +from ...request import Request class SessionMemoryDriver(SessionContract, BaseDriver): @@ -11,13 +11,13 @@ class SessionMemoryDriver(SessionContract, BaseDriver): _session = {} _flash = {} - def __init__(self, app: App): + def __init__(self, request: Request): """Cookie Session Constructor. Arguments: Environ {dict} -- The WSGI environment """ - self.environ = app.make('Environ') + self.request = request def get(self, key): """Get a value from the session. @@ -117,10 +117,10 @@ def delete(self, key): def __get_client_address(self): """Get ip from the client.""" - if 'HTTP_X_FORWARDED_FOR' in self.environ: - return self.environ['HTTP_X_FORWARDED_FOR'].split(',')[-1].strip() + if 'HTTP_X_FORWARDED_FOR' in self.request.environ: + return self.request.environ['HTTP_X_FORWARDED_FOR'].split(',')[-1].strip() - return self.environ['REMOTE_ADDR'] + return self.request.environ['REMOTE_ADDR'] def __collect_data(self, key=False): """Collect data from session and flash data. diff --git a/masonite/drivers/storage/StorageDiskDriver.py b/src/masonite/drivers/storage/StorageDiskDriver.py similarity index 93% rename from masonite/drivers/storage/StorageDiskDriver.py rename to src/masonite/drivers/storage/StorageDiskDriver.py index ac38706a3..aec29c2af 100644 --- a/masonite/drivers/storage/StorageDiskDriver.py +++ b/src/masonite/drivers/storage/StorageDiskDriver.py @@ -2,9 +2,9 @@ import pathlib import shutil -from masonite import Upload -from masonite.contracts import StorageContract -from masonite.drivers import BaseDriver +from ... import Upload +from ...contracts import StorageContract +from ...drivers import BaseDriver class StorageDiskDriver(BaseDriver, StorageContract): diff --git a/masonite/drivers/upload/BaseUploadDriver.py b/src/masonite/drivers/upload/BaseUploadDriver.py similarity index 93% rename from masonite/drivers/upload/BaseUploadDriver.py rename to src/masonite/drivers/upload/BaseUploadDriver.py index e8f24cf81..a6ba43819 100644 --- a/masonite/drivers/upload/BaseUploadDriver.py +++ b/src/masonite/drivers/upload/BaseUploadDriver.py @@ -1,10 +1,10 @@ """Base upload driver module.""" import _io -from masonite.drivers import BaseDriver -from masonite.exceptions import FileTypeException -from masonite.helpers import random_string -from masonite.helpers import config +from ...drivers import BaseDriver +from ...exceptions import FileTypeException +from ...helpers import random_string +from ...helpers import config class BaseUploadDriver(BaseDriver): diff --git a/masonite/drivers/upload/UploadDiskDriver.py b/src/masonite/drivers/upload/UploadDiskDriver.py similarity index 90% rename from masonite/drivers/upload/UploadDiskDriver.py rename to src/masonite/drivers/upload/UploadDiskDriver.py index 60ebc6717..d11235808 100644 --- a/masonite/drivers/upload/UploadDiskDriver.py +++ b/src/masonite/drivers/upload/UploadDiskDriver.py @@ -3,9 +3,9 @@ import os import _io -from masonite.contracts import UploadContract -from masonite.drivers import BaseUploadDriver -from masonite.helpers.filesystem import make_directory +from ...contracts import UploadContract +from ...drivers import BaseUploadDriver +from ...helpers.filesystem import make_directory class UploadDiskDriver(BaseUploadDriver, UploadContract): diff --git a/masonite/drivers/upload/UploadS3Driver.py b/src/masonite/drivers/upload/UploadS3Driver.py similarity index 87% rename from masonite/drivers/upload/UploadS3Driver.py rename to src/masonite/drivers/upload/UploadS3Driver.py index ef027f209..dec50bd44 100644 --- a/masonite/drivers/upload/UploadS3Driver.py +++ b/src/masonite/drivers/upload/UploadS3Driver.py @@ -2,17 +2,17 @@ import os -from masonite.contracts import UploadContract -from masonite.drivers import BaseUploadDriver -from masonite.exceptions import DriverLibraryNotFound -from masonite.managers import UploadManager -from masonite.app import App +from ...contracts import UploadContract +from ...drivers import BaseUploadDriver +from ...exceptions import DriverLibraryNotFound +from ...managers import UploadManager +from ...helpers import config class UploadS3Driver(BaseUploadDriver, UploadContract): """Amazon S3 Upload driver.""" - def __init__(self, upload: UploadManager, app: App): + def __init__(self, upload: UploadManager): """Upload Disk Driver Constructor. Arguments: @@ -20,7 +20,7 @@ def __init__(self, upload: UploadManager, app: App): StorageConfig {config.storage} -- Storage configuration. """ self.upload = upload - self.config = app.make('StorageConfig') + self.config = config('storage') def store(self, fileitem, filename=None, location=None): """Store the file into Amazon S3 server. diff --git a/masonite/environment.py b/src/masonite/environment.py similarity index 83% rename from masonite/environment.py rename to src/masonite/environment.py index da1484b30..a8970eee6 100644 --- a/masonite/environment.py +++ b/src/masonite/environment.py @@ -8,7 +8,7 @@ class LoadEnvironment: """This class is used for loading the environment from .env and .env.* files.""" - def __init__(self, env=None, override=True, only=None): + def __init__(self, environment=None, override=True, only=None): """LoadEnvironment constructor. Keyword Arguments: @@ -29,22 +29,22 @@ def __init__(self, env=None, override=True, only=None): if os.environ.get('APP_ENV'): self._load_environment(os.environ.get( 'APP_ENV'), override=override) - if env: - self._load_environment(env, override=override) + if environment: + self._load_environment(environment, override=override) if "pytest" in sys.modules: self._load_environment('testing', override=override) - def _load_environment(self, env, override=False): + def _load_environment(self, environment, override=False): """Load the environment depending on the env file. Arguments: - env {string} -- Name of the environment file to load from + environment {string} -- Name of the environment file to load from Keyword Arguments: override {bool} -- Whether the environment file should overwrite existing environment keys. (default: {False}) """ - env_path = str(Path('.') / '.env.{}'.format(env)) + env_path = str(Path('.') / '.env.{}'.format(environment)) self.env(dotenv_path=env_path, override=override) diff --git a/masonite/exception_handler.py b/src/masonite/exception_handler.py similarity index 87% rename from masonite/exception_handler.py rename to src/masonite/exception_handler.py index 65b466091..ab20f1720 100644 --- a/masonite/exception_handler.py +++ b/src/masonite/exception_handler.py @@ -10,12 +10,13 @@ import sys import traceback -from masonite.app import App -from masonite.exceptions import DumpException -from masonite.request import Request -from masonite.response import Response -from masonite.view import View -from masonite.listeners import BaseExceptionListener +from .app import App +from .exceptions import DumpException +from .request import Request +from .response import Response +from .view import View +from .helpers import config +from .listeners import BaseExceptionListener package_directory = os.path.dirname(os.path.realpath(__file__)) @@ -36,12 +37,14 @@ def __init__(self, app): def _register_static_files(self): """Register static files into the container.""" - self._app.make('Storage').STATICFILES.update( - { - os.path.join(package_directory, 'snippets/exceptions'): - '_exceptions/' - } - ) + storage = config('storage') + if storage: + storage.STATICFILES.update( + { + os.path.join(package_directory, 'snippets/exceptions'): + '_exceptions/' + } + ) def load_exception(self, exception): """Load the exception thrown into this handler. @@ -58,7 +61,7 @@ def load_exception(self, exception): self.handle(exception) def run_listeners(self, exception, stacktraceback): - for key, exception_class in self._app.collect(BaseExceptionListener).items(): + for exception_class in self._app.collect(BaseExceptionListener): if '*' in exception_class.listens or exception.__class__ in exception_class.listens: file, line = self.get_file_and_line(stacktraceback) self._app.resolve(exception_class).handle(exception, file, line) @@ -109,7 +112,7 @@ def handle(self, exception): last_stacktrace = [] second_to_last_stacktrace = [] - self.response.view(self._app.make('View')('/masonite/snippets/exception', + self.response.view(self._app.make('View')(config('application.templates.exceptions', '/masonite/snippets/exception'), { 'exception': self._exception, 'split_exception': str(self._exception).split(' '), @@ -118,10 +121,11 @@ def handle(self, exception): 'stacktrace': traceback.extract_tb(sys.exc_info()[2]) + last_stacktrace + second_to_last_stacktrace, 'second_to_last': second_to_last_stacktrace, 'app': self._app, + 'providers': config('providers.providers', []), 'enumerate': enumerate, 'open': open, 'platform': platform - } + } )) diff --git a/masonite/exceptions.py b/src/masonite/exceptions.py similarity index 100% rename from masonite/exceptions.py rename to src/masonite/exceptions.py diff --git a/masonite/helpers/Extendable.py b/src/masonite/helpers/Extendable.py similarity index 100% rename from masonite/helpers/Extendable.py rename to src/masonite/helpers/Extendable.py diff --git a/masonite/helpers/__init__.py b/src/masonite/helpers/__init__.py similarity index 90% rename from masonite/helpers/__init__.py rename to src/masonite/helpers/__init__.py index ea6097368..f093dee48 100644 --- a/masonite/helpers/__init__.py +++ b/src/masonite/helpers/__init__.py @@ -4,6 +4,6 @@ from .Extendable import Extendable from .time import cookie_expire_time, parse_human_time from .optional import Optional as optional -from .structures import config, Dot +from .structures import config, Dot, load from .migrations import has_unmigrated_migrations from orator.support.collection import Collection as collect diff --git a/masonite/helpers/filesystem.py b/src/masonite/helpers/filesystem.py similarity index 100% rename from masonite/helpers/filesystem.py rename to src/masonite/helpers/filesystem.py diff --git a/masonite/helpers/migrations.py b/src/masonite/helpers/migrations.py similarity index 96% rename from masonite/helpers/migrations.py rename to src/masonite/helpers/migrations.py index 5fe10e58b..d7f6f8923 100644 --- a/masonite/helpers/migrations.py +++ b/src/masonite/helpers/migrations.py @@ -1,7 +1,7 @@ import subprocess -from masonite.helpers import config, HasColoredCommands -from masonite.packages import add_venv_site_packages +from ..helpers import config, HasColoredCommands +from ..packages import add_venv_site_packages from orator.migrations import DatabaseMigrationRepository, Migrator diff --git a/masonite/helpers/misc.py b/src/masonite/helpers/misc.py similarity index 98% rename from masonite/helpers/misc.py rename to src/masonite/helpers/misc.py index b14947a16..d02b2fc2c 100644 --- a/masonite/helpers/misc.py +++ b/src/masonite/helpers/misc.py @@ -4,7 +4,7 @@ import string import warnings -from masonite.exceptions import AmbiguousError +from ..exceptions import AmbiguousError def random_string(length=4): diff --git a/masonite/helpers/optional.py b/src/masonite/helpers/optional.py similarity index 100% rename from masonite/helpers/optional.py rename to src/masonite/helpers/optional.py diff --git a/masonite/helpers/password.py b/src/masonite/helpers/password.py similarity index 59% rename from masonite/helpers/password.py rename to src/masonite/helpers/password.py index 606fe0091..e465c949b 100644 --- a/masonite/helpers/password.py +++ b/src/masonite/helpers/password.py @@ -3,17 +3,17 @@ import bcrypt -def password(password): +def password(password_string): """Bcrypt a string. Useful for storing passwords in a database. Arguments: - password {string} -- A string like a users plain text password to be bcrypted. + pass {string} -- A string like a users plain text password to be bcrypted. Returns: string -- The encrypted string. """ return bytes(bcrypt.hashpw( - bytes(password, 'utf-8'), bcrypt.gensalt() + bytes(password_string, 'utf-8'), bcrypt.gensalt() )).decode('utf-8') diff --git a/masonite/helpers/routes.py b/src/masonite/helpers/routes.py similarity index 95% rename from masonite/helpers/routes.py rename to src/masonite/helpers/routes.py index b1ad10f4d..560b69671 100644 --- a/masonite/helpers/routes.py +++ b/src/masonite/helpers/routes.py @@ -1,6 +1,6 @@ """Helper Functions for RouteProvider.""" -from masonite.helpers import deprecated +from .misc import deprecated def flatten_routes(routes): @@ -37,7 +37,7 @@ def get(url, controller): Returns: masonite.routes.Get -- The Masonite Get class. """ - from masonite.routes import Get + from ..routes import Get return Get().route(url, controller) @@ -54,7 +54,7 @@ def match(method_type, url, controller): Returns: masonite.routes.Get -- The Masonite Get class. """ - from masonite.routes import Match + from ..routes import Match return Match(method_type).route(url, controller) @@ -70,7 +70,7 @@ def post(url, controller): Returns: masonite.routes.Post -- The Masonite Post class. """ - from masonite.routes import Post + from ..routes import Post return Post().route(url, controller) @@ -86,7 +86,7 @@ def delete(url, controller): Returns: masonite.routes.Delete -- The Masonite Delete class. """ - from masonite.routes import Delete + from ..routes import Delete return Delete().route(url, controller) @@ -102,7 +102,7 @@ def put(url, controller): Returns: masonite.routes.Put -- The Masonite Put class. """ - from masonite.routes import Put + from ..routes import Put return Put().route(url, controller) @@ -118,7 +118,7 @@ def patch(url, controller): Returns: masonite.routes.Patch -- The Masonite Patch class. """ - from masonite.routes import Patch + from ..routes import Patch return Patch().route(url, controller) diff --git a/masonite/helpers/sign.py b/src/masonite/helpers/sign.py similarity index 96% rename from masonite/helpers/sign.py rename to src/masonite/helpers/sign.py index 19138f3f7..b44568af2 100644 --- a/masonite/helpers/sign.py +++ b/src/masonite/helpers/sign.py @@ -1,4 +1,4 @@ -from masonite.auth import Sign +from ..auth import Sign def sign(value): diff --git a/masonite/helpers/static.py b/src/masonite/helpers/static.py similarity index 100% rename from masonite/helpers/static.py rename to src/masonite/helpers/static.py diff --git a/masonite/helpers/status.py b/src/masonite/helpers/status.py similarity index 100% rename from masonite/helpers/status.py rename to src/masonite/helpers/status.py diff --git a/masonite/helpers/structures.py b/src/masonite/helpers/structures.py similarity index 91% rename from masonite/helpers/structures.py rename to src/masonite/helpers/structures.py index 4c071dc89..6fb00b7ab 100644 --- a/masonite/helpers/structures.py +++ b/src/masonite/helpers/structures.py @@ -57,7 +57,7 @@ def dot(self, search, dictionary, default=None): if isinstance(dic, str) and dic.isnumeric(): continue - if dic and not isinstance(dic, int) and len(dic) == 1 and not isinstance(dic[list(dic)[0]], dict): + if dic and not isinstance(dic, int) and hasattr(dic, '__len__') and len(dic) == 1 and not isinstance(dic[list(dic)[0]], dict): possible = dic if not isinstance(dic, dict): @@ -172,3 +172,18 @@ def config(path, default=''): mixed """ return Dot().locate('config.' + path, default) + + +def load(path, default=''): + """Used to fetch a value from a configuration file + + Arguments: + path {string} -- The search path using dot notation of the value to get + + Keyword Arguments: + default {str} -- The default value if not value and be found (default: {''}) + + Returns: + mixed + """ + return Dot().locate(path, default) diff --git a/masonite/helpers/time.py b/src/masonite/helpers/time.py similarity index 100% rename from masonite/helpers/time.py rename to src/masonite/helpers/time.py diff --git a/masonite/helpers/view_helpers.py b/src/masonite/helpers/view_helpers.py similarity index 100% rename from masonite/helpers/view_helpers.py rename to src/masonite/helpers/view_helpers.py diff --git a/masonite/hook.py b/src/masonite/hook.py similarity index 95% rename from masonite/hook.py rename to src/masonite/hook.py index 456b89a5b..5b1ec4ba4 100644 --- a/masonite/hook.py +++ b/src/masonite/hook.py @@ -1,6 +1,6 @@ """Module for the Hook class.""" -from masonite.app import App +from .app import App class Hook: diff --git a/masonite/listeners/BaseExceptionListener.py b/src/masonite/listeners/BaseExceptionListener.py similarity index 100% rename from masonite/listeners/BaseExceptionListener.py rename to src/masonite/listeners/BaseExceptionListener.py diff --git a/masonite/listeners/__init__.py b/src/masonite/listeners/__init__.py similarity index 100% rename from masonite/listeners/__init__.py rename to src/masonite/listeners/__init__.py diff --git a/masonite/managers/AuthManager.py b/src/masonite/managers/AuthManager.py similarity index 64% rename from masonite/managers/AuthManager.py rename to src/masonite/managers/AuthManager.py index bbbcc9049..2c27a140b 100644 --- a/masonite/managers/AuthManager.py +++ b/src/masonite/managers/AuthManager.py @@ -1,16 +1,16 @@ """Auth Manager Module.""" -from masonite.managers import Manager +from .Manager import Manager class AuthManager(Manager): """Manages all auth drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'AuthConfig' + config = 'auth' driver_prefix = 'Auth' diff --git a/masonite/managers/BroadcastManager.py b/src/masonite/managers/BroadcastManager.py similarity index 60% rename from masonite/managers/BroadcastManager.py rename to src/masonite/managers/BroadcastManager.py index 6e938474b..844fe8c26 100644 --- a/masonite/managers/BroadcastManager.py +++ b/src/masonite/managers/BroadcastManager.py @@ -1,17 +1,17 @@ """Broadcast Manager Module.""" -from masonite.contracts import BroadcastManagerContract -from masonite.managers import Manager +from ..contracts import BroadcastManagerContract +from .Manager import Manager class BroadcastManager(Manager, BroadcastManagerContract): """Manages all broadcast drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'BroadcastConfig' + config = 'broadcast' driver_prefix = 'Broadcast' diff --git a/masonite/managers/CacheManager.py b/src/masonite/managers/CacheManager.py similarity index 58% rename from masonite/managers/CacheManager.py rename to src/masonite/managers/CacheManager.py index 1f045df3d..83c2e5027 100644 --- a/masonite/managers/CacheManager.py +++ b/src/masonite/managers/CacheManager.py @@ -1,17 +1,17 @@ """Cache Manager.""" -from masonite.contracts import CacheManagerContract -from masonite.managers import Manager +from ..contracts import CacheManagerContract +from .Manager import Manager class CacheManager(Manager, CacheManagerContract): """Manages all cache drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'CacheConfig' + config = 'cache' driver_prefix = 'Cache' diff --git a/masonite/managers/MailManager.py b/src/masonite/managers/MailManager.py similarity index 62% rename from masonite/managers/MailManager.py rename to src/masonite/managers/MailManager.py index b5e10bf74..343e45519 100644 --- a/masonite/managers/MailManager.py +++ b/src/masonite/managers/MailManager.py @@ -1,17 +1,18 @@ """Mail Manager Module.""" -from masonite.contracts import MailManagerContract -from masonite.managers import Manager +from ..contracts import MailManagerContract +from .Manager import Manager +from ..helpers import config class MailManager(Manager, MailManagerContract): """Manages all mail drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'MailConfig' + config = 'mail' driver_prefix = 'Mail' def helper(self): @@ -20,7 +21,7 @@ def helper(self): Returns: Mail Driver """ - return self.driver(self.container.make('MailConfig').DRIVER) + return self.driver(config('mail.driver')) class Mail: diff --git a/masonite/managers/Manager.py b/src/masonite/managers/Manager.py similarity index 90% rename from masonite/managers/Manager.py rename to src/masonite/managers/Manager.py index 0288e16ca..bd641da15 100644 --- a/masonite/managers/Manager.py +++ b/src/masonite/managers/Manager.py @@ -2,11 +2,12 @@ import inspect -from masonite.exceptions import (DriverNotFound, - MissingContainerBindingNotFound, - UnacceptableDriverType) +from ..exceptions import (DriverNotFound, + MissingContainerBindingNotFound, + UnacceptableDriverType) -from masonite.app import App +from ..app import App +from ..helpers import config class Manager: @@ -64,7 +65,7 @@ def create_driver(self, driver=None): """ if driver in (None, 'default'): - driver = self.container.make(self.config).DRIVER.capitalize() + driver = config('{}.driver'.format(self.config)).capitalize() else: if isinstance(driver, str): driver = driver.capitalize() diff --git a/masonite/managers/QueueManager.py b/src/masonite/managers/QueueManager.py similarity index 59% rename from masonite/managers/QueueManager.py rename to src/masonite/managers/QueueManager.py index feb0c0248..5f3b8d0a4 100644 --- a/masonite/managers/QueueManager.py +++ b/src/masonite/managers/QueueManager.py @@ -1,17 +1,17 @@ """Queue Manager Module.""" -from masonite.contracts import QueueManagerContract -from masonite.managers import Manager +from ..contracts import QueueManagerContract +from .Manager import Manager class QueueManager(Manager, QueueManagerContract): """Manages all queue drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'QueueConfig' + config = 'queue' driver_prefix = 'Queue' diff --git a/masonite/managers/SessionManager.py b/src/masonite/managers/SessionManager.py similarity index 60% rename from masonite/managers/SessionManager.py rename to src/masonite/managers/SessionManager.py index 12c56c6c9..8880e2c0b 100644 --- a/masonite/managers/SessionManager.py +++ b/src/masonite/managers/SessionManager.py @@ -1,17 +1,17 @@ """Session Manager Module.""" -from masonite.contracts import SessionManagerContract -from masonite.managers import Manager +from ..contracts import SessionManagerContract +from .Manager import Manager class SessionManager(Manager, SessionManagerContract): """Manages all session drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'SessionConfig' + config = 'session' driver_prefix = 'Session' diff --git a/masonite/managers/StorageManager.py b/src/masonite/managers/StorageManager.py similarity index 59% rename from masonite/managers/StorageManager.py rename to src/masonite/managers/StorageManager.py index 851ef2f90..d1bc87d53 100644 --- a/masonite/managers/StorageManager.py +++ b/src/masonite/managers/StorageManager.py @@ -1,17 +1,17 @@ """Queue Manager Module.""" -from masonite.contracts import StorageManagerContract -from masonite.managers import Manager +from ..contracts import StorageManagerContract +from .Manager import Manager class StorageManager(Manager, StorageManagerContract): """Manages all queue drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'StorageConfig' + config = 'storage' driver_prefix = 'Storage' diff --git a/masonite/managers/UploadManager.py b/src/masonite/managers/UploadManager.py similarity index 59% rename from masonite/managers/UploadManager.py rename to src/masonite/managers/UploadManager.py index 39d703d47..200949955 100644 --- a/masonite/managers/UploadManager.py +++ b/src/masonite/managers/UploadManager.py @@ -1,17 +1,17 @@ """Upload Manager Module.""" -from masonite.contracts import UploadManagerContract -from masonite.managers import Manager +from ..contracts import UploadManagerContract +from .Manager import Manager class UploadManager(Manager, UploadManagerContract): """Manages all upload drivers. Arguments: - Manager {masonite.managers.Manager} -- The base Manager class. + Manager {from .managers.Manager} -- The base Manager class. """ - config = 'StorageConfig' + config = 'storage' driver_prefix = 'Upload' diff --git a/masonite/managers/__init__.py b/src/masonite/managers/__init__.py similarity index 100% rename from masonite/managers/__init__.py rename to src/masonite/managers/__init__.py diff --git a/masonite/middleware/CorsMiddleware.py b/src/masonite/middleware/CorsMiddleware.py similarity index 89% rename from masonite/middleware/CorsMiddleware.py rename to src/masonite/middleware/CorsMiddleware.py index 2869c79fa..008d76975 100644 --- a/masonite/middleware/CorsMiddleware.py +++ b/src/masonite/middleware/CorsMiddleware.py @@ -1,7 +1,7 @@ """CORS Middleware.""" -from masonite.helpers import config -from masonite.request import Request +from ..helpers import config +from ..request import Request class CorsMiddleware: diff --git a/masonite/middleware/CsrfMiddleware.py b/src/masonite/middleware/CsrfMiddleware.py similarity index 93% rename from masonite/middleware/CsrfMiddleware.py rename to src/masonite/middleware/CsrfMiddleware.py index 6ac16ca5d..d283201e0 100644 --- a/masonite/middleware/CsrfMiddleware.py +++ b/src/masonite/middleware/CsrfMiddleware.py @@ -2,10 +2,10 @@ from jinja2 import Markup -from masonite.auth import Csrf -from masonite.exceptions import InvalidCSRFToken -from masonite.request import Request -from masonite.view import View +from ..auth import Csrf +from ..exceptions import InvalidCSRFToken +from ..request import Request +from ..view import View class CsrfMiddleware: diff --git a/src/masonite/middleware/GuardMiddleware.py b/src/masonite/middleware/GuardMiddleware.py new file mode 100644 index 000000000..5e2722b1a --- /dev/null +++ b/src/masonite/middleware/GuardMiddleware.py @@ -0,0 +1,27 @@ +"""CSRF Middleware.""" + +from ..auth import Auth +from ..helpers import config + + +class GuardMiddleware: + """Middleware to switch the guard""" + + def __init__(self, auth: Auth): + self.auth = auth + + def before(self, guard): + """Sets specified guard for the request. + + Arguments: + guard {string} -- The key of the guard to set. + """ + self.auth.set(guard) + + def after(self, _): + """Sets the default guard back after the request. + + Arguments: + _ {ignored} -- ignored + """ + self.auth.set(config('auth.auth.defaults.guard')) diff --git a/masonite/middleware/MaintenanceModeMiddleware.py b/src/masonite/middleware/MaintenanceModeMiddleware.py similarity index 90% rename from masonite/middleware/MaintenanceModeMiddleware.py rename to src/masonite/middleware/MaintenanceModeMiddleware.py index 40c7321da..c0a334d30 100644 --- a/masonite/middleware/MaintenanceModeMiddleware.py +++ b/src/masonite/middleware/MaintenanceModeMiddleware.py @@ -1,6 +1,6 @@ """Maintainance Mode Middleware.""" import os -from masonite.request import Request +from ..request import Request from config import application diff --git a/masonite/middleware/ResponseMiddleware.py b/src/masonite/middleware/ResponseMiddleware.py similarity index 83% rename from masonite/middleware/ResponseMiddleware.py rename to src/masonite/middleware/ResponseMiddleware.py index 0c5b7aa06..8daaf0544 100644 --- a/masonite/middleware/ResponseMiddleware.py +++ b/src/masonite/middleware/ResponseMiddleware.py @@ -1,7 +1,7 @@ -from masonite.app import App -from masonite.request import Request -from masonite.response import Response +from ..app import App +from ..request import Request +from ..response import Response class ResponseMiddleware: diff --git a/masonite/middleware/SecureHeadersMiddleware.py b/src/masonite/middleware/SecureHeadersMiddleware.py similarity index 97% rename from masonite/middleware/SecureHeadersMiddleware.py rename to src/masonite/middleware/SecureHeadersMiddleware.py index d43bf6c88..48bf7abcd 100644 --- a/masonite/middleware/SecureHeadersMiddleware.py +++ b/src/masonite/middleware/SecureHeadersMiddleware.py @@ -1,6 +1,6 @@ """SecureHeaders Middleware.""" -from masonite.request import Request +from ..request import Request class SecureHeadersMiddleware: diff --git a/masonite/middleware/__init__.py b/src/masonite/middleware/__init__.py similarity index 85% rename from masonite/middleware/__init__.py rename to src/masonite/middleware/__init__.py index bc4352a4f..87d11f2c0 100644 --- a/masonite/middleware/__init__.py +++ b/src/masonite/middleware/__init__.py @@ -1,4 +1,5 @@ from .CsrfMiddleware import CsrfMiddleware +from .GuardMiddleware import GuardMiddleware from .CorsMiddleware import CorsMiddleware from .MaintenanceModeMiddleware import MaintenanceModeMiddleware from .ResponseMiddleware import ResponseMiddleware diff --git a/masonite/packages.py b/src/masonite/packages.py similarity index 100% rename from masonite/packages.py rename to src/masonite/packages.py diff --git a/masonite/provider.py b/src/masonite/provider.py similarity index 95% rename from masonite/provider.py rename to src/masonite/provider.py index f56bdefb7..a4b818a56 100644 --- a/masonite/provider.py +++ b/src/masonite/provider.py @@ -1,7 +1,7 @@ """Module for the Service Provider.""" -from masonite.helpers import random_string -from masonite.helpers.filesystem import copy_migration +from .helpers import random_string +from .helpers.filesystem import copy_migration from .packages import append_file @@ -88,7 +88,8 @@ def assets(self, assets): Arguments: assets {dict} -- A dictionary of assets to add """ - self.app.make('Storage').STATICFILES.update(assets) + + self.app.make('staticfiles').update(assets) def publishes(self, dictionary, tag=None): self._publishes.update(dictionary) diff --git a/src/masonite/providers/AppProvider.py b/src/masonite/providers/AppProvider.py new file mode 100644 index 000000000..9b173ff28 --- /dev/null +++ b/src/masonite/providers/AppProvider.py @@ -0,0 +1,84 @@ +"""An AppProvider Service Provider.""" + +from ..autoload import Autoload +from ..commands import (AuthCommand, CommandCommand, ControllerCommand, + DownCommand, InfoCommand, InstallCommand, JobCommand, + KeyCommand, MakeMigrationCommand, MiddlewareCommand, + MigrateCommand, MigrateRefreshCommand, + MigrateResetCommand, MigrateRollbackCommand, + MigrateStatusCommand, ModelCommand, + ModelDocstringCommand, ProviderCommand, PublishCommand, + QueueTableCommand, QueueWorkCommand, RoutesCommand, + SeedCommand, SeedRunCommand, ServeCommand, TestCommand, + TinkerCommand, UpCommand, ViewCommand) +from ..exception_handler import DumpHandler, ExceptionHandler +from ..helpers import config, load +from ..helpers.routes import flatten_routes +from ..hook import Hook +from ..provider import ServiceProvider +from ..request import Request +from ..response import Response +from ..routes import Route + + +class AppProvider(ServiceProvider): + + def register(self): + self.app.bind('HookHandler', Hook(self.app)) + self.app.bind('WebRoutes', flatten_routes(load('routes.web.routes'))) + self.app.bind('Route', Route()) + self.app.bind('Request', Request()) + self.app.simple(Response(self.app)) + self.app.bind('Container', self.app) + self.app.bind('ExceptionHandler', ExceptionHandler(self.app)) + self.app.bind('ExceptionDumpExceptionHandler', DumpHandler) + + self.app.bind('RouteMiddleware', config('middleware.route_middleware')) + self.app.bind('HttpMiddleware', config('middleware.http_middleware')) + self.app.bind('staticfiles', config('storage.staticfiles', {})) + + # Insert Commands + self._load_commands() + + self._autoload(config('application.autoload')) + + def boot(self, request: Request, route: Route): + self.app.bind('StatusCode', None) + route.load_environ(self.app.make('Environ')) + request.load_environ(self.app.make('Environ')).load_app(self.app) + + def _autoload(self, directories): + Autoload(self.app).load(directories) + + def _load_commands(self): + self.commands( + AuthCommand(), + CommandCommand(), + ControllerCommand(), + DownCommand(), + InfoCommand(), + InstallCommand(), + JobCommand(), + KeyCommand(), + MakeMigrationCommand(), + MiddlewareCommand(), + MigrateCommand(), + MigrateRefreshCommand(), + MigrateResetCommand(), + MigrateStatusCommand(), + MigrateRollbackCommand(), + ModelCommand(), + ModelDocstringCommand(), + ProviderCommand(), + PublishCommand(), + QueueWorkCommand(), + QueueTableCommand(), + ViewCommand(), + RoutesCommand(), + ServeCommand(), + SeedCommand(), + SeedRunCommand(), + TestCommand(), + TinkerCommand(), + UpCommand() + ) diff --git a/src/masonite/providers/AuthenticationProvider.py b/src/masonite/providers/AuthenticationProvider.py new file mode 100644 index 000000000..d9907d19e --- /dev/null +++ b/src/masonite/providers/AuthenticationProvider.py @@ -0,0 +1,20 @@ +"""An Authentication Service Provider.""" + +from ..auth.guards import Guard, WebGuard +from ..auth import Auth +from ..helpers import config +from ..provider import ServiceProvider + + +class AuthenticationProvider(ServiceProvider): + + wsgi = False + + def register(self): + guard = Guard(self.app) + guard.register_guard('web', WebGuard) + self.app.simple(guard) + self.app.swap(Auth, guard) + + def boot(self, auth: Auth): + auth.set(config('auth.auth.defaults.guard')) diff --git a/masonite/providers/BroadcastProvider.py b/src/masonite/providers/BroadcastProvider.py similarity index 55% rename from masonite/providers/BroadcastProvider.py rename to src/masonite/providers/BroadcastProvider.py index 4b7572ecb..041ca4829 100644 --- a/masonite/providers/BroadcastProvider.py +++ b/src/masonite/providers/BroadcastProvider.py @@ -1,9 +1,10 @@ """A RedirectionProvider Service Provider.""" -from masonite.drivers import BroadcastAblyDriver, BroadcastPusherDriver -from masonite.managers import BroadcastManager -from masonite.provider import ServiceProvider -from masonite import Broadcast +from ..drivers import BroadcastAblyDriver, BroadcastPusherDriver +from ..managers import BroadcastManager +from ..provider import ServiceProvider +from .. import Broadcast +from ..helpers import config class BroadcastProvider(ServiceProvider): @@ -11,12 +12,10 @@ class BroadcastProvider(ServiceProvider): wsgi = False def register(self): - from config import broadcast - self.app.bind('BroadcastConfig', broadcast) self.app.bind('BroadcastPusherDriver', BroadcastPusherDriver) self.app.bind('BroadcastAblyDriver', BroadcastAblyDriver) self.app.bind('BroadcastManager', BroadcastManager(self.app)) def boot(self): - self.app.bind('Broadcast', self.app.make('BroadcastManager').driver(self.app.make('BroadcastConfig').DRIVER)) - self.app.swap(Broadcast, self.app.make('BroadcastManager').driver(self.app.make('BroadcastConfig').DRIVER)) + self.app.bind('Broadcast', self.app.make('BroadcastManager').driver(config('broadcast.driver'))) + self.app.swap(Broadcast, self.app.make('BroadcastManager').driver(config('broadcast.driver'))) diff --git a/src/masonite/providers/CacheProvider.py b/src/masonite/providers/CacheProvider.py new file mode 100644 index 000000000..306bee446 --- /dev/null +++ b/src/masonite/providers/CacheProvider.py @@ -0,0 +1,23 @@ +"""A Cache Service Provider.""" + +from .. import Cache +from ..drivers import CacheDiskDriver, CacheRedisDriver +from ..managers import CacheManager +from ..provider import ServiceProvider +from ..helpers import config + + +class CacheProvider(ServiceProvider): + + wsgi = False + + def register(self): + # from config import cache + # self.app.bind('CacheConfig', cache) + self.app.bind('CacheDiskDriver', CacheDiskDriver) + self.app.bind('CacheRedisDriver', CacheRedisDriver) + self.app.bind('CacheManager', CacheManager(self.app)) + + def boot(self, cache: CacheManager): + self.app.bind('Cache', cache.driver(config('cache').DRIVER)) + self.app.swap(Cache, cache.driver(config('cache').DRIVER)) diff --git a/masonite/providers/CorsProvider.py b/src/masonite/providers/CorsProvider.py similarity index 76% rename from masonite/providers/CorsProvider.py rename to src/masonite/providers/CorsProvider.py index ac2d9ee74..c8eff5751 100644 --- a/masonite/providers/CorsProvider.py +++ b/src/masonite/providers/CorsProvider.py @@ -1,7 +1,7 @@ -from masonite.provider import ServiceProvider -from masonite.request import Request -from masonite.response import Response -from masonite.helpers import config +from ..provider import ServiceProvider +from ..request import Request +from ..response import Response +from ..helpers import config class CorsProvider(ServiceProvider): diff --git a/masonite/providers/CsrfProvider.py b/src/masonite/providers/CsrfProvider.py similarity index 73% rename from masonite/providers/CsrfProvider.py rename to src/masonite/providers/CsrfProvider.py index 1a83c9842..e5d5d8fce 100644 --- a/masonite/providers/CsrfProvider.py +++ b/src/masonite/providers/CsrfProvider.py @@ -1,7 +1,7 @@ """A Csrf Service Provider.""" -from masonite.auth import Csrf -from masonite.provider import ServiceProvider +from ..auth import Csrf +from ..provider import ServiceProvider class CsrfProvider(ServiceProvider): diff --git a/masonite/providers/HelpersProvider.py b/src/masonite/providers/HelpersProvider.py similarity index 78% rename from masonite/providers/HelpersProvider.py rename to src/masonite/providers/HelpersProvider.py index 6c74df535..cbb9e9639 100644 --- a/masonite/providers/HelpersProvider.py +++ b/src/masonite/providers/HelpersProvider.py @@ -3,14 +3,14 @@ import builtins import os -from masonite.exception_handler import DD -from masonite.helpers.view_helpers import back, set_request_method, hidden, old -from masonite.helpers.sign import sign, unsign, decrypt, encrypt -from masonite.helpers import config, optional -from masonite.provider import ServiceProvider -from masonite.view import View -from masonite.request import Request -from masonite.managers import MailManager +from ..exception_handler import DD +from ..helpers.view_helpers import back, set_request_method, hidden, old +from ..helpers.sign import sign, unsign, decrypt, encrypt +from ..helpers import config, optional +from ..provider import ServiceProvider +from ..view import View +from ..request import Request +from ..managers import MailManager class HelpersProvider(ServiceProvider): diff --git a/masonite/providers/MailProvider.py b/src/masonite/providers/MailProvider.py similarity index 54% rename from masonite/providers/MailProvider.py rename to src/masonite/providers/MailProvider.py index 231b792fd..b653212db 100644 --- a/masonite/providers/MailProvider.py +++ b/src/masonite/providers/MailProvider.py @@ -1,10 +1,11 @@ """A Mail Service Provider.""" -from masonite.drivers import MailMailgunDriver, MailSmtpDriver, \ +from ..drivers import MailMailgunDriver, MailSmtpDriver, \ MailLogDriver, MailTerminalDriver -from masonite.managers import MailManager -from masonite.provider import ServiceProvider -from masonite import Mail +from ..managers import MailManager +from ..provider import ServiceProvider +from .. import Mail +from ..helpers import config class MailProvider(ServiceProvider): @@ -12,8 +13,6 @@ class MailProvider(ServiceProvider): wsgi = False def register(self): - from config import mail - self.app.bind('MailConfig', mail) self.app.bind('MailSmtpDriver', MailSmtpDriver) self.app.bind('MailMailgunDriver', MailMailgunDriver) self.app.bind('MailLogDriver', MailLogDriver) @@ -21,5 +20,5 @@ def register(self): self.app.bind('MailManager', MailManager(self.app)) def boot(self, manager: MailManager): - self.app.bind('Mail', manager.driver(self.app.make('MailConfig').DRIVER)) - self.app.swap(Mail, manager.driver(self.app.make('MailConfig').DRIVER)) + self.app.bind('Mail', manager.driver(config('mail.driver'))) + self.app.swap(Mail, manager.driver(config('mail.driver'))) diff --git a/src/masonite/providers/QueueProvider.py b/src/masonite/providers/QueueProvider.py new file mode 100644 index 000000000..5f5466bbb --- /dev/null +++ b/src/masonite/providers/QueueProvider.py @@ -0,0 +1,22 @@ +"""A RedirectionProvider Service Provider.""" + + +from ..drivers import QueueAsyncDriver, QueueAmqpDriver +from ..managers import QueueManager +from ..provider import ServiceProvider +from .. import Queue +from ..helpers import config + + +class QueueProvider(ServiceProvider): + + wsgi = False + + def register(self): + self.app.bind('QueueAsyncDriver', QueueAsyncDriver) + self.app.bind('QueueAmqpDriver', QueueAmqpDriver) + self.app.bind('QueueManager', QueueManager) + + def boot(self, queue: QueueManager): + self.app.bind('Queue', queue.driver(config('queue.driver'))) + self.app.swap(Queue, queue.driver(config('queue.driver'))) diff --git a/masonite/providers/RouteProvider.py b/src/masonite/providers/RouteProvider.py similarity index 96% rename from masonite/providers/RouteProvider.py rename to src/masonite/providers/RouteProvider.py index c56ab1eea..ed35a5e5a 100644 --- a/masonite/providers/RouteProvider.py +++ b/src/masonite/providers/RouteProvider.py @@ -1,10 +1,10 @@ """A RouteProvider Service Provider.""" -from masonite.helpers.routes import create_matchurl -from masonite.provider import ServiceProvider -from masonite.request import Request -from masonite.response import Response -from masonite.routes import Route +from ..helpers.routes import create_matchurl +from ..provider import ServiceProvider +from ..request import Request +from ..response import Response +from ..routes import Route class RouteProvider(ServiceProvider): diff --git a/masonite/providers/SassProvider.py b/src/masonite/providers/SassProvider.py similarity index 83% rename from masonite/providers/SassProvider.py rename to src/masonite/providers/SassProvider.py index 72a0ab233..4ed88ef98 100644 --- a/masonite/providers/SassProvider.py +++ b/src/masonite/providers/SassProvider.py @@ -1,7 +1,7 @@ """A SassProvider Service Provider.""" -from masonite.provider import ServiceProvider -from masonite.storage import Storage +from ..provider import ServiceProvider +from ..storage import Storage class SassProvider(ServiceProvider): diff --git a/masonite/providers/SessionProvider.py b/src/masonite/providers/SessionProvider.py similarity index 50% rename from masonite/providers/SessionProvider.py rename to src/masonite/providers/SessionProvider.py index 631d27853..ca5d5684f 100644 --- a/masonite/providers/SessionProvider.py +++ b/src/masonite/providers/SessionProvider.py @@ -1,25 +1,26 @@ """A RedirectionProvider Service Provider.""" -from masonite.drivers import SessionCookieDriver, SessionMemoryDriver -from masonite.managers import SessionManager -from masonite.provider import ServiceProvider -from masonite.view import View -from masonite.request import Request -from masonite import Session +from ..drivers import SessionCookieDriver, SessionMemoryDriver +from ..managers import SessionManager +from ..provider import ServiceProvider +from ..view import View +from ..request import Request +from .. import Session +from ..helpers import config class SessionProvider(ServiceProvider): def register(self): - from config import session - self.app.bind('SessionConfig', session) + # from config import session + # self.app.bind('SessionConfig', session) self.app.bind('SessionMemoryDriver', SessionMemoryDriver) self.app.bind('SessionCookieDriver', SessionCookieDriver) self.app.bind('SessionManager', SessionManager(self.app)) def boot(self, request: Request, view: View, session: SessionManager): - self.app.bind('Session', session.driver(self.app.make('SessionConfig').DRIVER)) - self.app.swap(Session, session.driver(self.app.make('SessionConfig').DRIVER)) + self.app.bind('Session', session.driver(config('session').DRIVER)) + self.app.swap(Session, session.driver(config('session').DRIVER)) request.session = self.app.make('Session') view.share({ diff --git a/masonite/providers/StatusCodeProvider.py b/src/masonite/providers/StatusCodeProvider.py similarity index 81% rename from masonite/providers/StatusCodeProvider.py rename to src/masonite/providers/StatusCodeProvider.py index 145851961..06f8971d6 100644 --- a/masonite/providers/StatusCodeProvider.py +++ b/src/masonite/providers/StatusCodeProvider.py @@ -1,7 +1,8 @@ """A StatusProvider Service Provider.""" -from masonite.response import Response -from masonite.provider import ServiceProvider +from ..response import Response +from ..provider import ServiceProvider +from ..helpers import config class ServerErrorExceptionHook: @@ -18,7 +19,7 @@ def load(self, app): rendered_view = app.make('View')('errors/500') else: rendered_view = app.make('View')( - '/masonite/snippets/statuscode', {'code': '500 Internal Server Error'}) + config('application.templates.statuscode', '/masonite/snippets/statuscode'), {'code': '500 Internal Server Error'}) request.app().make(Response).view(rendered_view) @@ -45,7 +46,7 @@ def boot(self): rendered_view = self.app.make('View')( 'errors/{}'.format(request.get_status())) else: - rendered_view = self.app.make('View')('/masonite/snippets/statuscode', { + rendered_view = self.app.make('View')(config('application.templates.statuscode', '/masonite/snippets/statuscode'), { 'code': request.get_status_code() }) diff --git a/src/masonite/providers/UploadProvider.py b/src/masonite/providers/UploadProvider.py new file mode 100644 index 000000000..552ea5e93 --- /dev/null +++ b/src/masonite/providers/UploadProvider.py @@ -0,0 +1,30 @@ +"""An Upload Service Provider.""" + +from ..drivers import UploadDiskDriver, UploadS3Driver +from ..helpers.static import static +from ..managers import UploadManager +from ..provider import ServiceProvider +from ..view import View +from .. import Upload +from ..helpers import config + + +class UploadProvider(ServiceProvider): + + wsgi = False + + def register(self): + # from config import storage + # self.app.bind('StorageConfig', storage) + self.app.bind('UploadDiskDriver', UploadDiskDriver) + self.app.bind('UploadS3Driver', UploadS3Driver) + self.app.bind('UploadManager', UploadManager(self.app)) + + def boot(self, manager: UploadManager, view: View): + self.app.bind('Upload', manager.driver(config('storage').DRIVER)) + self.app.swap(Upload, manager.driver(config('storage').DRIVER)) + view.share( + { + 'static': static, + } + ) diff --git a/masonite/providers/ViewProvider.py b/src/masonite/providers/ViewProvider.py similarity index 59% rename from masonite/providers/ViewProvider.py rename to src/masonite/providers/ViewProvider.py index 3710d2089..210d35832 100644 --- a/masonite/providers/ViewProvider.py +++ b/src/masonite/providers/ViewProvider.py @@ -1,7 +1,9 @@ """A View Service Provider.""" -from masonite.provider import ServiceProvider -from masonite.view import View +from jinja2 import FileSystemLoader + +from ..provider import ServiceProvider +from ..view import View class ViewProvider(ServiceProvider): @@ -13,7 +15,8 @@ def register(self): self.app.bind('ViewClass', view) self.app.bind('View', view.render) - def boot(self): + def boot(self, view: View): + view.add_environment('src/masonite/snippets', loader=FileSystemLoader) self.publishes_migrations([ 'storage/append_from.txt' ]) diff --git a/masonite/providers/WhitenoiseProvider.py b/src/masonite/providers/WhitenoiseProvider.py similarity index 62% rename from masonite/providers/WhitenoiseProvider.py rename to src/masonite/providers/WhitenoiseProvider.py index de3831cfb..5adf52638 100644 --- a/masonite/providers/WhitenoiseProvider.py +++ b/src/masonite/providers/WhitenoiseProvider.py @@ -2,7 +2,8 @@ from whitenoise import WhiteNoise -from masonite.provider import ServiceProvider +from ..provider import ServiceProvider +from ..helpers import config class WhitenoiseProvider(ServiceProvider): @@ -16,7 +17,7 @@ def boot(self): """Wrap the WSGI server in a whitenoise container.""" from config import application self.app.bind('WSGI', WhiteNoise( - self.app.make('WSGI'), root=self.app.make('Application').STATIC_ROOT, autorefresh=application.DEBUG)) + self.app.make('WSGI'), root=config('application.static_root'), autorefresh=application.DEBUG)) - for location, alias in self.app.make('Storage').STATICFILES.items(): + for location, alias in self.app.make('staticfiles').items(): self.app.make('WSGI').add_files(location, prefix=alias) diff --git a/masonite/providers/__init__.py b/src/masonite/providers/__init__.py similarity index 91% rename from masonite/providers/__init__.py rename to src/masonite/providers/__init__.py index e0f570085..0a4275616 100644 --- a/masonite/providers/__init__.py +++ b/src/masonite/providers/__init__.py @@ -1,4 +1,5 @@ from .AppProvider import AppProvider +from .AuthenticationProvider import AuthenticationProvider from .BroadcastProvider import BroadcastProvider from .CacheProvider import CacheProvider from .CsrfProvider import CsrfProvider diff --git a/masonite/queues/Queueable.py b/src/masonite/queues/Queueable.py similarity index 100% rename from masonite/queues/Queueable.py rename to src/masonite/queues/Queueable.py diff --git a/masonite/queues/ShouldQueue.py b/src/masonite/queues/ShouldQueue.py similarity index 100% rename from masonite/queues/ShouldQueue.py rename to src/masonite/queues/ShouldQueue.py diff --git a/masonite/queues/__init__.py b/src/masonite/queues/__init__.py similarity index 100% rename from masonite/queues/__init__.py rename to src/masonite/queues/__init__.py diff --git a/masonite/request.py b/src/masonite/request.py similarity index 98% rename from masonite/request.py rename to src/masonite/request.py index 384482ff6..0f1f72f43 100644 --- a/masonite/request.py +++ b/src/masonite/request.py @@ -15,14 +15,14 @@ import tldextract from cryptography.fernet import InvalidToken -from masonite.auth.Sign import Sign -from masonite.exceptions import InvalidHTTPStatusCode, RouteException -from masonite.helpers import Dot as DictDot -from masonite.helpers import clean_request_input, dot -from masonite.helpers.Extendable import Extendable -from masonite.helpers.routes import compile_route_to_regex -from masonite.helpers.status import response_statuses -from masonite.helpers.time import cookie_expire_time +from .auth.Sign import Sign +from .exceptions import InvalidHTTPStatusCode, RouteException +from .helpers import Dot as DictDot +from .helpers import clean_request_input, dot +from .helpers.Extendable import Extendable +from .helpers.routes import compile_route_to_regex +from .helpers.status import response_statuses +from .helpers.time import cookie_expire_time class Request(Extendable): diff --git a/masonite/response.py b/src/masonite/response.py similarity index 86% rename from masonite/response.py rename to src/masonite/response.py index ea6d16160..065d28f75 100644 --- a/masonite/response.py +++ b/src/masonite/response.py @@ -2,14 +2,13 @@ import json -from masonite.exceptions import ResponseError -from masonite.helpers.Extendable import Extendable -from masonite.view import View +from .exceptions import ResponseError +from .helpers.Extendable import Extendable from orator.support.collection import Collection from orator import Model +from .app import App from orator import Paginator, LengthAwarePaginator -from masonite.app import App class Response(Extendable): @@ -55,42 +54,25 @@ def paginated_json(self, paginator, status=200): # try to capture request input for page_size and/or page page_size_input = self.request.input(page_size_parameter) page_input = self.request.input(page_parameter) - # use try/except here, as int(bool) will return 0 for False above try: page_size = ( int(page_size_input) if page_size_input and int(page_size_input) > 0 else paginator.per_page ) - except Exception: + except ValueError: page_size = paginator.per_page + try: page = ( int(page_input) if page_input and int(page_input) > 0 else paginator.current_page ) - except Exception: + except ValueError: page = paginator.current_page # don't waste time instantiating new paginator if no change - if ( - page_size != paginator.per_page - or page != paginator.current_page - ): - try: - # try to get class of model - next(type(x) for x in paginator.items) - if isinstance(paginator, Paginator): - paginator = model_class.simple_paginate( - page_size, - page - ) - elif isinstance(paginator, LengthAwarePaginator): - paginator = model_class.paginate(page_size, page) - except Exception: - paginator = paginator - payload = { 'total': ( paginator.total @@ -175,14 +157,14 @@ def view(self, view, status=200): return self.json(view.serialize(), status=self.request.get_status()) elif isinstance(view, int): view = str(view) - elif isinstance(view, View): - view = view.rendered_template + elif isinstance(view, Responsable): + view = view.get_response() elif isinstance(view, self.request.__class__): view = self.data() if isinstance(view, (Paginator, LengthAwarePaginator)): return self.paginated_json(view, status=self.request.get_status()) elif view is None: - raise ResponseError('Responses cannot be of type: None.') + raise ResponseError('Responses cannot be of type: None. Did you return anything in your responsable method?') if not isinstance(view, str): raise ResponseError('Invalid response type of {}'.format(type(view))) @@ -220,3 +202,9 @@ def to_bytes(self): bytes -- The converted response to bytes. """ return bytes(self.converted_data(), 'utf-8') + + +class Responsable: + + def get_response(self): + raise NotImplementedError("This class does not implement a 'get_response()' method") diff --git a/masonite/routes.py b/src/masonite/routes.py similarity index 98% rename from masonite/routes.py rename to src/masonite/routes.py index 4371f4725..2c52b55dd 100644 --- a/masonite/routes.py +++ b/src/masonite/routes.py @@ -5,8 +5,8 @@ import json import re -from masonite.exceptions import RouteMiddlewareNotFound, InvalidRouteCompileException, RouteException -from masonite.view import View +from .exceptions import RouteMiddlewareNotFound, InvalidRouteCompileException, RouteException +from .view import View class Route: @@ -211,14 +211,14 @@ def _find_controller(self, controller): except ImportError as e: import sys import traceback - exc_type, _, exc_tb = sys.exc_info() + _, _, exc_tb = sys.exc_info() tb = traceback.extract_tb(exc_tb)[-1] print('\033[93mCannot find controller {}. Did you create this one? Raised: {} in {} on line {}'.format( get_controller, str(e), tb[0], tb[1]), '\033[0m') - except Exception: + except Exception: # skipcq import sys import traceback - exc_type, _, exc_tb = sys.exc_info() + _, _, exc_tb = sys.exc_info() tb = traceback.extract_tb(exc_tb)[-1] print('\033[93mTrouble importing controller!', str(e), '\033[0m') @@ -602,7 +602,7 @@ def __new__(cls, routes=[], middleware=[], domain=[], prefix='', name='', add_me Returns: list -- Returns a list of routes. """ - from masonite.helpers.routes import flatten_routes + from .helpers.routes import flatten_routes cls.routes = flatten_routes(routes) if middleware: diff --git a/masonite/snippets/exceptions/__init__.py b/src/masonite/snippets/__init__.py similarity index 100% rename from masonite/snippets/exceptions/__init__.py rename to src/masonite/snippets/__init__.py diff --git a/masonite/snippets/auth/controllers/ConfirmController.py b/src/masonite/snippets/auth/controllers/ConfirmController.py similarity index 83% rename from masonite/snippets/auth/controllers/ConfirmController.py rename to src/masonite/snippets/auth/controllers/ConfirmController.py index 614a188c8..ed1bf06fb 100644 --- a/masonite/snippets/auth/controllers/ConfirmController.py +++ b/src/masonite/snippets/auth/controllers/ConfirmController.py @@ -6,6 +6,7 @@ from masonite.managers import MailManager from masonite.request import Request from masonite.view import View +from masonite.helpers import config class ConfirmController: @@ -15,18 +16,17 @@ def __init__(self): """The ConfirmController Constructor.""" pass - def verify_show(self, request: Request, view: View, auth: Auth): + def verify_show(self, view: View, auth: Auth): """Show the Verify Email page for unverified users. Arguments: - request {masonite.request.request} -- The Masonite request class. request {masonite.view.view} -- The Masonite view class. request {masonite.auth.auth} -- The Masonite Auth class. Returns: [type] -- [description] """ - return view.render('auth/verify', {'app': request.app().make('Application'), 'Auth': auth}) + return view.render('auth/verify', {'app': config('application'), 'Auth': auth}) def confirm_email(self, request: Request, view: View, auth: Auth): """Confirm User email and show the correct response. @@ -56,9 +56,9 @@ def confirm_email(self, request: Request, view: View, auth: Auth): user.verified_at = datetime.datetime.now() user.save() - return view.render('auth/confirm', {'app': request.app().make('Application'), 'Auth': auth}) + return view.render('auth/confirm', {'app': config('application'), 'Auth': auth}) - return view.render('auth/error', {'app': request.app().make('Application'), 'Auth': auth}) + return view.render('auth/error', {'app': config('application'), 'Auth': auth}) def send_verify_email(self, manager: MailManager, request: Request): user = request.user() diff --git a/masonite/snippets/auth/controllers/HomeController.py b/src/masonite/snippets/auth/controllers/HomeController.py similarity index 100% rename from masonite/snippets/auth/controllers/HomeController.py rename to src/masonite/snippets/auth/controllers/HomeController.py diff --git a/masonite/snippets/auth/controllers/LoginController.py b/src/masonite/snippets/auth/controllers/LoginController.py similarity index 93% rename from masonite/snippets/auth/controllers/LoginController.py rename to src/masonite/snippets/auth/controllers/LoginController.py index 8f6144c3e..f26045cc7 100644 --- a/masonite/snippets/auth/controllers/LoginController.py +++ b/src/masonite/snippets/auth/controllers/LoginController.py @@ -3,6 +3,7 @@ from masonite.auth import Auth from masonite.request import Request from masonite.view import View +from masonite.helpers import config class LoginController: @@ -25,7 +26,7 @@ def show(self, request: Request, view: View, auth: Auth): """ if request.user(): return request.redirect('/home') - return view.render('auth/login', {'app': request.app().make('Application'), 'Auth': auth}) + return view.render('auth/login', {'app': config('application'), 'Auth': auth}) def store(self, request: Request, auth: Auth): """Login the user. diff --git a/masonite/snippets/auth/controllers/PasswordController.py b/src/masonite/snippets/auth/controllers/PasswordController.py similarity index 82% rename from masonite/snippets/auth/controllers/PasswordController.py rename to src/masonite/snippets/auth/controllers/PasswordController.py index 77ecc5ec7..4c11dc899 100644 --- a/masonite/snippets/auth/controllers/PasswordController.py +++ b/src/masonite/snippets/auth/controllers/PasswordController.py @@ -4,24 +4,23 @@ from masonite import env, Mail, Session from masonite.auth import Auth -from masonite.helpers import password as bcrypt_password +from masonite.helpers import config, password as bcrypt_password from masonite.request import Request from masonite.view import View - from config.auth import AUTH class PasswordController: """Password Controller.""" - def forget(self, view: View, request: Request, auth: Auth): - return view.render('auth/forget', {'app': request.app().make('Application'), 'Auth': auth}) + def forget(self, view: View, auth: Auth): + return view.render('auth/forget', {'app': config('application'), 'Auth': auth}) def reset(self, request: Request, auth: Auth): token = request.param('token') user = AUTH['model'].where('remember_token', token).first() if user: - return view('auth/reset', {'token': token, 'app': request.app().make('Application'), 'Auth': auth}) + return view('auth/reset', {'token': token, 'app': config('application'), 'Auth': auth}) def send(self, request: Request, session: Session, mail: Mail): email = request.input('email') diff --git a/masonite/snippets/auth/controllers/RegisterController.py b/src/masonite/snippets/auth/controllers/RegisterController.py similarity index 93% rename from masonite/snippets/auth/controllers/RegisterController.py rename to src/masonite/snippets/auth/controllers/RegisterController.py index 2f4b12624..ad171db25 100644 --- a/masonite/snippets/auth/controllers/RegisterController.py +++ b/src/masonite/snippets/auth/controllers/RegisterController.py @@ -1,6 +1,6 @@ """The RegisterController Module.""" -from config import application, auth as auth_config +from config import application from masonite.auth import Auth from masonite.request import Request from masonite.view import View @@ -15,7 +15,7 @@ def __init__(self): """The RegisterController Constructor.""" pass - def show(self, request: Request, view: View, auth: Auth): + def show(self, view: View, auth: Auth): """Show the registration page. Arguments: diff --git a/masonite/snippets/auth/templates/auth/base.html b/src/masonite/snippets/auth/templates/auth/base.html similarity index 100% rename from masonite/snippets/auth/templates/auth/base.html rename to src/masonite/snippets/auth/templates/auth/base.html diff --git a/masonite/snippets/auth/templates/auth/confirm.html b/src/masonite/snippets/auth/templates/auth/confirm.html similarity index 100% rename from masonite/snippets/auth/templates/auth/confirm.html rename to src/masonite/snippets/auth/templates/auth/confirm.html diff --git a/masonite/snippets/auth/templates/auth/error.html b/src/masonite/snippets/auth/templates/auth/error.html similarity index 100% rename from masonite/snippets/auth/templates/auth/error.html rename to src/masonite/snippets/auth/templates/auth/error.html diff --git a/masonite/snippets/auth/templates/auth/forget.html b/src/masonite/snippets/auth/templates/auth/forget.html similarity index 100% rename from masonite/snippets/auth/templates/auth/forget.html rename to src/masonite/snippets/auth/templates/auth/forget.html diff --git a/masonite/snippets/auth/templates/auth/home.html b/src/masonite/snippets/auth/templates/auth/home.html similarity index 100% rename from masonite/snippets/auth/templates/auth/home.html rename to src/masonite/snippets/auth/templates/auth/home.html diff --git a/masonite/snippets/auth/templates/auth/login.html b/src/masonite/snippets/auth/templates/auth/login.html similarity index 100% rename from masonite/snippets/auth/templates/auth/login.html rename to src/masonite/snippets/auth/templates/auth/login.html diff --git a/masonite/snippets/auth/templates/auth/register.html b/src/masonite/snippets/auth/templates/auth/register.html similarity index 100% rename from masonite/snippets/auth/templates/auth/register.html rename to src/masonite/snippets/auth/templates/auth/register.html diff --git a/masonite/snippets/auth/templates/auth/reset.html b/src/masonite/snippets/auth/templates/auth/reset.html similarity index 100% rename from masonite/snippets/auth/templates/auth/reset.html rename to src/masonite/snippets/auth/templates/auth/reset.html diff --git a/masonite/snippets/auth/templates/auth/verify.html b/src/masonite/snippets/auth/templates/auth/verify.html similarity index 100% rename from masonite/snippets/auth/templates/auth/verify.html rename to src/masonite/snippets/auth/templates/auth/verify.html diff --git a/masonite/snippets/auth/templates/auth/verifymail.html b/src/masonite/snippets/auth/templates/auth/verifymail.html similarity index 100% rename from masonite/snippets/auth/templates/auth/verifymail.html rename to src/masonite/snippets/auth/templates/auth/verifymail.html diff --git a/masonite/snippets/exception.html b/src/masonite/snippets/exception.html similarity index 98% rename from masonite/snippets/exception.html rename to src/masonite/snippets/exception.html index 1a703edb8..4fd55e622 100644 --- a/masonite/snippets/exception.html +++ b/src/masonite/snippets/exception.html @@ -249,7 +249,7 @@
{{ provider }}
{% endfor %}{{ directory}}
diff --git a/masonite/snippets/scaffold/view.html b/src/masonite/snippets/exceptions/__init__.py similarity index 100% rename from masonite/snippets/scaffold/view.html rename to src/masonite/snippets/exceptions/__init__.py diff --git a/masonite/snippets/exceptions/css/go-icon.png b/src/masonite/snippets/exceptions/css/go-icon.png similarity index 100% rename from masonite/snippets/exceptions/css/go-icon.png rename to src/masonite/snippets/exceptions/css/go-icon.png diff --git a/masonite/snippets/exceptions/css/so-icon.png b/src/masonite/snippets/exceptions/css/so-icon.png similarity index 100% rename from masonite/snippets/exceptions/css/so-icon.png rename to src/masonite/snippets/exceptions/css/so-icon.png diff --git a/masonite/snippets/exceptions/css/style.css b/src/masonite/snippets/exceptions/css/style.css similarity index 100% rename from masonite/snippets/exceptions/css/style.css rename to src/masonite/snippets/exceptions/css/style.css diff --git a/masonite/snippets/exceptions/dump.html b/src/masonite/snippets/exceptions/dump.html similarity index 100% rename from masonite/snippets/exceptions/dump.html rename to src/masonite/snippets/exceptions/dump.html diff --git a/masonite/snippets/exceptions/obj_loop.html b/src/masonite/snippets/exceptions/obj_loop.html similarity index 100% rename from masonite/snippets/exceptions/obj_loop.html rename to src/masonite/snippets/exceptions/obj_loop.html diff --git a/masonite/snippets/migrations/create_failed_jobs_table.py b/src/masonite/snippets/migrations/create_failed_jobs_table.py similarity index 100% rename from masonite/snippets/migrations/create_failed_jobs_table.py rename to src/masonite/snippets/migrations/create_failed_jobs_table.py diff --git a/masonite/snippets/migrations/create_queue_jobs_table.py b/src/masonite/snippets/migrations/create_queue_jobs_table.py similarity index 100% rename from masonite/snippets/migrations/create_queue_jobs_table.py rename to src/masonite/snippets/migrations/create_queue_jobs_table.py diff --git a/masonite/snippets/scaffold/command.html b/src/masonite/snippets/scaffold/command.html similarity index 100% rename from masonite/snippets/scaffold/command.html rename to src/masonite/snippets/scaffold/command.html diff --git a/masonite/snippets/scaffold/controller.html b/src/masonite/snippets/scaffold/controller.html similarity index 100% rename from masonite/snippets/scaffold/controller.html rename to src/masonite/snippets/scaffold/controller.html diff --git a/masonite/snippets/scaffold/controller_resource.html b/src/masonite/snippets/scaffold/controller_resource.html similarity index 100% rename from masonite/snippets/scaffold/controller_resource.html rename to src/masonite/snippets/scaffold/controller_resource.html diff --git a/masonite/snippets/scaffold/job.html b/src/masonite/snippets/scaffold/job.html similarity index 100% rename from masonite/snippets/scaffold/job.html rename to src/masonite/snippets/scaffold/job.html diff --git a/masonite/snippets/scaffold/middleware.html b/src/masonite/snippets/scaffold/middleware.html similarity index 100% rename from masonite/snippets/scaffold/middleware.html rename to src/masonite/snippets/scaffold/middleware.html diff --git a/masonite/snippets/scaffold/model.html b/src/masonite/snippets/scaffold/model.html similarity index 100% rename from masonite/snippets/scaffold/model.html rename to src/masonite/snippets/scaffold/model.html diff --git a/masonite/snippets/scaffold/provider.html b/src/masonite/snippets/scaffold/provider.html similarity index 100% rename from masonite/snippets/scaffold/provider.html rename to src/masonite/snippets/scaffold/provider.html diff --git a/masonite/snippets/scaffold/test.html b/src/masonite/snippets/scaffold/test.html similarity index 100% rename from masonite/snippets/scaffold/test.html rename to src/masonite/snippets/scaffold/test.html diff --git a/masonite/snippets/scaffold/validator.html b/src/masonite/snippets/scaffold/validator.html similarity index 100% rename from masonite/snippets/scaffold/validator.html rename to src/masonite/snippets/scaffold/validator.html diff --git a/src/masonite/snippets/scaffold/view.html b/src/masonite/snippets/scaffold/view.html new file mode 100644 index 000000000..e69de29bb diff --git a/masonite/snippets/statuscode.html b/src/masonite/snippets/statuscode.html similarity index 100% rename from masonite/snippets/statuscode.html rename to src/masonite/snippets/statuscode.html diff --git a/masonite/storage.py b/src/masonite/storage.py similarity index 100% rename from masonite/storage.py rename to src/masonite/storage.py diff --git a/masonite/testing/BaseRequest.py b/src/masonite/testing/BaseRequest.py similarity index 100% rename from masonite/testing/BaseRequest.py rename to src/masonite/testing/BaseRequest.py diff --git a/masonite/testing/MockRoute.py b/src/masonite/testing/MockRoute.py similarity index 98% rename from masonite/testing/MockRoute.py rename to src/masonite/testing/MockRoute.py index 4ee24f581..a9f818434 100644 --- a/masonite/testing/MockRoute.py +++ b/src/masonite/testing/MockRoute.py @@ -1,7 +1,7 @@ -from masonite.request import Request -from masonite.testsuite import TestSuite, generate_wsgi +from ..request import Request +from .generate_wsgi import generate_wsgi import json -from masonite.helpers import Dot +from ..helpers import Dot class MockRoute: diff --git a/masonite/testing/TestCase.py b/src/masonite/testing/TestCase.py similarity index 80% rename from masonite/testing/TestCase.py rename to src/masonite/testing/TestCase.py index 8c9f32a91..7131f9808 100644 --- a/masonite/testing/TestCase.py +++ b/src/masonite/testing/TestCase.py @@ -5,13 +5,13 @@ from contextlib import contextmanager from urllib.parse import urlencode -from masonite import env -from masonite.exceptions import RouteNotFoundException -from masonite.helpers.migrations import Migrations -from masonite.helpers.routes import create_matchurl, flatten_routes -from masonite.testsuite import generate_wsgi +from .. import env +from ..exceptions import RouteNotFoundException +from ..helpers.migrations import Migrations +from ..helpers.routes import create_matchurl, flatten_routes +from .generate_wsgi import generate_wsgi +from .create_container import create_container from orator.orm import Factory -from masonite.app import App from .MockRoute import MockRoute @@ -22,11 +22,11 @@ class TestCase(unittest.TestCase): transactions = True refreshes_database = False _transaction = False - _with_subdomains = False def setUp(self): from wsgi import container self.container = container + self._with_subdomains = False self.acting_user = False self.factory = Factory() @@ -228,7 +228,7 @@ def run_container(self, wsgi_values={}): try: for provider in self.container.make('WSGIProviders'): self.container.resolve(provider.boot) - except Exception as e: + except Exception as e: # skipcq if self._exception_handling: self.container.make('ExceptionHandler').load_exception(e) else: @@ -285,42 +285,4 @@ def withoutHttpMiddleware(self): return self def create_container(self): - container = App() - from config import application - from config import providers - - container.bind('WSGI', generate_wsgi()) - container.bind('Application', application) - container.bind('Container', container) - - container.bind('ProvidersConfig', providers) - container.bind('Providers', []) - container.bind('WSGIProviders', []) - - """Bind all service providers - Let's register everything into the Service Container. Once everything is - in the container we can run through all the boot methods. For reasons - some providers don't need to execute with every request and should - only run once when the server is started. Providers will be ran - once if the wsgi attribute on a provider is False. - """ - - for provider in container.make('ProvidersConfig').PROVIDERS: - located_provider = provider() - located_provider.load_app(container).register() - if located_provider.wsgi: - container.make('WSGIProviders').append(located_provider) - else: - container.make('Providers').append(located_provider) - - for provider in container.make('Providers'): - container.resolve(provider.boot) - - """Get the application from the container - Some providers may change the WSGI Server like wrapping the WSGI server - in a Whitenoise container for an example. Let's get a WSGI instance - from the container and pass it to the application variable. This - will allow WSGI servers to pick it up from the command line - """ - - return container + return create_container() diff --git a/src/masonite/testing/__init__.py b/src/masonite/testing/__init__.py new file mode 100644 index 000000000..8a93101d1 --- /dev/null +++ b/src/masonite/testing/__init__.py @@ -0,0 +1,4 @@ +from .TestCase import TestCase +from .MockRoute import MockRoute +from .generate_wsgi import generate_wsgi +from .create_container import create_container diff --git a/src/masonite/testing/create_container.py b/src/masonite/testing/create_container.py new file mode 100644 index 000000000..5b6a918d6 --- /dev/null +++ b/src/masonite/testing/create_container.py @@ -0,0 +1,43 @@ +from ..app import App +import copy + + +def create_container(): + container = copy.deepcopy(App()) + from .generate_wsgi import generate_wsgi + from config import providers + + container.bind('WSGI', generate_wsgi()) + container.bind('Container', container) + + # container.bind('ProvidersConfig', providers) + container.bind('Providers', []) + container.bind('WSGIProviders', []) + + """Bind all service providers + Let's register everything into the Service Container. Once everything is + in the container we can run through all the boot methods. For reasons + some providers don't need to execute with every request and should + only run once when the server is started. Providers will be ran + once if the wsgi attribute on a provider is False. + """ + + for provider in providers.PROVIDERS: + located_provider = provider() + located_provider.load_app(container).register() + if located_provider.wsgi: + container.make('WSGIProviders').append(located_provider) + else: + container.make('Providers').append(located_provider) + + for provider in container.make('Providers'): + container.resolve(provider.boot) + + """Get the application from the container + Some providers may change the WSGI Server like wrapping the WSGI server + in a Whitenoise container for an example. Let's get a WSGI instance + from the container and pass it to the application variable. This + will allow WSGI servers to pick it up from the command line + """ + + return container diff --git a/src/masonite/testing/generate_wsgi.py b/src/masonite/testing/generate_wsgi.py new file mode 100644 index 000000000..e392f085c --- /dev/null +++ b/src/masonite/testing/generate_wsgi.py @@ -0,0 +1,32 @@ + +import io + + +def generate_wsgi(): + return { + 'wsgi.version': (1, 0), + 'wsgi.multithread': False, + 'wsgi.multiprocess': True, + 'wsgi.run_once': False, + 'wsgi.input': io.BytesIO(), + 'SERVER_SOFTWARE': 'gunicorn/19.7.1', + 'REQUEST_METHOD': 'GET', + 'QUERY_STRING': 'application=Masonite', + 'RAW_URI': '/', + 'SERVER_PROTOCOL': 'HTTP/1.1', + 'HTTP_HOST': '127.0.0.1:8000', + 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', + 'HTTP_COOKIE': 'setcookie=value', + 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7', + 'HTTP_ACCEPT_LANGUAGE': 'en-us', + 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', + 'HTTP_CONNECTION': 'keep-alive', + 'wsgi.url_scheme': 'http', + 'REMOTE_ADDR': '127.0.0.1', + 'REMOTE_PORT': '62241', + 'SERVER_NAME': '127.0.0.1', + 'SERVER_PORT': '8000', + 'PATH_INFO': '/', + 'SCRIPT_NAME': '' + } diff --git a/masonite/view.py b/src/masonite/view.py similarity index 97% rename from masonite/view.py rename to src/masonite/view.py index ad82b8ae7..f6d6fe19f 100644 --- a/masonite/view.py +++ b/src/masonite/view.py @@ -4,10 +4,11 @@ from jinja2 import ChoiceLoader, Environment, PackageLoader, select_autoescape from jinja2.exceptions import TemplateNotFound -from masonite.exceptions import RequiredContainerBindingNotFound, ViewException +from .exceptions import RequiredContainerBindingNotFound, ViewException +from .response import Responsable -class View: +class View(Responsable): """View class. Responsible for handling everything involved with views and view environments.""" _splice = '/' @@ -189,6 +190,7 @@ def add_environment(self, template_location, loader=PackageLoader): Keyword Arguments: loader {jinja2.Loader} -- Type of Jinja2 loader to use. (default: {jinja2.PackageLoader}) """ + # print('loading', template_location) if loader == PackageLoader: template_location = template_location.split(self._splice) @@ -304,3 +306,6 @@ def __get_cached_template(self): def set_splice(self, splice): self._splice = splice return self + + def get_response(self): + return self.rendered_template diff --git a/tests/broadcasts/test_sockets.py b/tests/broadcasts/test_sockets.py index 4ec985cba..b75cd9750 100644 --- a/tests/broadcasts/test_sockets.py +++ b/tests/broadcasts/test_sockets.py @@ -1,35 +1,34 @@ import os -from masonite.drivers import BroadcastPusherDriver -from masonite.managers import BroadcastManager -from masonite.testsuite.TestSuite import TestSuite -import unittest +from src.masonite.drivers import BroadcastPusherDriver +from src.masonite.managers import BroadcastManager +from src.masonite.testing import TestCase if os.getenv('ABLY_SECRET'): - class TestSockets(unittest.TestCase): + class TestSockets(TestCase): def setUp(self): - self.app = TestSuite().create_container().container - self.app.bind('BroadcastPusherDriver', BroadcastPusherDriver) - self.app.bind('BroadcastManager', BroadcastManager) + super().setUp() + self.container.bind('BroadcastPusherDriver', BroadcastPusherDriver) + self.container.bind('BroadcastManager', BroadcastManager) def test_broadcast_loads_into_container(self): - self.app.bind('Broadcast', self.app.make('BroadcastManager').driver('pusher')) + self.container.bind('Broadcast', self.container.make('BroadcastManager').driver('pusher')) - self.assertIsNotNone(self.app.make('BroadcastManager')) - self.assertEqual(self.app.make('Broadcast').channel('random', 'from driver'), {'message': 'from driver'}) - self.assertEqual(self.app.make('Broadcast').channel('random', {'message': 'dictionary'}), {'message': 'dictionary'}) - self.assertEqual(self.app.make('Broadcast').channel(['channel1', 'channel2'], {'message': 'dictionary'}), {'message': 'dictionary'}) - self.assertEqual(self.app.make('Broadcast').channel(['channel1', 'channel2'], {'message': 'dictionary'}, 'test-event'), {'message': 'dictionary'}) - self.assertTrue(self.app.make('Broadcast').ssl(True).ssl_message) + self.assertIsNotNone(self.container.make('BroadcastManager')) + self.assertEqual(self.container.make('Broadcast').channel('random', 'from driver'), {'message': 'from driver'}) + self.assertEqual(self.container.make('Broadcast').channel('random', {'message': 'dictionary'}), {'message': 'dictionary'}) + self.assertEqual(self.container.make('Broadcast').channel(['channel1', 'channel2'], {'message': 'dictionary'}), {'message': 'dictionary'}) + self.assertEqual(self.container.make('Broadcast').channel(['channel1', 'channel2'], {'message': 'dictionary'}, 'test-event'), {'message': 'dictionary'}) + self.assertTrue(self.container.make('Broadcast').ssl(True).ssl_message) def test_broadcast_loads_into_container_with_ably(self): - self.app.bind('Broadcast', self.app.make('BroadcastManager').driver('ably')) - - self.assertIsNotNone(self.app.make('BroadcastManager')) - self.assertEqual(self.app.make('Broadcast').channel('test-channel', 'from driver'), 'from driver') - self.assertEqual(self.app.make('Broadcast').channel('test-channel', {'message': 'from driver'}), {'message': 'from driver'}) - self.assertEqual(self.app.make('Broadcast').channel(['channel-1', 'channel-2'], {'message': 'dictionary'}), {'message': 'dictionary'}) - self.assertEqual(self.app.make('Broadcast').channel(['channel-1', 'channel-2'], {'message': 'dictionary'}, 'test-event'), {'message': 'dictionary'}) - self.assertTrue(self.app.make('Broadcast').ssl(True).ssl_message) + self.container.bind('Broadcast', self.container.make('BroadcastManager').driver('ably')) + + self.assertIsNotNone(self.container.make('BroadcastManager')) + self.assertEqual(self.container.make('Broadcast').channel('test-channel', 'from driver'), 'from driver') + self.assertEqual(self.container.make('Broadcast').channel('test-channel', {'message': 'from driver'}), {'message': 'from driver'}) + self.assertEqual(self.container.make('Broadcast').channel(['channel-1', 'channel-2'], {'message': 'dictionary'}), {'message': 'dictionary'}) + self.assertEqual(self.container.make('Broadcast').channel(['channel-1', 'channel-2'], {'message': 'dictionary'}, 'test-event'), {'message': 'dictionary'}) + self.assertTrue(self.container.make('Broadcast').ssl(True).ssl_message) diff --git a/tests/core/test_app.py b/tests/core/test_app.py index 113b8857b..36db26fd5 100644 --- a/tests/core/test_app.py +++ b/tests/core/test_app.py @@ -1,6 +1,6 @@ -from masonite.app import App -from masonite.request import Request -from masonite.testsuite.TestSuite import generate_wsgi +from src.masonite.app import App +from src.masonite.request import Request +from src.masonite.testing import generate_wsgi import unittest REQUEST = Request({}).load_environ(generate_wsgi()) diff --git a/tests/core/test_auth.py b/tests/core/test_auth.py index 3830d22cf..63a489761 100644 --- a/tests/core/test_auth.py +++ b/tests/core/test_auth.py @@ -1,20 +1,20 @@ import datetime import time -from config import application, auth +from config import application from config.database import Model -from masonite.app import App -from masonite.auth import Auth, MustVerifyEmail, Sign -from masonite.managers import AuthManager -from masonite.drivers import AuthCookieDriver, AuthJwtDriver -from masonite.helpers import password as bcrypt_password -from masonite.routes import Get -from masonite.request import Request -from masonite.snippets.auth.controllers.ConfirmController import \ +from src.masonite.app import App +from src.masonite.auth import Auth, MustVerifyEmail, Sign +from src.masonite.auth.guards import Guard, WebGuard +from src.masonite.drivers import AuthJwtDriver +from src.masonite.helpers import password as bcrypt_password +from src.masonite.routes import Get +from src.masonite.request import Request +from app.http.controllers.ConfirmController import \ ConfirmController -from masonite.testing import TestCase -from masonite.testsuite.TestSuite import generate_wsgi -from masonite.view import View +from src.masonite.testing import TestCase +from src.masonite.testing import generate_wsgi +from src.masonite.view import View class User(Model, MustVerifyEmail): @@ -33,20 +33,19 @@ def setUp(self): self.app = self.container self.app.bind('Container', self.app) view = View(self.container) - self.request = Request(generate_wsgi()) + self.request = Request(generate_wsgi()).load_environ(generate_wsgi()) self.request.key(application.KEY) self.app.bind('Request', self.request) - # self.auth = Auth(self.request, MockUser()) self.container.bind('View', view.render) self.container.bind('ViewClass', view) - self.app.bind('Application', application) - self.app.bind('Auth', Auth) - self.app.bind('AuthConfig', auth) - self.app.bind('AuthManager', AuthManager) - self.app.bind('AuthCookieDriver', AuthCookieDriver) - self.app.bind('AuthJwtDriver', AuthJwtDriver) - - self.auth = self.app.make('Auth', User) + + + self.auth = Guard(self.app) + self.auth.register_guard('web', WebGuard) + self.auth.guard('web').register_driver('jwt', AuthJwtDriver) + self.auth.set('web') + + self.app.swap(Auth, self.auth) self.request.load_app(self.app) def setUpFactories(self): @@ -60,9 +59,9 @@ def setUpFactories(self): def test_auth(self): self.assertTrue(self.auth) - def test_login_user(self): + def test_login_user1(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(self.auth.login('user@email.com', 'secret')) self.assertTrue(self.request.get_cookie('token')) self.assertEqual(self.auth.user().name, 'testuser123') @@ -70,17 +69,16 @@ def test_login_user(self): def test_login_with_no_password(self): with self.assertRaises(TypeError): for driver in ('cookie', 'jwt'): + self.auth.driver(driver) self.auth.driver = driver self.assertTrue(self.auth.login('nopassword@email.com', None)) - # def test_can_login_with_second_password(self): - # self.auth.auth_model.__password__ = 'second_password' - # self.assertTrue(self.auth.login('user@email.com', 'pass123')) - # self.assertTrue(self.request.get_cookie('token')) + def test_guard_switches_guard(self): + self.assertIsInstance(self.auth.guard('web'), WebGuard) def test_login_user_with_list_auth_column(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.auth.auth_model.__auth__ = ['name', 'email'] self.assertTrue(self.auth.login('testuser123', 'secret')) self.assertTrue(self.request.get_cookie('token')) @@ -93,30 +91,31 @@ def test_can_register(self): }) for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(User.where('email', 'joe@email.com').first()) self.assertNotEqual(User.where('email', 'joe@email.com').first().password, 'secret') def test_get_user(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(self.auth.login_by_id(1)) self.assertTrue(self.request.user()) def test_get_user_returns_false_if_not_loggedin(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.auth.login('user@email.com', 'wrong_secret') self.assertFalse(self.auth.user()) def test_logout_user(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.auth.login('user@email.com', 'secret') self.assertTrue(self.request.get_cookie('token')) self.assertTrue(self.auth.user()) self.assertTrue(self.request.user()) - + self.auth.driver('jwt') + self.auth.logout() self.assertFalse(self.request.get_cookie('token')) self.assertFalse(self.auth.user()) @@ -124,34 +123,42 @@ def test_logout_user(self): def test_login_user_fails(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertFalse(self.auth.login('user@email.com', 'bad_password')) def test_login_user_success(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(self.auth.login('user@email.com', 'secret')) def test_login_by_id(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(self.auth.login_by_id(1)) self.assertTrue(self.request.get_cookie('token')) self.assertFalse(self.auth.login_by_id(3)) + def test_guard_can_register_new_drivers(self): + self.auth.guard('web').register_driver('api', AuthJwtDriver) + + self.assertIsInstance(self.auth.driver('api'), AuthJwtDriver) + + + def test_guard_can_register_new_guards(self): + self.auth.register_guard('api_guard', AuthJwtDriver) + + self.assertIsInstance(self.auth.guard('api_guard'), AuthJwtDriver) + + def test_login_once_does_not_set_cookie(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) self.assertTrue(self.auth.once().login_by_id(1)) self.assertIsNone(self.request.get_cookie('token')) - # def test_user_is_mustverify_instance(self): - # self.assertIsInstance(self.auth.once().login_by_id(1), MustVerifyEmail) - # self.assertNotIsInstance(self.auth.once().login_by_id(1), MustVerifyEmail) - def test_confirm_controller_success(self): for driver in ('jwt', 'cookie'): - self.auth.driver = driver + self.auth.driver(driver) params = {'id': Sign().sign('{0}::{1}'.format(1, time.time()))} self.request.set_params(params) user = self.auth.once().login_by_id(1) @@ -176,7 +183,7 @@ def test_confirm_controller_success(self): def test_confirm_controller_failure(self): for driver in ('cookie', 'jwt'): - self.auth.driver = driver + self.auth.driver(driver) timestamp_plus_11 = datetime.datetime.now() - datetime.timedelta(minutes=11) params = {'id': Sign().sign('{0}::{1}'.format(1, timestamp_plus_11.timestamp()))} diff --git a/tests/core/test_auth_middleware.py b/tests/core/test_auth_middleware.py new file mode 100644 index 000000000..d41c74b4f --- /dev/null +++ b/tests/core/test_auth_middleware.py @@ -0,0 +1,38 @@ +from src.masonite.auth.guards import WebGuard + +from src.masonite.auth import Auth +from src.masonite.middleware import GuardMiddleware +from src.masonite.routes import Get +from src.masonite.testing import TestCase + +class MockApiGuard: + + def user(self): + return 'user' + +class MockController: + + def user(self, auth: Auth): + return auth.user() + +class TestAuthMiddleware(TestCase): + + def setUp(self): + super().setUp() + self.container.make(Auth).register_guard('api', MockApiGuard) + + self.withRouteMiddleware({ + 'guard': GuardMiddleware, + }) + + self.routes([ + Get('/guard/web', MockController.user).middleware('guard:web'), + Get('/guard/api', MockController.user).middleware('guard:api') + ]) + + def test_can_switch_guards(self): + self.get('/guard/web').assertContains('False') + self.assertIsInstance(self.container.make(Auth).get(), WebGuard) + + self.get('/guard/api').assertContains('user') + self.assertIsInstance(self.container.make(Auth).get(), WebGuard) \ No newline at end of file diff --git a/tests/core/test_autoload.py b/tests/core/test_autoload.py index b19e3cbe6..533cc8be3 100644 --- a/tests/core/test_autoload.py +++ b/tests/core/test_autoload.py @@ -1,10 +1,10 @@ import unittest -from masonite.app import App -from masonite.autoload import Autoload -from masonite.exceptions import (AutoloadContainerOverwrite, ContainerError, +from src.masonite.app import App +from src.masonite.autoload import Autoload +from src.masonite.exceptions import (AutoloadContainerOverwrite, ContainerError, InvalidAutoloadPath) -from masonite.request import Request +from src.masonite.request import Request class TestAutoload(unittest.TestCase): diff --git a/tests/core/test_cache.py b/tests/core/test_cache.py index e549f516a..b5924dde3 100644 --- a/tests/core/test_cache.py +++ b/tests/core/test_cache.py @@ -1,14 +1,13 @@ import glob import os import time - -from config import cache -from masonite.app import App -from masonite.drivers import CacheDiskDriver, CacheRedisDriver -from masonite.environment import LoadEnvironment -from masonite.managers import CacheManager import unittest +from src.masonite.app import App +from src.masonite.drivers import CacheDiskDriver, CacheRedisDriver +from src.masonite.environment import LoadEnvironment +from src.masonite.managers import CacheManager + LoadEnvironment() @@ -16,11 +15,10 @@ class TestCache(unittest.TestCase): def setUp(self): self.app = App() - self.app.bind('CacheConfig', cache) + self.app.bind('Application', self.app) self.app.bind('CacheDiskDriver', CacheDiskDriver) self.app.bind('CacheRedisDriver', CacheRedisDriver) self.app.bind('CacheManager', CacheManager(self.app)) - self.app.bind('Application', self.app) self.app.bind('Cache', self.app.make('CacheManager').driver('disk')) self.drivers = ['disk'] if os.environ.get('REDIS_CACHE_DRIVER'): diff --git a/tests/core/test_compile_sass.py b/tests/core/test_compile_sass.py index 6e780f25a..d5c59beac 100644 --- a/tests/core/test_compile_sass.py +++ b/tests/core/test_compile_sass.py @@ -1,5 +1,5 @@ import os -from masonite.storage import Storage +from src.masonite.storage import Storage import unittest diff --git a/tests/core/test_container.py b/tests/core/test_container.py index d629c6cab..12b90093f 100644 --- a/tests/core/test_container.py +++ b/tests/core/test_container.py @@ -1,8 +1,8 @@ -from masonite.app import App -from masonite.request import Request -from masonite.drivers import UploadDiskDriver -from masonite.contracts import UploadContract -from masonite.exceptions import ContainerError, StrictContainerException +from src.masonite.app import App +from src.masonite.request import Request +from src.masonite.drivers import UploadDiskDriver +from src.masonite.contracts import UploadContract +from src.masonite.exceptions import ContainerError, StrictContainerException import unittest diff --git a/tests/core/test_controllers.py b/tests/core/test_controllers.py index 94ed12b1b..9ab5b093f 100644 --- a/tests/core/test_controllers.py +++ b/tests/core/test_controllers.py @@ -1,7 +1,7 @@ -from masonite.app import App -from masonite.helpers.routes import get +from src.masonite.app import App +from src.masonite.helpers.routes import get from app.http.controllers.ControllerTest import ControllerTest -from masonite.request import Request +from src.masonite.request import Request import unittest diff --git a/tests/core/test_cookie_signing.py b/tests/core/test_cookie_signing.py index 24310e5e6..4d8b6945f 100644 --- a/tests/core/test_cookie_signing.py +++ b/tests/core/test_cookie_signing.py @@ -1,5 +1,5 @@ -from masonite.request import Request -from masonite.testsuite.TestSuite import generate_wsgi +from src.masonite.request import Request +from src.masonite.testing import generate_wsgi import unittest diff --git a/tests/core/test_csrf.py b/tests/core/test_csrf.py index 92db6b3f2..68d426872 100644 --- a/tests/core/test_csrf.py +++ b/tests/core/test_csrf.py @@ -1,6 +1,6 @@ -from masonite.middleware import CsrfMiddleware -from masonite.testing import TestCase -from masonite.routes import Get, Post +from src.masonite.middleware import CsrfMiddleware +from src.masonite.testing import TestCase +from src.masonite.routes import Get, Post class TestCsrf(TestCase): diff --git a/tests/core/test_environment.py b/tests/core/test_environment.py index 225da41ca..befe95b94 100644 --- a/tests/core/test_environment.py +++ b/tests/core/test_environment.py @@ -1,6 +1,6 @@ -from masonite.environment import LoadEnvironment -from masonite import env +from src.masonite.environment import LoadEnvironment +from src.masonite import env import os import unittest diff --git a/tests/core/test_exception.py b/tests/core/test_exception.py index 478c2053a..82ea36836 100644 --- a/tests/core/test_exception.py +++ b/tests/core/test_exception.py @@ -1,10 +1,10 @@ -from masonite.app import App -from masonite.exception_handler import ExceptionHandler -from masonite.hook import Hook -from masonite.request import Request -from masonite.response import Response -from masonite.testsuite.TestSuite import generate_wsgi -from masonite.view import View +from src.masonite.app import App +from src.masonite.exception_handler import ExceptionHandler +from src.masonite.hook import Hook +from src.masonite.request import Request +from src.masonite.response import Response +from src.masonite.testing import generate_wsgi +from src.masonite.view import View import unittest @@ -29,7 +29,6 @@ class TestException(unittest.TestCase): def setUp(self): self.app = App() - self.app.bind('Application', ApplicationMock) self.app.bind('Environ', generate_wsgi()) self.app.bind('WebRoutes', []) self.app.bind('View', View(self.app).render) @@ -40,6 +39,7 @@ def setUp(self): self.app.bind('ExceptionHandler', ExceptionHandler(self.app)) self.app.bind('HookHandler', Hook(self.app)) self.app.bind('Request', Request(generate_wsgi()).load_app(self.app)) + self.app.bind('staticfiles', {}) self.app.bind('ExceptionAttributeErrorHandler', MockExceptionHandler) def test_exception_renders_view(self): @@ -61,5 +61,5 @@ def test_custom_exception_when_not_registered(self): self.app.make('ExceptionHandler').load_exception(e) def test_exception_returns_none_when_debug_is_false(self): - self.app.make('Application').DEBUG = False + # config('application.debug') = False self.assertIsNone(self.app.make('ExceptionHandler').load_exception(KeyError)) diff --git a/tests/core/test_extends.py b/tests/core/test_extends.py index f15e1dbb2..b96923a17 100644 --- a/tests/core/test_extends.py +++ b/tests/core/test_extends.py @@ -1,7 +1,7 @@ -from masonite.app import App -from masonite.testsuite.TestSuite import generate_wsgi -from masonite.routes import Route -from masonite.request import Request +from src.masonite.app import App +from src.masonite.testing import generate_wsgi +from src.masonite.routes import Route +from src.masonite.request import Request wsgi_request = generate_wsgi() import unittest diff --git a/tests/core/test_hook.py b/tests/core/test_hook.py index 5d57d78cc..0c7b46e60 100644 --- a/tests/core/test_hook.py +++ b/tests/core/test_hook.py @@ -1,5 +1,5 @@ -from masonite.app import App -from masonite.hook import Hook +from src.masonite.app import App +from src.masonite.hook import Hook import unittest diff --git a/tests/core/test_mail_log_drivers.py b/tests/core/test_mail_log_drivers.py index 7043ded88..e65a3274d 100644 --- a/tests/core/test_mail_log_drivers.py +++ b/tests/core/test_mail_log_drivers.py @@ -1,16 +1,14 @@ -from config import mail import os - -from masonite.app import App -from masonite.view import View -from masonite.managers.MailManager import MailManager -from masonite.drivers import MailLogDriver -from masonite.drivers import MailTerminalDriver -import unittest import sys +import unittest from contextlib import contextmanager + from _io import StringIO +from src.masonite.app import App +from src.masonite.drivers import MailLogDriver, MailTerminalDriver +from src.masonite.managers.MailManager import MailManager +from src.masonite.view import View @contextmanager @@ -35,7 +33,6 @@ def setUp(self): self.app = self.app.bind('Container', self.app) self.app.bind('Test', object) - self.app.bind('MailConfig', mail) viewClass = View(self.app) self.app.bind('ViewClass', viewClass) self.app.bind('View', viewClass.render) diff --git a/tests/core/test_mail_smtp_driver.py b/tests/core/test_mail_smtp_driver.py index 0a9d4908a..e3027d6a7 100644 --- a/tests/core/test_mail_smtp_driver.py +++ b/tests/core/test_mail_smtp_driver.py @@ -1,11 +1,10 @@ -from config import mail -from masonite import env -from masonite.app import App -from masonite.drivers import MailMailgunDriver as Mailgun -from masonite.drivers import MailSmtpDriver as MailDriver -from masonite.environment import LoadEnvironment -from masonite.managers.MailManager import MailManager -from masonite.view import View +from src.masonite import env +from src.masonite.app import App +from src.masonite.drivers import MailMailgunDriver as Mailgun +from src.masonite.drivers import MailSmtpDriver as MailDriver +from src.masonite.environment import LoadEnvironment +from src.masonite.managers.MailManager import MailManager +from src.masonite.view import View import unittest LoadEnvironment() @@ -22,7 +21,6 @@ def setUp(self): self.app.bind('Container', self.app) self.app.bind('Test', object) - self.app.bind('MailConfig', mail) self.app.bind('MailSmtpDriver', MailDriver) self.app.bind('MailMailgunDriver', Mailgun) viewClass = View(self.app) diff --git a/tests/core/test_mailgun_driver.py b/tests/core/test_mailgun_driver.py index 51422eedc..821e43dfd 100644 --- a/tests/core/test_mailgun_driver.py +++ b/tests/core/test_mailgun_driver.py @@ -1,15 +1,14 @@ import os - -from config import mail -from masonite import env -from masonite.app import App -from masonite.drivers import MailMailgunDriver as Mailgun -from masonite.drivers import MailSmtpDriver as MailDriver -from masonite.environment import LoadEnvironment -from masonite.managers.MailManager import MailManager -from masonite.view import View import unittest +from src.masonite import env +from src.masonite.app import App +from src.masonite.drivers import MailMailgunDriver as Mailgun +from src.masonite.drivers import MailSmtpDriver as MailDriver +from src.masonite.environment import LoadEnvironment +from src.masonite.managers.MailManager import MailManager +from src.masonite.view import View + LoadEnvironment() if os.getenv('MAILGUN_SECRET'): @@ -24,7 +23,6 @@ def setUp(self): self.app.bind('Container', self.app) self.app.bind('Test', object) - self.app.bind('MailConfig', mail) self.app.bind('MailSmtpDriver', MailDriver) self.app.bind('MailMailgunDriver', Mailgun) viewClass = View(self.app) diff --git a/tests/core/test_managers_mail_manager.py b/tests/core/test_managers_mail_manager.py index 41ff1ff52..fbfc5a3b1 100644 --- a/tests/core/test_managers_mail_manager.py +++ b/tests/core/test_managers_mail_manager.py @@ -1,17 +1,16 @@ -from masonite.environment import LoadEnvironment +from src.masonite.environment import LoadEnvironment LoadEnvironment() -from config import mail -from masonite.app import App -from masonite.contracts import MailManagerContract -from masonite.drivers import MailMailgunDriver as Mailgun -from masonite.drivers import MailSmtpDriver as MailDriver -from masonite.exceptions import DriverNotFound -from masonite.managers import MailManager -from masonite.view import View -from masonite.contracts import MailContract -from masonite import env +from src.masonite.app import App +from src.masonite.contracts import MailManagerContract +from src.masonite.drivers import MailMailgunDriver as Mailgun +from src.masonite.drivers import MailSmtpDriver as MailDriver +from src.masonite.exceptions import DriverNotFound +from src.masonite.managers import MailManager +from src.masonite.view import View +from src.masonite.contracts import MailContract +from src.masonite import env import unittest @@ -36,7 +35,6 @@ def setUp(self): self.app.bind('Test', object) self.app.bind('MailSmtpDriver', object) - self.app.bind('MailConfig', mail) self.app.bind('View', View(self.app).render) self.app.bind('ViewClass', View(self.app)) diff --git a/tests/core/test_middleware.py b/tests/core/test_middleware.py index 39395e8bf..f2aa82dda 100644 --- a/tests/core/test_middleware.py +++ b/tests/core/test_middleware.py @@ -1,8 +1,8 @@ -from masonite.request import Request -from masonite.routes import Get +from src.masonite.request import Request +from src.masonite.routes import Get from app.http.middleware.TestMiddleware import TestMiddleware as MiddlewareTest from app.http.middleware.TestHttpMiddleware import TestHttpMiddleware as MiddlewareHttpTest -from masonite.testing import TestCase +from src.masonite.testing import TestCase class MiddlewareValueTest: diff --git a/tests/core/test_package.py b/tests/core/test_package.py index 67a56aba3..247be2530 100644 --- a/tests/core/test_package.py +++ b/tests/core/test_package.py @@ -1,7 +1,7 @@ import os import unittest -from masonite.packages import (create_controller, create_or_append_config) +from src.masonite.packages import (create_controller, create_or_append_config) PACKAGE_DIRECTORY = os.getcwd() diff --git a/tests/core/test_providers.py b/tests/core/test_providers.py index 55b26fb00..65109ec7a 100644 --- a/tests/core/test_providers.py +++ b/tests/core/test_providers.py @@ -1,39 +1,32 @@ -from config import application, providers -from masonite.app import App -from masonite.routes import Get -from masonite.testsuite.TestSuite import TestSuite, generate_wsgi -import unittest +from src.masonite.helpers import config +from src.masonite.routes import Get +from src.masonite.testing import TestCase, generate_wsgi -class TestProviders(unittest.TestCase): +class TestProviders(TestCase): def setUp(self): - self.app = App(remember=False) - self.app.bind('WSGI', object) - - self.app.bind('Application', application) - self.app.bind('Providers', providers) - self.app.bind('Environ', generate_wsgi()) + super().setUp() + self.container.bind('Environ', generate_wsgi()) def test_providers_load_into_container(self): - for provider in self.app.make('Providers').PROVIDERS: - provider().load_app(self.app).register() + for provider in config('providers.providers'): + provider().load_app(self.container).register() - self.app.bind('Response', 'test') - self.app.bind('WebRoutes', [ + self.container.bind('Response', 'test') + self.container.bind('WebRoutes', [ Get().route('url', 'TestController@show'), Get().route('url/', 'TestController@show'), Get().route('url/@firstname', 'TestController@show'), ]) - self.app.bind('Response', 'Route not found. Error 404') + self.container.bind('Response', 'Route not found. Error 404') - for provider in self.app.make('Providers').PROVIDERS: - self.app.resolve(provider().load_app(self.app).boot) + for provider in config('providers.providers'): + self.container.resolve(provider().load_app(self.container).boot) - self.assertTrue(self.app.make('Request')) + self.assertTrue(self.container.make('Request')) def test_normal_app_containers(self): - self.app = TestSuite().create_container() - self.assertTrue(self.app.get_container().make('Request')) + self.assertTrue(self.container.make('Request')) diff --git a/tests/core/test_request_routes.py b/tests/core/test_request_routes.py index 5287b8978..fcef310bb 100644 --- a/tests/core/test_request_routes.py +++ b/tests/core/test_request_routes.py @@ -1,13 +1,12 @@ -from masonite.routes import Get, Post -from masonite.request import Request -from masonite.testsuite.TestSuite import TestSuite, generate_wsgi -import unittest +from src.masonite.routes import Get, Post +from src.masonite.testing import TestCase, generate_wsgi -class TestRequestRoutes(unittest.TestCase): +class TestRequestRoutes(TestCase): def setUp(self): - self.request = Request(generate_wsgi()).key( + super().setUp() + self.request = self.container.make('Request').load_environ(generate_wsgi()).key( 'NCTpkICMlTXie5te9nJniMj9aVbPM6lsjeq5iDZ0dqY=') self.request.activate_subdomains() @@ -57,38 +56,36 @@ def test_method_type_has_required_subdomain(self): self.assertEqual(post.has_required_domain(), True) def test_method_type_has_required_subdomain_with_asterick(self): - container = TestSuite().create_container() - request = container.container.make('Request') + - request.environ['HTTP_HOST'] = 'test.localhost:8000' + self.request.environ['HTTP_HOST'] = 'test.localhost:8000' - request.activate_subdomains() + self.request.activate_subdomains() get = Get().domain('*') post = Get().domain('*') - get.request = request - post.request = request + get.request = self.request + post.request = self.request self.assertEqual(get.has_required_domain(), True) self.assertEqual(post.has_required_domain(), True) def test_request_sets_subdomain_on_get(self): - container = TestSuite().create_container() - request = container.container.make('Request') + - request.environ['HTTP_HOST'] = 'test.localhost:8000' + self.request.environ['HTTP_HOST'] = 'test.localhost:8000' - request.activate_subdomains() + self.request.activate_subdomains() get = Get().domain('*') post = Get().domain('*') - get.request = request - post.request = request + get.request = self.request + post.request = self.request get.has_required_domain() - self.assertEqual(request.param('subdomain'), 'test') + self.assertEqual(self.request.param('subdomain'), 'test') def test_route_changes_module_location(self): get = Get().module('app.test') diff --git a/tests/core/test_requests.py b/tests/core/test_requests.py index 69ffe6020..76ac5c42b 100644 --- a/tests/core/test_requests.py +++ b/tests/core/test_requests.py @@ -2,17 +2,17 @@ from cgi import MiniFieldStorage import pytest -from masonite.app import App -from masonite.exceptions import InvalidHTTPStatusCode, RouteException -from masonite.helpers.routes import flatten_routes -from masonite.helpers.time import cookie_expire_time -from masonite.request import Request -from masonite.response import Response -from masonite.routes import Get, RouteGroup -from masonite.testsuite.TestSuite import generate_wsgi from app.http.test_controllers.TestController import TestController -from config import application, providers +from src.masonite.app import App +from src.masonite.exceptions import InvalidHTTPStatusCode, RouteException +from src.masonite.helpers import config +from src.masonite.helpers.routes import flatten_routes +from src.masonite.helpers.time import cookie_expire_time +from src.masonite.request import Request +from src.masonite.response import Response +from src.masonite.routes import Get, RouteGroup +from src.masonite.testing import generate_wsgi WEB_ROUTES = flatten_routes([ Get('/test', 'Controller@show').name('test'), @@ -88,7 +88,7 @@ def test_request_input_can_get_dictionary_elements(self): ] } } - self.assertEqual(self.request.input('user.address.*.id'), [1,2]) + self.assertEqual(self.request.input('user.address.*.id'), [1, 2]) self.assertEqual(self.request.input('user.address.*.street'), ['A Street', 'B Street']) def test_request_sets_and_gets_cookies(self): @@ -179,12 +179,10 @@ def test_request_loads_app(self): def test_request_gets_input_from_container(self): container = App() - container.bind('Application', application) - container.bind('Providers', providers) container.bind('WSGI', object) container.bind('Environ', wsgi_request) - for provider in container.make('Providers').PROVIDERS: + for provider in config('providers.providers'): provider().load_app(container).register() container.bind('Response', 'test') @@ -196,7 +194,7 @@ def test_request_gets_input_from_container(self): container.bind('Response', 'Route not found. Error 404') - for provider in container.make('Providers').PROVIDERS: + for provider in config('providers.providers'): located_provider = provider().load_app(container) container.resolve(located_provider.boot) diff --git a/tests/core/test_responsable.py b/tests/core/test_responsable.py new file mode 100644 index 000000000..c485bcf59 --- /dev/null +++ b/tests/core/test_responsable.py @@ -0,0 +1,14 @@ +from src.masonite.testing import TestCase +from src.masonite.routes import Get + + +class TestResponsable(TestCase): + + def setUp(self): + super().setUp() + self.routes(only=[ + Get('/test/mail', 'TestController@mail') + ]) + + def test_mail_can_respond(self): + self.assertTrue(self.get('/test/mail').contains('mail')) diff --git a/tests/core/test_response.py b/tests/core/test_response.py index a56d8b132..7dbda8927 100644 --- a/tests/core/test_response.py +++ b/tests/core/test_response.py @@ -1,20 +1,15 @@ -import unittest -import json -from orator import Model +from orator import LengthAwarePaginator, Model, Paginator from orator.support.collection import Collection -from orator import Paginator, LengthAwarePaginator -from app.User import User + from app.http.controllers.TestController import \ TestController as ControllerTest -from masonite.app import App -from masonite.request import Request -from masonite.response import Response -from masonite.testsuite import generate_wsgi -from masonite.view import View -from masonite.testing import TestCase -from masonite.routes import Get +from app.User import User from config.factories import factory +from src.masonite.response import Response +from src.masonite.routes import Get +from src.masonite.testing import TestCase +from src.masonite.view import View class MockUser(Model): @@ -179,7 +174,6 @@ def test_view_should_return_a_json_response_when_returning_length_aware_paginato def test_view_should_return_a_json_response_when_returning_paginator_instance(self): - users = User.all() ( self.get('/paginator') .assertHasJson('count', 10) diff --git a/tests/core/test_routes.py b/tests/core/test_routes.py index b9fd06765..8fd4a39e4 100644 --- a/tests/core/test_routes.py +++ b/tests/core/test_routes.py @@ -1,17 +1,17 @@ -import unittest -from masonite.exceptions import RouteNotFoundException -from masonite.app import App -from masonite.exceptions import InvalidRouteCompileException, RouteException -from masonite.helpers.routes import create_matchurl, flatten_routes, group -from masonite.request import Request -from masonite.routes import (Connect, Delete, Get, Head, Match, Options, Patch, - Post, Put, Redirect, Route, RouteGroup, Trace) -from masonite.testing import TestCase -from masonite.testsuite.TestSuite import generate_wsgi +import unittest from app.http.controllers.subdirectory.SubController import SubController - +from src.masonite.app import App +from src.masonite.exceptions import (InvalidRouteCompileException, + RouteException) +from src.masonite.helpers.routes import create_matchurl, flatten_routes, group +from src.masonite.request import Request +from src.masonite.routes import (Connect, Delete, Get, Head, Match, Options, + Patch, Post, Put, Redirect, Route, RouteGroup, + Trace) +from src.masonite.testing import TestCase, generate_wsgi +from src.masonite.exceptions import RouteNotFoundException class TestRoutes(unittest.TestCase): diff --git a/tests/core/test_service_provider.py b/tests/core/test_service_provider.py index a69faefa9..3c8643036 100644 --- a/tests/core/test_service_provider.py +++ b/tests/core/test_service_provider.py @@ -1,10 +1,9 @@ import os -import unittest -from masonite.provider import ServiceProvider -from masonite.request import Request -from masonite.routes import Get -from masonite.testsuite.TestSuite import TestSuite, generate_wsgi +from src.masonite.provider import ServiceProvider +from src.masonite.request import Request +from src.masonite.routes import Get +from src.masonite.testing import TestCase, generate_wsgi class ContainerTest(ServiceProvider): @@ -19,7 +18,7 @@ def testboot(self, request: Request, get: Get): class ServiceProviderTest(ServiceProvider): def register(self): - self.app.bind('Request', object) + self.container.bind('Request', object) class Mock1Command: @@ -61,60 +60,60 @@ def boot(self): self.commands(Mock1Command(), Mock2Command()) -class TestServiceProvider(unittest.TestCase): +class TestServiceProvider(TestCase): def setUp(self): - self.app = TestSuite().create_container().container - self.app.resolve_parameters = True + super().setUp() + self.container.resolve_parameters = True self.provider = ServiceProvider() - self.provider.load_app(self.app).register() + self.provider.load_app(self.container).register() self.load_provider = LoadProvider() - self.load_provider.load_app(self.app).boot() + self.load_provider.load_app(self.container).boot() def test_service_provider_loads_app(self): - self.assertEqual(self.provider.app, self.app) + self.assertEqual(self.provider.app, self.container) def test_can_call_container_with_self_parameter(self): - self.app.bind('Request', Request({})) - self.app.bind('Get', Get()) + self.container.bind('Request', Request({})) + self.container.bind('Get', Get()) - self.assertEqual(self.app.resolve(ContainerTest().boot), self.app.make('Request')) + self.assertEqual(self.container.resolve(ContainerTest().boot), self.container.make('Request')) def test_can_call_container_with_annotations_from_variable(self): request = Request(generate_wsgi()) - self.app.bind('Request', request) - self.app.bind('Get', Get().route('url', None)) + self.container.bind('Request', request) + self.container.bind('Get', Get().route('url', None)) - self.assertEqual(self.app.resolve(ContainerTest().testboot), self.app.make('Request')) + self.assertEqual(self.container.resolve(ContainerTest().testboot), self.container.make('Request')) def test_can_load_routes_into_container(self): - self.assertTrue(len(self.app.make('WebRoutes')) > 2) - self.assertEqual(self.app.make('WebRoutes')[-2:], [ROUTE1, ROUTE2]) + self.assertTrue(len(self.container.make('WebRoutes')) > 2) + self.assertEqual(self.container.make('WebRoutes')[-2:], [ROUTE1, ROUTE2]) def test_can_load_http_middleware_into_container(self): - self.assertEqual(self.app.make('HttpMiddleware')[-2:], [object, object]) + self.assertEqual(self.container.make('HttpMiddleware')[-2:], [object, object]) def test_can_load_route_middleware_into_container(self): - self.assertEqual(self.app.make('RouteMiddleware')['route1'], object) - self.assertEqual(self.app.make('RouteMiddleware')['route2'], object) + self.assertEqual(self.container.make('RouteMiddleware')['route1'], object) + self.assertEqual(self.container.make('RouteMiddleware')['route2'], object) def test_can_load_migrations_into_container(self): - self.assertEqual(len(self.app.collect('*MigrationDirectory')), 2) + self.assertEqual(len(self.container.collect('*MigrationDirectory')), 12) def test_can_load_assets_into_container(self): - self.assertEqual(self.app.make('Storage').STATICFILES['storage/static'], '/some/location') + self.assertEqual(self.container.make('staticfiles')['storage/static'], '/some/location') def test_can_load_commands_into_container(self): - self.assertTrue(self.app.make('Mock1Command')) - self.assertTrue(self.app.make('Mock2Command')) + self.assertTrue(self.container.make('Mock1Command')) + self.assertTrue(self.container.make('Mock2Command')) def test_can_load_publishing(self): self.load_provider.publishes({ 'from/directory': 'to/directory' }) self.assertEqual(self.load_provider._publishes, {'from/directory': 'to/directory'}) - # self.assertTrue(self.app.make('Mock2Command')) + # self.assertTrue(self.container.make('Mock2Command')) def test_provider_can_publish_with_tags(self): self.load_provider.publishes({ diff --git a/tests/core/test_session.py b/tests/core/test_session.py index 0ccabd158..3231c2634 100644 --- a/tests/core/test_session.py +++ b/tests/core/test_session.py @@ -1,28 +1,20 @@ -from config import session -from masonite.app import App -from masonite.drivers import SessionCookieDriver, SessionMemoryDriver -from masonite.managers import SessionManager -from masonite.request import Request -from masonite.testsuite.TestSuite import generate_wsgi -import unittest +from src.masonite.drivers import SessionCookieDriver, SessionMemoryDriver +from src.masonite.managers import SessionManager +from src.masonite.testing import generate_wsgi, TestCase -class TestSession(unittest.TestCase): +class TestSession(TestCase): def setUp(self): - wsgi_request = generate_wsgi() - self.app = App() - self.app.bind('Environ', wsgi_request) - self.app.bind('Request', Request(wsgi_request)) - self.app.bind('SessionConfig', session) - self.app.bind('SessionCookieDriver', SessionCookieDriver) - self.app.bind('SessionMemoryDriver', SessionMemoryDriver) - self.app.bind('SessionManager', SessionManager(self.app)) - self.app.bind('Application', self.app) + super().setUp() + self.container.make('Request').load_environ(generate_wsgi()) + self.container.bind('SessionMemoryDriver', SessionMemoryDriver) + self.container.bind('SessionCookieDriver', SessionCookieDriver) + self.container.bind('SessionManager', SessionManager(self.container)) def test_session_request(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session.set('username', 'pep') session.set('password', 'secret') self.assertEqual(session.get('username'), 'pep') @@ -30,22 +22,22 @@ def test_session_request(self): def test_session_has_no_data(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session._flash = {} self.assertFalse(session.has('nodata')) def test_change_ip_address(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) - session.environ['REMOTE_ADDR'] = '111.222.33.44' + session = self.container.make('SessionManager').driver(driver) + session.request.environ['REMOTE_ADDR'] = '111.222.33.44' session.set('username', 'pep') self.assertEqual(session.get('username'), 'pep') def test_session_get_all_data(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) - session.environ['REMOTE_ADDR'] = 'get.all.data' + session = self.container.make('SessionManager').driver(driver) + session.request.environ['REMOTE_ADDR'] = 'get.all.data' session.set('username', 'pep') session.flash('password', 'secret') @@ -53,7 +45,7 @@ def test_session_get_all_data(self): def test_session_has_data(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session._flash = {} session.set('username', 'pep') @@ -62,7 +54,7 @@ def test_session_has_data(self): def test_session_helper(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session._flash = {} helper = session.helper @@ -71,7 +63,7 @@ def test_session_helper(self): def test_session_flash_data(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session.flash('flash_username', 'pep') session.flash('flash_password', 'secret') @@ -79,13 +71,13 @@ def test_session_flash_data(self): self.assertEqual(session.get('flash_password'), 'secret') def test_reset_flash_session_memory(self): - session = self.app.make('SessionManager').driver('memory') + session = self.container.make('SessionManager').driver('memory') session.flash('flash_', 'test_pep') session.reset(flash_only=True) self.assertIsNone(session.get('flash_')) def test_reset_flash_session_driver(self): - session = self.app.make('SessionManager').driver('cookie') + session = self.container.make('SessionManager').driver('cookie') session.flash('flash_', 'test_pep') session.reset(flash_only=True) @@ -93,7 +85,7 @@ def test_reset_flash_session_driver(self): def test_session_flash_data_serializes_dict(self): for driver in ('cookie', 'memory'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session.flash('flash_dict', {'id': 1}) session.set('get_dict', {'id': 1}) @@ -102,21 +94,21 @@ def test_session_flash_data_serializes_dict(self): def test_session_flash_data_serializes_list(self): for driver in ('cookie', 'memory'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session._session = {} session.flash('flash_dict', [1, 2, 3]) self.assertEqual(session.get('flash_dict'), [1, 2, 3]) def test_reset_serializes_dict(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session.set('flash_', 'test_pep') session.reset() self.assertIsNone(session.get('reset_username')) def test_delete_session(self): for driver in ('memory', 'cookie'): - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) session.set('test1', 'value') session.set('test2', 'value') self.assertTrue(session.delete('test1')) @@ -125,12 +117,12 @@ def test_delete_session(self): def test_can_redirect_with_inputs(self): for driver in ('memory', 'cookie'): - request = self.app.make('Request') + request = self.container.make('Request') request.request_variables = { 'key1': 'val1', 'key2': 'val2', } request.with_input() - session = self.app.make('SessionManager').driver(driver) + session = self.container.make('SessionManager').driver(driver) self.assertFalse(session.has('key1')) self.assertFalse(session.has('key2')) diff --git a/tests/core/test_signing.py b/tests/core/test_signing.py index 772a1ebf5..197e67e91 100644 --- a/tests/core/test_signing.py +++ b/tests/core/test_signing.py @@ -2,8 +2,8 @@ from cryptography.fernet import Fernet -from masonite.auth.Sign import Sign -from masonite.exceptions import InvalidSecretKey +from src.masonite.auth.Sign import Sign +from src.masonite.exceptions import InvalidSecretKey class TestSigning(unittest.TestCase): diff --git a/tests/core/test_testsuite.py b/tests/core/test_testsuite.py deleted file mode 100644 index bf57d0ba5..000000000 --- a/tests/core/test_testsuite.py +++ /dev/null @@ -1,19 +0,0 @@ -from masonite.testsuite.TestSuite import TestSuite -import unittest - - -class TestTestSuite(unittest.TestCase): - - def setUp(self): - self.suite = TestSuite().create_container() - self.container = self.suite.get_container() - - def test_testsuite_creates_container(self): - self.assertTrue(self.container.make('Request')) - - def test_testsuite_should_return_route_exists(self): - self.assertTrue(self.suite.route('/test').exists()) - - def test_testsuite_route_should_return_bool_if_has_middleware(self): - self.assertTrue(self.suite.route('/test').hasMiddleware('auth')) - self.assertFalse(self.suite.route('/test').hasMiddleware('none')) diff --git a/tests/core/test_upload_manager.py b/tests/core/test_upload_manager.py index c02bcd03c..35f7340a2 100644 --- a/tests/core/test_upload_manager.py +++ b/tests/core/test_upload_manager.py @@ -2,14 +2,13 @@ import shutil import unittest -from config import application, storage -from masonite.app import App -from masonite.drivers import UploadDiskDriver, UploadS3Driver -from masonite.environment import LoadEnvironment -from masonite.exceptions import (DriverNotFound, FileTypeException, +from src.masonite.app import App +from src.masonite.drivers import UploadDiskDriver, UploadS3Driver +from src.masonite.environment import LoadEnvironment +from src.masonite.exceptions import (DriverNotFound, FileTypeException, UnacceptableDriverType) -from masonite.helpers import static -from masonite.managers.UploadManager import UploadManager +from src.masonite.helpers import static +from src.masonite.managers.UploadManager import UploadManager LoadEnvironment() @@ -35,10 +34,9 @@ def setUp(self): self.app = App() self.app.bind('Container', self.app) self.app.bind('Test', object) - self.app.bind('StorageConfig', storage) + # self.app.bind('StorageConfig', storage) self.app.bind('UploadDiskDriver', UploadDiskDriver) self.app.bind('UploadS3Driver', UploadS3Driver) - self.app.bind('Application', application) self.app.bind('UploadManager', UploadManager) def test_upload_manager_grabs_drivers(self): @@ -64,7 +62,7 @@ def test_upload_manager_changes_accepted_files(self): def test_upload_manager_raises_driver_not_found_error(self): self.app = App() self.app.bind('Test', object) - self.app.bind('StorageConfig', storage) + # self.app.bind('StorageConfig', storage) with self.assertRaises(DriverNotFound): self.assertIsNone(self.app.bind( @@ -168,8 +166,7 @@ def setUp(self): self.app = App() self.app.bind('Container', self.app) - self.app.bind('Application', application) - self.app.bind('StorageConfig', storage) + # self.app.bind('StorageConfig', storage) self.app.bind('UploadDiskDriver', UploadDiskDriver) self.app.bind('UploadManager', UploadManager(self.app)) self.app.bind('Upload', UploadManager(self.app)) diff --git a/tests/core/test_view.py b/tests/core/test_view.py index 05c6d77e7..27dedd4e8 100644 --- a/tests/core/test_view.py +++ b/tests/core/test_view.py @@ -3,12 +3,11 @@ from jinja2 import FileSystemLoader -from config import cache -from masonite.app import App -from masonite.drivers import CacheDiskDriver -from masonite.exceptions import RequiredContainerBindingNotFound, ViewException -from masonite.managers.CacheManager import CacheManager -from masonite.view import View +from src.masonite.app import App +from src.masonite.drivers import CacheDiskDriver +from src.masonite.exceptions import RequiredContainerBindingNotFound, ViewException +from src.masonite.managers.CacheManager import CacheManager +from src.masonite.view import View import unittest @@ -167,7 +166,7 @@ def _filter_slug(item): def test_view_cache_caches_files(self): - self.container.bind('CacheConfig', cache) + # self.container.bind('CacheConfig', cache) self.container.bind('CacheDiskDriver', CacheDiskDriver) self.container.bind('CacheManager', CacheManager(self.container)) self.container.bind('Application', self.container) @@ -197,7 +196,7 @@ def test_view_cache_caches_files(self): self.assertEqual(view('test_cache', {'test': 'macho'}).cache_for('1', 'second').rendered_template, 'macho') def test_cache_throws_exception_with_incorrect_cache_type(self): - self.container.bind('CacheConfig', cache) + # self.container.bind('CacheConfig', cache) self.container.bind('CacheDiskDriver', CacheDiskDriver) self.container.bind('CacheManager', CacheManager(self.container)) self.container.bind('Application', self.container) diff --git a/tests/database/test_user.py b/tests/database/test_user.py index 73fcdef57..56f9d4bfc 100644 --- a/tests/database/test_user.py +++ b/tests/database/test_user.py @@ -1,6 +1,6 @@ """Example Database Testcase.""" -from masonite.testing import TestCase +from src.masonite.testing import TestCase from app.User import User from config.factories import factory diff --git a/tests/helpers/test_clean_request_input.py b/tests/helpers/test_clean_request_input.py index c871fb074..838a274d5 100644 --- a/tests/helpers/test_clean_request_input.py +++ b/tests/helpers/test_clean_request_input.py @@ -1,7 +1,7 @@ import cgi import unittest -from masonite.helpers import clean_request_input +from src.masonite.helpers import clean_request_input class TestCleanRequestInput(unittest.TestCase): diff --git a/tests/helpers/test_collect.py b/tests/helpers/test_collect.py index 82a570f83..e8a8c7843 100644 --- a/tests/helpers/test_collect.py +++ b/tests/helpers/test_collect.py @@ -1,4 +1,4 @@ -from masonite.helpers import collect +from src.masonite.helpers import collect class TestCollect: diff --git a/tests/helpers/test_compact.py b/tests/helpers/test_compact.py index 3290b147f..522d96356 100644 --- a/tests/helpers/test_compact.py +++ b/tests/helpers/test_compact.py @@ -1,6 +1,6 @@ -from masonite.helpers import compact -from masonite.request import Request -from masonite.exceptions import AmbiguousError +from src.masonite.helpers import compact +from src.masonite.request import Request +from src.masonite.exceptions import AmbiguousError import unittest diff --git a/tests/helpers/test_config.py b/tests/helpers/test_config.py index 2330090b0..0dbf7f611 100644 --- a/tests/helpers/test_config.py +++ b/tests/helpers/test_config.py @@ -1,7 +1,7 @@ import unittest -from masonite.helpers import Dot, config +from src.masonite.helpers import Dot, config from config import database diff --git a/tests/helpers/test_dot_notation.py b/tests/helpers/test_dot_notation.py index 3d5f5dab5..9d6000beb 100644 --- a/tests/helpers/test_dot_notation.py +++ b/tests/helpers/test_dot_notation.py @@ -1,6 +1,6 @@ import unittest -from masonite.helpers import dot, Dot as DictDot +from src.masonite.helpers import dot, Dot as DictDot class TestDot(unittest.TestCase): diff --git a/tests/helpers/test_filesystem.py b/tests/helpers/test_filesystem.py index fd27f3cdb..f42df0c72 100644 --- a/tests/helpers/test_filesystem.py +++ b/tests/helpers/test_filesystem.py @@ -1,6 +1,6 @@ import shutil -from masonite.helpers.filesystem import make_directory +from src.masonite.helpers.filesystem import make_directory import unittest diff --git a/tests/helpers/test_instead_of.py b/tests/helpers/test_instead_of.py index 6a4f7f10f..3c8ede614 100644 --- a/tests/helpers/test_instead_of.py +++ b/tests/helpers/test_instead_of.py @@ -1,4 +1,4 @@ -from masonite.request import Request +from src.masonite.request import Request import unittest diff --git a/tests/helpers/test_optional.py b/tests/helpers/test_optional.py index 3d3d86c70..abbf85fc4 100644 --- a/tests/helpers/test_optional.py +++ b/tests/helpers/test_optional.py @@ -1,4 +1,4 @@ -from masonite.helpers import optional +from src.masonite.helpers import optional import unittest diff --git a/tests/helpers/test_password.py b/tests/helpers/test_password.py index d78223606..97188a3f0 100644 --- a/tests/helpers/test_password.py +++ b/tests/helpers/test_password.py @@ -1,4 +1,4 @@ -from masonite.helpers import password +from src.masonite.helpers import password import unittest diff --git a/tests/helpers/test_view_helpers.py b/tests/helpers/test_view_helpers.py index ef7b7f9ae..14f936664 100644 --- a/tests/helpers/test_view_helpers.py +++ b/tests/helpers/test_view_helpers.py @@ -1,11 +1,11 @@ import unittest -from masonite.app import App -from masonite.providers import HelpersProvider -from masonite.request import Request -from masonite.testsuite import generate_wsgi -from masonite.view import View +from src.masonite.app import App +from src.masonite.providers import HelpersProvider +from src.masonite.request import Request +from src.masonite.testing import generate_wsgi +from src.masonite.view import View class TestViewHelpers(unittest.TestCase): diff --git a/tests/listeners/test_exception_listener.py b/tests/listeners/test_exception_listener.py index ae21c4f91..d8579aefa 100644 --- a/tests/listeners/test_exception_listener.py +++ b/tests/listeners/test_exception_listener.py @@ -1,6 +1,6 @@ -from masonite.testing import TestCase -from masonite.request import Request -from masonite.listeners import BaseExceptionListener +from src.masonite.testing import TestCase +from src.masonite.request import Request +from src.masonite.listeners import BaseExceptionListener from routes.web import ROUTES class ExceptionListener(BaseExceptionListener): diff --git a/tests/middleware/test_cors_middleware.py b/tests/middleware/test_cors_middleware.py index 6897c9a4f..99fb5c854 100644 --- a/tests/middleware/test_cors_middleware.py +++ b/tests/middleware/test_cors_middleware.py @@ -1,18 +1,16 @@ -from masonite.middleware import CorsMiddleware -from masonite.request import Request -from masonite.testsuite import generate_wsgi, TestSuite +from src.masonite.middleware import CorsMiddleware +from src.masonite.request import Request +from src.masonite.testing import generate_wsgi, TestCase -import unittest -class TestCorsMiddleware(unittest.TestCase): +class TestCorsMiddleware(TestCase): def setUp(self): - self.request = Request(generate_wsgi()) - self.middleware = CorsMiddleware(self.request) - self.app = TestSuite().create_container().container - self.app.bind('Request', self.request.load_app(self.app)) - self.request = self.app.make('Request') + super().setUp() + self.container.bind('Request', Request(generate_wsgi()).load_app(self.container)) + self.request = self.container.make('Request') + self.middleware = self.container.resolve(CorsMiddleware) def test_secure_headers_middleware(self): self.middleware.CORS = {"Access-Control-Allow-Origin": "*"} diff --git a/tests/middleware/test_csrf_middleware.py b/tests/middleware/test_csrf_middleware.py index dbdcb1f7f..5918c18e3 100644 --- a/tests/middleware/test_csrf_middleware.py +++ b/tests/middleware/test_csrf_middleware.py @@ -1,80 +1,68 @@ -from masonite.request import Request -from masonite.view import View -from masonite.auth.Csrf import Csrf -from masonite.app import App -from masonite.middleware import CsrfMiddleware -from masonite.testsuite.TestSuite import generate_wsgi -from masonite.exceptions import InvalidCSRFToken -from masonite.routes import Get, Route -import unittest +from src.masonite.middleware import CsrfMiddleware +from src.masonite.exceptions import InvalidCSRFToken +from src.masonite.routes import Get, Post +from src.masonite.testing import TestCase -class TestCSRFMiddleware(unittest.TestCase): +class TestCSRFMiddleware(TestCase): def setUp(self): - self.app = App() - wsgi = generate_wsgi() - self.request = Request(wsgi) - self.route = Route().load_environ(wsgi) - self.view = View(self.app) - self.app.bind('Request', self.request) - - self.request = self.app.make('Request') - self.app.bind('WebRoutes', [ - Get().route('/test/@route', None), - Get().route('/test/10', None), + super().setUp() + self.buildOwnContainer() + self.middleware = CsrfMiddleware + self.withHttpMiddleware([ + self.middleware, + ]) + self.routes(only=[ + Post('/test/@route', 'TestController@show'), + Get('/test/10', 'TestController@show'), + Post('/', 'TestController@show'), ]) - self.request.container = self.app - self.middleware = CsrfMiddleware(self.request, Csrf(self.request), self.view) + self.withCsrf() def test_middleware_shares_correct_input(self): - self.middleware.before() - self.assertIn('csrf_field', self.view._shared) - self.assertTrue(self.view._shared['csrf_field'].startswith("