def test_manual_construction_parent_interactions(self):
        self.assertTrue(ModuleLoaderRegistry(
            'calmjs.module.loader', _working_set=WorkingSet({})))

        # forcibly stub out the real calmjs.module
        self.addCleanup(root_registry.records.pop, 'calmjs.module')
        root_registry.records['calmjs.module'] = None

        with self.assertRaises(ValueError) as e:
            ModuleLoaderRegistry(
                'calmjs.module.loader', _working_set=WorkingSet({}))
        self.assertEqual(
            "could not construct child module registry 'calmjs.module.loader' "
            "as its parent registry 'calmjs.module' could not be found",
            str(e.exception)
        )
 def test_to_plugin_name(self):
     registry = LoaderPluginRegistry(
         'calmjs.loader_plugin', _working_set=WorkingSet({}))
     self.assertEqual('example', registry.to_plugin_name('example'))
     self.assertEqual('example', registry.to_plugin_name('example?hi'))
     self.assertEqual('example', registry.to_plugin_name('example!hi'))
     self.assertEqual('example', registry.to_plugin_name('example?arg!hi'))
 def test_initialize_warning_dupe_plugin(self):
     # ensure that we have a proper working registry
     working_set = WorkingSet({'calmjs.loader_plugin': [
         'example = calmjs.tests.test_loaderplugin:DupePlugin',
         'example = calmjs.loaderplugin:NPMLoaderPluginHandler',
     ]})
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry(
             'calmjs.loader_plugin', _working_set=working_set)
     self.assertIn(
         "loader plugin handler for 'example' was already registered to an "
         "instance of 'calmjs.tests.test_loaderplugin:DupePlugin'",
         stream.getvalue()
     )
     # the second one will be registered
     self.assertTrue(
         isinstance(registry.get('example'), LoaderPluginHandler))
     # ensure that the handler can be acquired from a full name
     self.assertEqual('example', registry.get('example!hi').name)
     self.assertEqual('example', registry.get('example?arg!hi').name)
     self.assertEqual('example', registry.get('example?arg').name)
     self.assertIsNone(registry.get('examplearg'))
     self.assertIsNone(registry.get('ex'))
     self.assertIsNone(registry.get('ex!ample'))
    def test_plugin_loaders_modname_source_to_target(self):
        class InterceptHandler(LoaderPluginHandler):
            def modname_source_to_target(self, *a, **kw):
                # failed to inspect and call parent
                return 'intercepted'

        reg = LoaderPluginRegistry('simloaders', _working_set=WorkingSet({}))
        base = reg.records['base'] = LoaderPluginHandler(reg, 'base')
        extra = reg.records['extra'] = LoaderPluginHandler(reg, 'extra')
        reg.records['intercept'] = InterceptHandler(reg, 'intercept')
        toolchain = NullToolchain()
        spec = Spec()
        self.assertEqual('fun.file', base.modname_source_to_target(
            toolchain, spec, 'base!fun.file', '/some/path/fun.file'))
        self.assertEqual('fun.file', extra.modname_source_to_target(
            toolchain, spec, 'extra!fun.file', '/some/path/fun.file'))
        self.assertEqual('fun.file', base.modname_source_to_target(
            toolchain, spec, 'extra!base!fun.file', '/some/path/fun.file'))
        # no plugin was found, so no modification
        self.assertEqual('noplugin!fun.file', base.modname_source_to_target(
            toolchain, spec, 'extra!noplugin!fun.file', '/some/path/fun.file'))
        # chained of the same type
        self.assertEqual('fun.file', base.modname_source_to_target(
            toolchain, spec, 'base!base!base!fun.file',
            '/some/path/fun.file'))
        # chained but overloaded
        self.assertEqual('intercepted', base.modname_source_to_target(
            toolchain, spec, 'base!intercept!base!fun.file',
            '/some/path/fun.file'))
    def test_module_loader_registry_integration(self):
        working_set = WorkingSet({
            'calmjs.module': [
                'module4 = calmjs.testing.module4',
            ],
            'calmjs.module.loader': [
                'css = css[style]',
            ],
            __name__: [
                'calmjs.module = calmjs.module:ModuleRegistry',
                'calmjs.module.loader = '
                'calmjs.loaderplugin:ModuleLoaderRegistry',
            ]},
            dist=Distribution(project_name='calmjs.testing', version='0.0')
        )
        stub_mod_working_set(self, [calmjs.base], working_set)

        # Not going to use the global registry, and using our custom
        # reservation entry
        local_root_registry = Registry(
            __name__, 'calmjs.testing', _working_set=working_set)

        with pretty_logging(stream=StringIO()):
            # silences "distribution 'calmjs.testing 0.0' not found"
            # warnings from stdout produced by the indexer, as the
            # provided working_set is invalid with entry points that do
            # not have a valid distribution.
            module_registry = root_registry_get('calmjs.module')
            module_loader_registry = root_registry_get('calmjs.module.loader')
            registry = local_root_registry.get_record('calmjs.module')
            loader_registry = local_root_registry.get_record(
                'calmjs.module.loader')

        self.assertIsNot(registry, module_registry)
        self.assertIsNot(loader_registry, module_loader_registry)
        self.assertEqual(
            sorted(k for k, v in registry.iter_records()), [
                'calmjs.testing.module4',
            ]
        )

        # test the basic items.
        results = registry.get_records_for_package('calmjs.testing')
        self.assertEqual(sorted(results.keys()), [
           'calmjs/testing/module4/widget',
        ])

        module4 = registry.get_record('calmjs.testing.module4')
        self.assertIn('calmjs/testing/module4/widget', module4)

        self.assertEqual({
            'css!calmjs/testing/module4/widget.style': resource_filename(
                'calmjs.testing', join('module4', 'widget.style')),
        }, loader_registry.get_records_for_package('calmjs.testing'))

        self.assertEqual(
            ['css'],
            loader_registry.get_loaders_for_package('calmjs.testing')
        )
Exemple #6
0
 def setUp(self):
     working_set = WorkingSet({
         'calmjs.rjs.loader_plugin': [
             'text = calmjs.rjs.plugin:TextPlugin',
         ]
     })
     self.registry = LoaderPluginRegistry('calmjs.rjs.loader_plugin',
                                          _working_set=working_set)
Exemple #7
0
 def test_initialize_standard(self):
     # ensure that we have a proper working registry
     working_set = WorkingSet({
         'calmjs.rjs.loader_plugin': [
             'text = calmjs.rjs.plugin:TextPlugin',
         ]
     })
     registry = LoaderPluginRegistry('calmjs.rjs.loader_plugin',
                                     _working_set=working_set)
     self.assertTrue(isinstance(registry.get('text'), TextPlugin))
 def test_initialize_standard(self):
     # ensure that we have a proper working registry
     working_set = WorkingSet({'calmjs.loader_plugin': [
         'example = calmjs.loaderplugin:LoaderPluginHandler',
     ]})
     registry = LoaderPluginRegistry(
         'calmjs.loader_plugin', _working_set=working_set)
     plugin = registry.get('example')
     self.assertTrue(isinstance(plugin, LoaderPluginHandler))
     self.assertEqual({}, plugin.generate_handler_sourcepath(
         NullToolchain(), Spec(), {}))
 def test_initialize_failure_missing(self):
     working_set = WorkingSet({'calmjs.loader_plugin': [
         'not_plugin = calmjs.not_plugin:nothing',
     ]})
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry(
             'calmjs.loader_plugin', _working_set=working_set)
     self.assertIsNone(registry.get('not_plugin'))
     self.assertIn(
         "registry 'calmjs.loader_plugin' failed to load loader plugin "
         "handler for entry point 'not_plugin =", stream.getvalue(),
     )
    def test_plugin_loaders_modname_source_to_target_identity(self):
        # manually create a registry
        reg = LoaderPluginRegistry('simloaders', _working_set=WorkingSet({}))
        base = reg.records['local/dev'] = LoaderPluginHandler(reg, 'local/dev')
        toolchain = NullToolchain()
        spec = Spec()

        self.assertEqual('fun.file', base.modname_source_to_target(
            toolchain, spec, 'local/dev!fun.file',
            '/some/path/fun.file'))
        # a redundant usage test
        self.assertEqual('local/dev', base.modname_source_to_target(
            toolchain, spec, 'local/dev',
            '/some/path/to/the/plugin'))
 def test_plugin_generate_handler_sourcepath_resolved_registry(self):
     base = LoaderPluginHandler(None, 'base')
     reg = LoaderPluginRegistry('loaders', _working_set=WorkingSet({}))
     toolchain = NullToolchain()
     spec = Spec(
         working_dir=mkdtemp(self), calmjs_loaderplugin_registry=reg)
     with pretty_logging(stream=StringIO()) as stream:
         self.assertEqual(
             base.generate_handler_sourcepath(toolchain, spec, {
                 'base!bad': 'base!bad',
             }), {})
     self.assertIn(
         "loaderplugin registry 'loaders' already assigned to spec",
         stream.getvalue())
 def test_initialize_failure_not_plugin(self):
     working_set = WorkingSet({'calmjs.loader_plugin': [
         'not_plugin = calmjs.tests.test_loaderplugin:NotPlugin',
     ]})
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry(
             'calmjs.loader_plugin', _working_set=working_set)
     self.assertIsNone(registry.get('not_plugin'))
     self.assertIn(
         "'not_plugin = calmjs.tests.test_loaderplugin:NotPlugin' does not "
         "lead to a valid loader plugin handler class",
         stream.getvalue()
     )
 def test_initialize_failure_bad_plugin(self):
     working_set = WorkingSet({'calmjs.loader_plugin': [
         'bad_plugin = calmjs.tests.test_loaderplugin:BadPlugin',
     ]}, dist=Distribution(project_name='plugin', version='1.0'))
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry(
             'calmjs.loader_plugin', _working_set=working_set)
     self.assertIsNone(registry.get('bad_plugin'))
     self.assertIn(
         "registration of entry point "
         "'bad_plugin = calmjs.tests.test_loaderplugin:BadPlugin' from "
         "'plugin 1.0' to registry 'calmjs.loader_plugin' failed",
         stream.getvalue()
     )
Exemple #14
0
    def test_build_bundle_with_data(self):
        bundle_dir = utils.mkdtemp(self)
        build_dir = utils.mkdtemp(self)
        transpile_source_map = {}
        transpile_source_map.update(self._example_package_map)
        # include custom loader and data
        transpile_source_map.update(self._example_package_loader)
        bundle_source_map = {}
        export_target = join(bundle_dir, 'example.package')
        requirejs_plugins = {
            'example/package/loader': self._example_package_data
        }

        custom_registry = LoaderPluginRegistry(
            'custom', _working_set=WorkingSet({
                'custom': [
                    'example/package/loader = calmjs.rjs.plugin:TextPlugin']})
        )
        rjs = toolchain.RJSToolchain()
        rjs.loader_plugin_registry = custom_registry
        spec = Spec(
            transpile_source_map=transpile_source_map,
            bundle_source_map=bundle_source_map,
            requirejs_plugins=requirejs_plugins,
            export_target=export_target,
            build_dir=build_dir,
        )

        with pretty_logging(stream=StringIO()):
            # to avoid logging the issue of mismatch map to extension
            # to stderr.
            rjs(spec)

        self.assertTrue(exists(export_target))

        # verify that the bundle works with node
        stdout, stderr = run_node(
            'var requirejs = require("requirejs");\n'
            'var define = requirejs.define;\n'
            '%s\n'
            'var result = requirejs(\n'
            '    "example/package/loader!example/package/data");\n'
            'process.stdout.write("" + result.results.item_count);\n',
            export_target,
        )

        self.assertEqual(stderr, '')
        self.assertEqual(stdout, '0')
Exemple #15
0
 def test_initialize_failure_bad_plugin(self):
     working_set = WorkingSet({
         'calmjs.rjs.loader_plugin': [
             'bad_plugin = calmjs.rjs.tests.test_registry:BadPlugin',
         ]
     })
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry('calmjs.rjs.loader_plugin',
                                         _working_set=working_set)
     self.assertIsNone(registry.get('bad_plugin'))
     self.assertIn(
         "the loader plugin class registered at 'bad_plugin = "
         "calmjs.rjs.tests.test_registry:BadPlugin' failed "
         "to be instantiated with the following exception",
         stream.getvalue())
Exemple #16
0
 def test_initialize_warning_dupe_plugin(self):
     # ensure that we have a proper working registry
     working_set = WorkingSet({
         'calmjs.rjs.loader_plugin': [
             'text = calmjs.rjs.tests.test_registry:DupePlugin',
             'text = calmjs.rjs.plugin:TextPlugin',
         ]
     })
     # should not trigger import failure
     with pretty_logging(stream=StringIO()) as stream:
         registry = LoaderPluginRegistry('calmjs.rjs.loader_plugin',
                                         _working_set=working_set)
     self.assertIn(
         "loader plugin handler for 'text' was already registered to an "
         "instance of 'calmjs.rjs.tests.test_registry:DupePlugin'",
         stream.getvalue())
     # the second one will be registered
     self.assertTrue(isinstance(registry.get('text'), TextPlugin))
    def create_base_extra_plugins(self, working_dir):
        # manually create a registry
        reg = LoaderPluginRegistry('simloaders', _working_set=WorkingSet({}))
        base = reg.records['base'] = NPMLoaderPluginHandler(reg, 'base')
        base.node_module_pkg_name = 'dummy_pkg1'
        extra = reg.records['extra'] = NPMLoaderPluginHandler(reg, 'extra')
        extra.node_module_pkg_name = 'dummy_pkg2'

        pkg_dir1 = join(working_dir, 'node_modules', 'dummy_pkg1')
        pkg_dir2 = join(working_dir, 'node_modules', 'dummy_pkg2')
        makedirs(pkg_dir1)
        makedirs(pkg_dir2)

        with open(join(pkg_dir1, 'package.json'), 'w') as fd:
            fd.write('{"main": "base.js"}')

        with open(join(pkg_dir2, 'package.json'), 'w') as fd:
            fd.write('{"main": "extra.js"}')
        return reg, base, extra, pkg_dir1, pkg_dir2
    def test_module_loader_registry_multiple_loaders(self):
        working_set = WorkingSet({
            'calmjs.module': [
                'module4 = calmjs.testing.module4',
            ],
            'calmjs.module.loader': [
                'css = css[style,css]',
                'json = json[json]',
                'empty = empty[]',
            ],
            __name__: [
                'calmjs.module = calmjs.module:ModuleRegistry',
                'calmjs.module.loader = '
                'calmjs.loaderplugin:ModuleLoaderRegistry',
            ]},
            # use a real distribution instead for this case
            dist=root_working_set.find(Requirement.parse('calmjs')),
        )

        registry = ModuleRegistry('calmjs.module', _working_set=working_set)
        loader_registry = ModuleLoaderRegistry(
            'calmjs.module.loader', _working_set=working_set, _parent=registry)
        self.assertEqual({
            'calmjs': ['calmjs.testing.module4'],
        }, loader_registry.package_module_map)

        self.assertEqual(
            ['css', 'empty', 'json'],
            sorted(loader_registry.get_loaders_for_package('calmjs'))
        )

        self.assertEqual([
            'css!calmjs/testing/module4/other.css',
            'css!calmjs/testing/module4/widget.style',
            'json!calmjs/testing/module4/data.json',
        ], sorted(loader_registry.get_records_for_package('calmjs').keys()))

        # was not registered to calmjs.testing
        self.assertEqual([], loader_registry.get_loaders_for_package(
            'calmjs.testing'))
        self.assertEqual({}, loader_registry.get_records_for_package(
            'calmjs.testing'))
Exemple #19
0
    def test_module_loader_registry_multiple_loaders(self):
        working_set = WorkingSet(
            {
                'calmjs.module': [
                    'module4 = calmjs.testing.module4',
                ],
                'calmjs.module.webpackloader': [
                    'style!css = css[css]',
                    'json = json[json]',
                ],
                __name__: [
                    'calmjs.module = calmjs.module:ModuleRegistry',
                    'calmjs.module.webpackloader = '
                    'calmjs.webpack.loaderplugin:WebpackModuleLoaderRegistry',
                ]
            },
            # use a real distribution instead for this case
            dist=root_working_set.find(Requirement.parse('calmjs')),
        )

        registry = ModuleRegistry('calmjs.module', _working_set=working_set)
        loader_registry = WebpackModuleLoaderRegistry(
            'calmjs.module.webpackloader',
            _working_set=working_set,
            _parent=registry)
        self.assertEqual({
            'calmjs': ['calmjs.testing.module4'],
        }, loader_registry.package_module_map)

        self.assertEqual(
            ['json', 'style!css'],
            sorted(loader_registry.get_loaders_for_package('calmjs')))

        self.assertEqual([
            WebpackModuleLoaderRegistryKey(
                loader='json', modname='calmjs/testing/module4/data.json'),
            WebpackModuleLoaderRegistryKey(
                loader='style!css',
                modname='calmjs/testing/module4/other.css'),
        ], sorted(loader_registry.get_records_for_package('calmjs').keys()))
    def test_plugin_package_dynamic_selection(self):

        class CustomHandler(NPMLoaderPluginHandler):
            def find_node_module_pkg_name(self, toolchain, spec):
                return spec.get('loaderplugin')

        reg = LoaderPluginRegistry('lp.reg', _working_set=WorkingSet({}))
        base = CustomHandler(reg, 'base')
        toolchain = NullToolchain()
        spec = Spec(working_dir=mkdtemp(self))
        pkg_dir = join(spec['working_dir'], 'node_modules', 'dummy_pkg')
        makedirs(pkg_dir)
        with open(join(pkg_dir, 'package.json'), 'w') as fd:
            fd.write('{"main": "base.js"}')

        with pretty_logging(stream=StringIO()) as stream:
            self.assertEqual(
                {}, base.generate_handler_sourcepath(toolchain, spec, {}))
        self.assertIn(
            "no npm package name specified or could be resolved for "
            "loaderplugin 'base' of registry 'lp.reg'",
            stream.getvalue()
        )
        self.assertIn(
            "test_loaderplugin:CustomHandler may be at fault",
            stream.getvalue()
        )
        self.assertNotIn("for loader plugin 'base'", stream.getvalue())

        # plug the value into the spec to satisfy the condition for this
        # particular loader

        spec['loaderplugin'] = 'dummy_pkg'
        with pretty_logging(stream=StringIO()) as stream:
            self.assertEqual(
                join(pkg_dir, 'base.js'),
                base.generate_handler_sourcepath(toolchain, spec, {})['base'],
            )
        self.assertIn("base.js' for loader plugin 'base'", stream.getvalue())
 def test_manual_construction_invalid_suffix_fail(self):
     with self.assertRaises(ValueError) as e:
         ModuleLoaderRegistry('some.module', _working_set=WorkingSet({}))
     self.assertEqual(
         "child module registry name defined with invalid suffix "
         "('some.module' does not end with '.loader')", str(e.exception))