def __init__(self,
                 platform='default',
                 old_skills_dir=None,
                 skills_dir=None,
                 repo=None,
                 versioned=True):
        self.platform = platform

        # Keep this variable alive for a while, is used to move skills from the
        # old config based location to XDG
        self.old_skills_dir = path.expanduser(old_skills_dir or '') or None
        self.skills_dir = (skills_dir
                           or BaseDirectory.save_data_path('mycroft/skills'))

        self.repo = repo or SkillRepo()
        self.versioned = versioned
        self.lock = MsmProcessLock()

        # Property placeholders
        self._all_skills = None
        self._default_skills = None
        self._local_skills = None
        self._device_skill_state = None

        self.saving_handled = False
        self.device_skill_state_hash = ''
        with self.lock:
            self._init_skills_data()
예제 #2
0
 def __init__(self, platform='default', skills_dir=None, repo=None,
              versioned=True):
     self.platform = platform
     self.skills_dir = expanduser(skills_dir or '') \
                       or self.DEFAULT_SKILLS_DIR
     self.repo = repo or SkillRepo()
     self.versioned = versioned
예제 #3
0
 def setup(self):
     self.root = root = dirname(abspath(__file__))
     self.msm = MycroftSkillsManager(
         platform='default',
         skills_dir=join(root, 'test-skills'),
         repo=SkillRepo(
             join(root, 'repo-instance'),
             branch='test-repo',
             url='https://github.com/mycroftai/mycroft-skills-manager'),
         versioned=True)
예제 #4
0
    def __init__(self,
                 platform='default',
                 skills_dir=None,
                 repo=None,
                 versioned=True):
        self.platform = platform
        self.skills_dir = (expanduser(skills_dir or '')
                           or self.DEFAULT_SKILLS_DIR)
        self.repo = repo or SkillRepo()
        self.versioned = versioned
        self.lock = MsmProcessLock()

        self.skills_data = None
        self.saving_handled = False
        self.skills_data_hash = ''
        with self.lock:
            self.sync_skills_data()
    def __init__(self, platform='default', skills_dir=None, repo=None,
                 versioned=True):
        self.platform = platform
        self.skills_dir = (
                path.expanduser(skills_dir or '') or self.DEFAULT_SKILLS_DIR
        )
        self.repo = repo or SkillRepo()
        self.versioned = versioned
        self.lock = MsmProcessLock()

        # Property placeholders
        self._all_skills = None
        self._default_skills = None
        self._local_skills = None
        self._device_skill_state = None

        self.saving_handled = False
        self.device_skill_state_hash = ''
        with self.lock:
            self._init_skills_data()
예제 #6
0
def main(args=None, printer=print):
    logging.basicConfig(level=INFO, format='%(levelname)s - %(message)s')

    import argparse
    platforms = list(MycroftSkillsManager.SKILL_GROUPS)
    parser = argparse.ArgumentParser()
    parser.add_argument('-p',
                        '--platform',
                        choices=platforms,
                        default='default')
    parser.add_argument('-u', '--repo-url')
    parser.add_argument('-b', '--repo-branch')
    parser.add_argument('-d', '--skills-dir')
    parser.add_argument('-c', '--repo-cache')
    parser.add_argument('-l',
                        '--latest',
                        action='store_false',
                        dest='versioned',
                        help="Disable skill versioning")
    parser.add_argument('-r', '--raw', action='store_true')
    parser.set_defaults(raw=False, versioned=True)
    subparsers = parser.add_subparsers(dest='action')
    subparsers.required = True

    def add_constraint_args(subparser):
        subparser.add_argument('--constraints',
                               help='limit the installed requirements using '
                               'a pip constraint.txt file.')

    def add_search_args(subparser, skill_is_optional=False):
        if skill_is_optional:
            subparser.add_argument('skill', nargs='?')
        else:
            subparser.add_argument('skill')
        subparser.add_argument('author', nargs='?')

    install_parser = subparsers.add_parser('install')
    add_search_args(install_parser)
    add_constraint_args(install_parser)
    add_search_args(subparsers.add_parser('remove'))
    add_search_args(subparsers.add_parser('search'))
    add_search_args(subparsers.add_parser('info'))
    subparsers.add_parser('list').add_argument('-i',
                                               '--installed',
                                               action='store_true')
    add_search_args(subparsers.add_parser('update'), skill_is_optional=True)
    subparsers.add_parser('default')
    args = parser.parse_args(args or sys.argv[1:])

    if args.raw:
        LOG.level = ERROR

    repo = SkillRepo(url=args.repo_url,
                     branch=args.repo_branch,
                     path=args.repo_cache)
    msm = MycroftSkillsManager(args.platform, args.skills_dir, repo,
                               args.versioned)
    main_functions = {
        'install':
        lambda: msm.install(args.skill, args.author, args.constraints, 'cli'),
        'remove':
        lambda: msm.remove(args.skill, args.author),
        'list':
        lambda: '\n'.join(skill.name +
                          ('\t[installed]'
                           if skill.is_local and not args.raw else '')
                          for skill in msm.list()
                          if not args.installed or skill.is_local),
        'update':
        lambda: msm.update(args.skill, args.author),
        'default':
        msm.install_defaults,
        'search':
        lambda: '\n'.join(skill.name for skill in msm.list()
                          if skill.match(args.skill, args.author) >= 0.3),
        'info':
        lambda: skill_info(msm.find_skill(args.skill, args.author))
    }
    with msm.lock:
        try:
            result = main_functions[args.action]()
            if result is False:
                return 1
            if isinstance(result, str):
                printer(result)
            return 0
        except MsmException as e:
            exc_type = e.__class__.__name__
            printer('{}: {}'.format(exc_type, str(e)))
            return get_error_code(e.__class__)