def test_registration_ok(self):
        '''This test case ensures all resources are registered correctly.'''

        registrator = ResourcesRegistrator(
            Mock(),
            file_patterns=["simple_resource.py"],
            folder_pattern=["tests/"])

        root_folder = instantiator.get_class_abslocation(SettingsFacade)

        registrator.register_resources(root_folder)

        registry = ResourcesRegistry()
        resource = registry.find_by_name("Simple Resource")

        self.assertIsNotNone(resource)
        self.assertEqual(resource.name, "Simple Resource")
        self.assertEqual(resource.version, 1.0)
        self.assertEqual(resource.url, "/simple-resources")
        self.assertEqual(resource.subresources, {"address": ["address_id"]})

        model = resource.model

        self.assertIsNotNone(model)

        from fantastico.roa.tests.simple_resource import SimpleResource

        self.assertEqual(model, SimpleResource)
예제 #2
0
    def test_conf_generated_ok(self):
        '''This test case ensures configuration file is generated correctly and added to nginx enabled sites.'''

        self._args.extend([
            "--ipaddress", "127.0.0.1", "--vhost-name", "test-app.com",
            "--uwsgi-port", "12090", "--root-folder", "/test/folder/vhost",
            "--modules-folder", "/"
        ])

        root_folder = os.path.abspath(
            instantiator.get_class_abslocation(BasicSettings) + "../")

        tpl_loader = FileSystemLoader(searchpath=root_folder)
        tpl_env = Environment(loader=tpl_loader)

        config_data = {
            "ip_address": "127.0.0.1",
            "vhost_name": "test-app.com",
            "http_port": 80,
            "uwsgi_port": 12090,
            "root_folder": "/test/folder/vhost",
            "modules_folder": "/"
        }

        expected_config = tpl_env.get_template(
            "/deployment/conf/nginx/fantastico-wsgi").render(config_data)

        config = self._config_nginx(self._args)

        self.assertEqual(expected_config, config)
예제 #3
0
 def test_conf_generated_ok(self):
     '''This test case ensures configuration file is generated correctly and added to nginx enabled sites.'''
     
     self._args.extend([
                        "--ipaddress", "127.0.0.1",
                        "--vhost-name", "test-app.com",
                        "--uwsgi-port", "12090",
                        "--root-folder", "/test/folder/vhost",
                        "--modules-folder", "/"])
     
     root_folder = os.path.abspath(instantiator.get_class_abslocation(BasicSettings) + "../")        
     
     tpl_loader = FileSystemLoader(searchpath=root_folder)
     tpl_env = Environment(loader=tpl_loader)
     
     config_data = {"ip_address": "127.0.0.1",
                    "vhost_name": "test-app.com",
                    "http_port": 80,
                    "uwsgi_port": 12090,
                    "root_folder": "/test/folder/vhost",
                    "modules_folder": "/"}
     
     expected_config = tpl_env.get_template("/deployment/conf/nginx/fantastico-wsgi").render(config_data)
     
     config = self._config_nginx(self._args)
     
     self.assertEqual(expected_config, config)
예제 #4
0
    def serve_asset(self, request, component_name, asset_path, **kwargs):
        '''This method is invoked whenever a request to a static asset is done.'''

        file_path = "%s%s/%s/%s" % (instantiator.get_class_abslocation(
            self._settings_facade.get_config().__class__), component_name,
                                    self.static_folder, asset_path)
        err_content_type = "text/html; charset=UTF-8"

        if not component_name or len(component_name.strip()) == 0:
            return Response(status=400,
                            content_type=err_content_type,
                            text="No component name provided.")

        if not asset_path or len(asset_path.strip()) == 0:
            return Response(status=400,
                            content_type=err_content_type,
                            text="No asset path provided.")

        os_provider = kwargs.get("os_provider") or os

        if not self._is_asset_available(file_path, os_provider):
            return Response(status=404,
                            content_type=err_content_type,
                            text="Asset %s not found." % file_path)

        return self._load_file_from_disk(request, file_path, **kwargs)
예제 #5
0
    def test_config_generation_ok(self):
        '''This test case ensures config nginx script works as expected.'''

        settings_cls = SettingsFacade

        root_folder = os.path.abspath(instantiator.get_class_abslocation(settings_cls) + "../")

        tpl_loader = FileSystemLoader(searchpath=root_folder)
        tpl_env = Environment(loader=tpl_loader)

        config_data = {"ip_address": "127.0.0.1",
                   "vhost_name": "test-app.com",
                   "http_port": 80,
                   "uwsgi_port": 12090,
                   "root_folder": "/test/folder/vhost",
                   "modules_folder": "/"}

        expected_config = tpl_env.get_template("/deployment/conf/nginx/fantastico-wsgi").render(config_data)

        sys.argv = ["config_nginx.py",
                    "--ipaddress", "127.0.0.1",
                    "--vhost-name", "test-app.com",
                    "--uwsgi-port", "12090",
                    "--root-folder", "/test/folder/vhost",
                    "--modules-folder", "/"]

        from fantastico.deployment import config_nginx

        generated_config = StringIO()

        config_nginx.main(generated_config)

        self.assertEqual(expected_config, generated_config.getvalue())
예제 #6
0
    def __init__(self,
                 environment,
                 url_invoker_cls=FantasticoUrlInternalInvoker):
        super(Component, self).__init__(environment)

        self._url_invoker_cls = url_invoker_cls
        self._comp_search_path = instantiator.get_class_abslocation(Component)
예제 #7
0
    def load_template(self, tpl_name, model_data=None, get_template=Environment.get_template, enable_global_folder=False):
        '''This method is responsible for loading a template from disk and render it using the given model data.

        .. code-block:: python

            @ControllerProvider()
            class TestController(BaseController):
                @Controller(url="/simple/test/hello", method="GET")
                def say_hello(self, request):
                    return Response(self.load_template("/hello.html"))

        The above snippet will search for **hello.html** into component folder/views/.
        '''

        if self._tpl_env is None:
            self.__init_jinja_context()

        model_data = model_data or {}

        if enable_global_folder:
            config_cls = self._settings_facade.get_config().__class__
            parent_path = instantiator.get_class_abslocation(config_cls)

            if config_cls != BasicSettings:
                parent_path = os.path.abspath("%s../" % parent_path)

            if parent_path not in self._tpl_loader.searchpath:
                self._tpl_loader.searchpath.append(parent_path)

        try:
            return get_template(self._tpl_env, tpl_name).render(model_data)
        except TemplateNotFound as ex:
            raise FantasticoTemplateNotFoundError(ex)
        except Exception as ex:
            raise FantasticoError(ex)
    def test_registration_ok(self):
        '''This test case ensures all resources are registered correctly.'''

        registrator = ResourcesRegistrator(Mock(), file_patterns=["simple_resource.py"], folder_pattern=["tests/"])

        root_folder = instantiator.get_class_abslocation(SettingsFacade)

        registrator.register_resources(root_folder)

        registry = ResourcesRegistry()
        resource = registry.find_by_name("Simple Resource")

        self.assertIsNotNone(resource)
        self.assertEqual(resource.name, "Simple Resource")
        self.assertEqual(resource.version, 1.0)
        self.assertEqual(resource.url, "/simple-resources")
        self.assertEqual(resource.subresources, {"address": ["address_id"]})

        model = resource.model

        self.assertIsNotNone(model)

        from fantastico.roa.tests.simple_resource import SimpleResource

        self.assertEqual(model, SimpleResource)
예제 #9
0
        def start_server():
            root_folder = os.path.realpath(instantiator.get_class_abslocation(ProdServerIntegration) + "/../../../") + "/"
            start_prod_server = ["%srun_prod_server.sh" % root_folder]

            self._server_proc = Popen(start_prod_server, cwd=root_folder, env=os.environ,
                                      stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            
            self._server_proc.communicate()
예제 #10
0
    def __init__(self):
        self._args_parser = ArgumentParser(description="This script generates an nginx vhost file for the" +
                                           " current fantastico project.")

        root_folder = os.path.abspath(instantiator.get_class_abslocation(BasicSettings) + "../")
        
        tpl_loader = FileSystemLoader(searchpath=root_folder)
        self._tpl_env = Environment(loader=tpl_loader)        
        
        self._build_args_parser()
    def init(self):
        from fantastico.mvc.controller_registrator import ControllerRouteLoader

        self._settings_facade = Mock()
        self._settings_facade.get_config = Mock(return_value=settings.BasicSettings())
        self._settings_facade.get = Mock(return_value=["fantastico.locale"])

        self._route_loader = ControllerRouteLoader(settings_facade=self._settings_facade,
                                                   scanned_folder=instantiator.get_class_abslocation(ControllerRouteLoaderTests))

        self._settings_facade.get.assert_called_once_with("mvc_additional_paths")
예제 #12
0
    def load_routes(self):
        '''This method simple triggers resources registration and returns empty routes. Using this mechanism guarantees that
        routing engine will also discover ROA resources.'''

        active_config = self._settings_facade.get_config().__class__

        root_folder = instantiator.get_class_abslocation(active_config)

        self.register_resources(root_folder)

        return {}
예제 #13
0
    def load_routes(self):
        '''This method simple triggers resources registration and returns empty routes. Using this mechanism guarantees that
        routing engine will also discover ROA resources.'''

        active_config = self._settings_facade.get_config().__class__

        root_folder = instantiator.get_class_abslocation(active_config)

        self.register_resources(root_folder)

        return {}
예제 #14
0
    def __init__(self):
        self._args_parser = ArgumentParser(
            description="This script generates an nginx vhost file for the" +
            " current fantastico project.")

        root_folder = os.path.abspath(
            instantiator.get_class_abslocation(BasicSettings) + "../")

        tpl_loader = FileSystemLoader(searchpath=root_folder)
        self._tpl_env = Environment(loader=tpl_loader)

        self._build_args_parser()
예제 #15
0
    def handle_favicon(self, request, **kwargs):
        '''This method is used to handle favicon requests coming from browsers.'''

        os_provider = kwargs.get("os_provider") or os

        file_path = "%sstatic/%s" % (instantiator.get_class_abslocation(
            self._settings_facade.get_config().__class__), "favicon.ico")

        if not os_provider.path.exists(file_path):
            return Response(app_iter=[], content_type="image/x-icon")

        return self._load_file_from_disk(request, file_path, **kwargs)
    def handle_favicon(self, request, **kwargs):
        '''This method is used to handle favicon requests coming from browsers.'''
        
        os_provider = kwargs.get("os_provider") or os

        file_path = "%sstatic/%s" % (instantiator.get_class_abslocation(self._settings_facade.get_config().__class__), 
                                 "favicon.ico")
        
        if not os_provider.path.exists(file_path):
            return Response(app_iter=[], content_type="image/x-icon")
        
        return self._load_file_from_disk(request, file_path, **kwargs)
예제 #17
0
    def __init__(self, settings_facade=SettingsFacade, scanned_folder=None, ignore_prefix=None):
        super(ControllerRouteLoader, self).__init__(settings_facade)

        self._scanned_folder = scanned_folder or instantiator.get_class_abslocation(
            self._settings_facade.get_config().__class__
        )

        custom_packages = self._settings_facade.get("mvc_additional_paths")

        folders = self._get_custom_packages_filelist(custom_packages)
        folders.add(self._scanned_folder)

        self._folders = list(folders)

        self._ignore_prefix = ignore_prefix or ["__init__", "__pycache__", "tests", "test", "itest"]
    def init(self):
        from fantastico.mvc.controller_registrator import ControllerRouteLoader

        self._settings_facade = Mock()
        self._settings_facade.get_config = Mock(
            return_value=settings.BasicSettings())
        self._settings_facade.get = Mock(return_value=["fantastico.locale"])

        self._route_loader = ControllerRouteLoader(
            settings_facade=self._settings_facade,
            scanned_folder=instantiator.get_class_abslocation(
                ControllerRouteLoaderTests))

        self._settings_facade.get.assert_called_once_with(
            "mvc_additional_paths")
    def test_loadroutes_ok(self):
        '''This test case ensures loadroutes method first scans all files for resources and then returns an empty dictionary
        of routes.'''

        expected_path = instantiator.get_class_abslocation(self.__class__)

        settings_facade = Mock()
        settings_facade.get_config = lambda: self

        registrator = ResourcesRegistrator(settings_facade)

        registrator.register_resources = Mock()

        self.assertEqual(registrator.load_routes(), {})

        registrator.register_resources.assert_called_once_with(expected_path)
    def test_loadroutes_ok(self):
        '''This test case ensures loadroutes method first scans all files for resources and then returns an empty dictionary
        of routes.'''

        expected_path = instantiator.get_class_abslocation(self.__class__)

        settings_facade = Mock()
        settings_facade.get_config = lambda: self

        registrator = ResourcesRegistrator(settings_facade)

        registrator.register_resources = Mock()

        self.assertEqual(registrator.load_routes(), {})

        registrator.register_resources.assert_called_once_with(expected_path)
예제 #21
0
    def __init__(self,
                 settings_facade=SettingsFacade,
                 scanned_folder=None,
                 ignore_prefix=None):
        super(ControllerRouteLoader, self).__init__(settings_facade)

        self._scanned_folder = scanned_folder or instantiator.get_class_abslocation(
            self._settings_facade.get_config().__class__)

        custom_packages = self._settings_facade.get("mvc_additional_paths")

        folders = self._get_custom_packages_filelist(custom_packages)
        folders.add(self._scanned_folder)

        self._folders = list(folders)

        self._ignore_prefix = ignore_prefix or [
            "__init__", "__pycache__", "tests", "test", "itest"
        ]
예제 #22
0
    def _register_subcommands(self, supported_prefixes):
        '''This methods loads all available subcommands from sdk and build _arguments supported by fantastico sdk directly.'''
        def is_file_supported(filename):
            '''This method decides if a filename is supported as possible subcommand provider module or not.'''

            for prefix in supported_prefixes:
                if filename.startswith(prefix):
                    return True

            return False

        local_folder = "%s%s/" % (instantiator.get_class_abslocation(SdkCore),
                                  SdkCore._COMMANDS_FOLDER)

        instantiator.import_modules_from_folder(
            local_folder, lambda folder, filename: is_file_supported(filename),
            self._settings_facade)

        self._register_root_subcommands()
    def serve_asset(self, request, component_name, asset_path, **kwargs):
        '''This method is invoked whenever a request to a static asset is done.'''

        file_path = "%s%s/%s/%s" % (instantiator.get_class_abslocation(self._settings_facade.get_config().__class__), 
                                    component_name, self.static_folder, asset_path)
        err_content_type = "text/html; charset=UTF-8"
        
        if not component_name or len(component_name.strip()) == 0:
            return Response(status=400, content_type=err_content_type, text="No component name provided.")
        
        if not asset_path or len(asset_path.strip()) == 0:
            return Response(status=400, content_type=err_content_type, text="No asset path provided.")
        
        os_provider = kwargs.get("os_provider") or os        
        
        if not self._is_asset_available(file_path, os_provider):
            return Response(status=404, content_type=err_content_type, text="Asset %s not found." % file_path)
         
        return self._load_file_from_disk(request, file_path, **kwargs)
예제 #24
0
    def _register_subcommands(self, supported_prefixes):
        '''This methods loads all available subcommands from sdk and build _arguments supported by fantastico sdk directly.'''

        def is_file_supported(filename):
            '''This method decides if a filename is supported as possible subcommand provider module or not.'''

            for prefix in supported_prefixes:
                if filename.startswith(prefix):
                    return True

            return False

        local_folder = "%s%s/" % (instantiator.get_class_abslocation(SdkCore), SdkCore._COMMANDS_FOLDER)

        instantiator.import_modules_from_folder(local_folder,
                                                lambda folder, filename: is_file_supported(filename),
                                                self._settings_facade)

        self._register_root_subcommands()
 def init(self):
     self._response = None
     self._root_folder = os.path.realpath(instantiator.get_class_abslocation(BasicSettings))
예제 #26
0
 def init(self):
     self._response = None
     self._root_folder = os.path.realpath(
         instantiator.get_class_abslocation(BasicSettings))
예제 #27
0
    def __init__(self, environment, url_invoker_cls=FantasticoUrlInternalInvoker):
        super(Component, self).__init__(environment)

        self._url_invoker_cls = url_invoker_cls
        self._comp_search_path = instantiator.get_class_abslocation(Component)
예제 #28
0
    def init(self):
        '''This method is executed before each test case in order to setup common dependencies.'''

        self._comp_root = instantiator.get_class_abslocation(BasicSettings)
예제 #29
0
    def init(self):
        '''This method is executed before each test case in order to setup common dependencies.'''

        self._comp_root = instantiator.get_class_abslocation(BasicSettings)