mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Backed out changeset 5cb5fdb72e55 (bug 942275) for mach bustage.
CLOSED TREE DONTBUILD
This commit is contained in:
parent
67f01aceb5
commit
4fb543fa21
@ -87,7 +87,7 @@ Here is an example:
|
||||
self.build_path = build_path
|
||||
|
||||
@Command('run_tests', conditions=[build_available])
|
||||
def run_tests(self):
|
||||
def run_tests(self, force=False):
|
||||
# Do stuff here.
|
||||
|
||||
It is important to make sure that any state needed by the condition is
|
||||
@ -218,30 +218,3 @@ LoggingMixin:
|
||||
self.log(logging.INFO, 'foo_start', {'bar': True},
|
||||
'Foo performed. Bar: {bar}')
|
||||
|
||||
Entry Points
|
||||
============
|
||||
|
||||
It is possible to use setuptools' entry points to load commands
|
||||
directly from python packages. A mach entry point is a function which
|
||||
returns a list of files or directories containing mach command
|
||||
providers.
|
||||
|
||||
E.g:
|
||||
|
||||
def list_providers():
|
||||
providers = []
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
for p in os.listdir(here):
|
||||
if p.endswith('.py'):
|
||||
providers.append(os.path.join(here, p))
|
||||
return providers
|
||||
|
||||
See http://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins
|
||||
for more information on creating an entry point. To search for entry
|
||||
point plugins, you can call *load_commands_from_entry_point*. This
|
||||
takes a single parameter called *group*. This is the name of the entry
|
||||
point group to load and defaults to "mach.providers".
|
||||
|
||||
E.g:
|
||||
|
||||
mach.load_commands_from_entry_point("mach.external.providers")
|
||||
|
@ -6,14 +6,12 @@
|
||||
# (mach). It is packaged as a module because everything is a library.
|
||||
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
from collections import Iterable
|
||||
|
||||
import argparse
|
||||
import codecs
|
||||
import imp
|
||||
import logging
|
||||
import os
|
||||
import pkg_resources
|
||||
import sys
|
||||
import traceback
|
||||
import uuid
|
||||
@ -96,16 +94,6 @@ command failed to meet the following conditions: %s
|
||||
Run |mach help| to show a list of all commands available to the current context.
|
||||
'''.lstrip()
|
||||
|
||||
INVALID_ENTRY_POINT = r'''
|
||||
Entry points should return a list of command providers or directories
|
||||
containing command providers. The following entry point is invalid:
|
||||
|
||||
%s
|
||||
|
||||
You are seeing this because there is an error in an external module attempting
|
||||
to implement a mach command. Please fix the error, or uninstall the module from
|
||||
your system.
|
||||
'''.lstrip()
|
||||
|
||||
class ArgumentParser(argparse.ArgumentParser):
|
||||
"""Custom implementation argument parser to make things look pretty."""
|
||||
@ -227,28 +215,6 @@ To see more help for a specific command, run:
|
||||
|
||||
imp.load_source(module_name, path)
|
||||
|
||||
def load_commands_from_entry_point(self, group='mach.providers'):
|
||||
"""Scan installed packages for mach command provider entry points. An
|
||||
entry point is a function that returns a list of paths to files or
|
||||
directories containing command providers.
|
||||
|
||||
This takes an optional group argument which specifies the entry point
|
||||
group to use. If not specified, it defaults to 'mach.providers'.
|
||||
"""
|
||||
for entry in pkg_resources.iter_entry_points(group=group, name=None):
|
||||
paths = entry.load()()
|
||||
if not isinstance(paths, Iterable):
|
||||
print(INVALID_ENTRY_POINT % entry)
|
||||
sys.exit(1)
|
||||
|
||||
for path in paths:
|
||||
if os.path.isfile(path):
|
||||
self.load_commands_from_file(path)
|
||||
elif os.path.isdir(path):
|
||||
self.load_commands_from_directory(path)
|
||||
else:
|
||||
print("command provider '%s' does not exist" % path)
|
||||
|
||||
def define_category(self, name, title, description, priority=50):
|
||||
"""Provide a description for a named command category."""
|
||||
|
||||
|
@ -16,16 +16,12 @@ here = os.path.abspath(os.path.dirname(__file__))
|
||||
class TestBase(unittest.TestCase):
|
||||
provider_dir = os.path.join(here, 'providers')
|
||||
|
||||
def _run_mach(self, args, provider_file=None, entry_point=None, context_handler=None):
|
||||
def _run_mach(self, args, provider_file, context_handler=None):
|
||||
m = Mach(os.getcwd())
|
||||
m.define_category('testing', 'Mach unittest', 'Testing for mach core', 10)
|
||||
m.populate_context_handler = context_handler
|
||||
|
||||
if provider_file:
|
||||
m.load_commands_from_file(os.path.join(self.provider_dir, provider_file))
|
||||
|
||||
if entry_point:
|
||||
m.load_commands_from_entry_point(entry_point)
|
||||
m.load_commands_from_file(os.path.join(self.provider_dir, provider_file))
|
||||
|
||||
stdout = StringIO()
|
||||
stderr = StringIO()
|
||||
|
@ -1,15 +0,0 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from mach.decorators import (
|
||||
CommandProvider,
|
||||
Command,
|
||||
)
|
||||
|
||||
@CommandProvider
|
||||
class ConditionsProvider(object):
|
||||
@Command('cmd_foo', category='testing')
|
||||
def run_foo(self):
|
||||
pass
|
@ -1,52 +0,0 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import imp
|
||||
import os
|
||||
import sys
|
||||
|
||||
from mach.base import MachError
|
||||
from mach.test.common import TestBase
|
||||
from mock import patch
|
||||
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
class Entry():
|
||||
"""Stub replacement for pkg_resources.EntryPoint"""
|
||||
def __init__(self, providers):
|
||||
self.providers = providers
|
||||
|
||||
def load(self):
|
||||
def _providers():
|
||||
return self.providers
|
||||
return _providers
|
||||
|
||||
class TestEntryPoints(TestBase):
|
||||
"""Test integrating with setuptools entry points"""
|
||||
provider_dir = os.path.join(here, 'providers')
|
||||
|
||||
def _run_mach(self):
|
||||
return TestBase._run_mach(self, ['help'], entry_point='mach.providers')
|
||||
|
||||
@patch('pkg_resources.iter_entry_points')
|
||||
def test_load_entry_point_from_directory(self, mock):
|
||||
# Ensure parent module is present otherwise we'll (likely) get
|
||||
# an error due to unknown parent.
|
||||
if b'mach.commands' not in sys.modules:
|
||||
mod = imp.new_module(b'mach.commands')
|
||||
sys.modules[b'mach.commands'] = mod
|
||||
|
||||
mock.return_value = [Entry(['providers'])]
|
||||
# Mach error raised due to conditions_invalid.py
|
||||
with self.assertRaises(MachError):
|
||||
self._run_mach()
|
||||
|
||||
@patch('pkg_resources.iter_entry_points')
|
||||
def test_load_entry_point_from_file(self, mock):
|
||||
mock.return_value = [Entry([os.path.join('providers', 'basic.py')])]
|
||||
|
||||
result, stdout, stderr = self._run_mach()
|
||||
self.assertIsNone(result)
|
||||
self.assertIn('cmd_foo', stdout)
|
@ -11,7 +11,6 @@ setup(
|
||||
description='CLI frontend to mozilla-central.',
|
||||
license='MPL 2.0',
|
||||
packages=['mach'],
|
||||
version=VERSION,
|
||||
tests_require=['mock']
|
||||
version=VERSION
|
||||
)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user