remove the skill service that was used for the marketplace before he rewrite
parent
1d62a30c68
commit
c607624781
|
@ -1,15 +0,0 @@
|
|||
"""Define the API Flask application and its endpoints"""
|
||||
|
||||
from flask import Flask
|
||||
from flask_restful import Api
|
||||
|
||||
from .endpoints import AllSkillsEndpoint, SkillDetailEndpoint
|
||||
# from .config import get_config_location
|
||||
|
||||
|
||||
skill = Flask(__name__)
|
||||
# skill.config.from_object(get_config_location())
|
||||
|
||||
skill_api = Api(skill)
|
||||
skill_api.add_resource(AllSkillsEndpoint, '/skill/all')
|
||||
skill_api.add_resource(SkillDetailEndpoint, '/skill/name/<string:skill_name>')
|
|
@ -1,38 +0,0 @@
|
|||
import os
|
||||
|
||||
|
||||
class LoginConfigException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class BaseConfig:
|
||||
"""Base configuration."""
|
||||
DEBUG = False
|
||||
|
||||
|
||||
class DevelopmentConfig(BaseConfig):
|
||||
"""Development configuration."""
|
||||
DEBUG = True
|
||||
TARTARUS_BASE_URL = 'https://api-test.mycroft.ai/v1'
|
||||
|
||||
|
||||
def get_config_location():
|
||||
environment_configs = dict(
|
||||
dev='skill_service.api.config.DevelopmentConfig',
|
||||
# test=TestConfig,
|
||||
# prod=ProdConfig
|
||||
)
|
||||
|
||||
try:
|
||||
environment_name = os.environ['SELENE_ENVIRONMENT']
|
||||
except KeyError:
|
||||
raise LoginConfigException('the SELENE_ENVIRONMENT variable is not set')
|
||||
|
||||
try:
|
||||
configs_location = environment_configs[environment_name]
|
||||
except KeyError:
|
||||
raise LoginConfigException(
|
||||
'no configuration defined for the "{}" environment'.format(environment_name)
|
||||
)
|
||||
|
||||
return configs_location
|
|
@ -1,2 +0,0 @@
|
|||
from .all_skills import AllSkillsEndpoint
|
||||
from .skill_detail import SkillDetailEndpoint
|
|
@ -1,21 +0,0 @@
|
|||
"""Define the view to return summary information for all available skills."""
|
||||
|
||||
from http import HTTPStatus
|
||||
|
||||
from flask_restful import Resource
|
||||
|
||||
from .skill_formatter import format_skill_for_response
|
||||
from ...repository.skill import select_all_skills
|
||||
|
||||
|
||||
class AllSkillsEndpoint(Resource):
|
||||
"""All skills available for use on devices running Mycroft core."""
|
||||
|
||||
def get(self):
|
||||
"""Handle a HTTP GET request for available skills."""
|
||||
response = []
|
||||
for skill in select_all_skills():
|
||||
formatted_skill = format_skill_for_response(skill)
|
||||
response.append(formatted_skill)
|
||||
|
||||
return response, HTTPStatus.OK
|
|
@ -1,16 +0,0 @@
|
|||
"""Define the view to get the detailed information about a particular skill."""
|
||||
from http import HTTPStatus
|
||||
|
||||
from flask_restful import Resource
|
||||
|
||||
from .skill_formatter import format_skill_for_response
|
||||
from ...repository.skill import select_skill_by_name
|
||||
|
||||
|
||||
class SkillDetailEndpoint(Resource):
|
||||
def get(self, skill_name):
|
||||
"""Handle HTP GET request for detailed information about a skill."""
|
||||
skill = select_skill_by_name(skill_name)
|
||||
response = format_skill_for_response(skill)
|
||||
|
||||
return response, HTTPStatus.OK
|
|
@ -1,12 +0,0 @@
|
|||
def format_skill_for_response(skill):
|
||||
"""Manipulate a mongoengine object into a serializable object."""
|
||||
|
||||
formatted_skill = skill.to_mongo().to_dict()
|
||||
formatted_skill['id'] = str(formatted_skill['_id'])
|
||||
formatted_skill['created'] = formatted_skill['_id'].generation_time
|
||||
del formatted_skill['_id']
|
||||
|
||||
for datetime_attr in ('created', 'last_update'):
|
||||
formatted_skill[datetime_attr] = formatted_skill[datetime_attr].timestamp()
|
||||
|
||||
return formatted_skill
|
|
@ -1,2 +0,0 @@
|
|||
from .db import connect_to_skill_db
|
||||
from .skill import select_all_skills, Skill, upsert_skill
|
|
@ -1,11 +0,0 @@
|
|||
"""Database access utility functions"""
|
||||
from os import environ
|
||||
from mongoengine import connect
|
||||
|
||||
|
||||
def connect_to_skill_db():
|
||||
"""Establish a connection to the Mongo skills database."""
|
||||
host = environ['SKILL_DB_HOST']
|
||||
port = int(environ['SKILL_DB_PORT'])
|
||||
database = 'skillDB'
|
||||
connect(database, host=host, port=port)
|
|
@ -1,67 +0,0 @@
|
|||
"""
|
||||
Queries and manipulations of the skill collection in the marketplaceDB
|
||||
"""
|
||||
from datetime import datetime
|
||||
|
||||
from mongoengine import (
|
||||
DateTimeField,
|
||||
DictField,
|
||||
Document,
|
||||
ListField,
|
||||
StringField
|
||||
)
|
||||
|
||||
from .db import connect_to_skill_db
|
||||
|
||||
|
||||
class Skill(Document):
|
||||
"""
|
||||
Represents the schema of documents in the skill collection
|
||||
"""
|
||||
branch = StringField(required=True)
|
||||
categories = ListField(StringField())
|
||||
credits = ListField(DictField())
|
||||
description = StringField()
|
||||
icon = DictField()
|
||||
icon_image = StringField()
|
||||
last_update = DateTimeField(default=datetime.now(), required=True)
|
||||
platforms = ListField(StringField(), required=True, default=['all'])
|
||||
repository_owner = StringField(required=True)
|
||||
repository_url = StringField(required=True)
|
||||
skill_name = StringField(required=True, unique=True)
|
||||
summary = StringField()
|
||||
tags = ListField(StringField())
|
||||
title = StringField(required=True)
|
||||
triggers = ListField(StringField())
|
||||
|
||||
|
||||
def select_all_skills() -> list:
|
||||
"""
|
||||
Map the repository name to the skill object
|
||||
|
||||
Skill repositories in Github must be uniquely named
|
||||
|
||||
:return: dictionary of skill objects keyed by the repository name
|
||||
"""
|
||||
connect_to_skill_db()
|
||||
return Skill.objects
|
||||
|
||||
|
||||
def select_skill_by_name(skill_name: str) -> Skill:
|
||||
"""
|
||||
Query the database for a specified skill ID
|
||||
|
||||
:return: the Skill object with an ID matching the argument
|
||||
"""
|
||||
connect_to_skill_db()
|
||||
return Skill.objects(skill_name=skill_name).first()
|
||||
|
||||
|
||||
def upsert_skill(skill: Skill):
|
||||
"""
|
||||
An upsert will update a document if it exists or insert it if not.
|
||||
|
||||
:param skill: The skill to update or insert
|
||||
"""
|
||||
connect_to_skill_db()
|
||||
skill.save()
|
|
@ -1,84 +0,0 @@
|
|||
from datetime import datetime
|
||||
import json
|
||||
from os import environ
|
||||
|
||||
from skill_service.repository import (
|
||||
connect_to_skill_db,
|
||||
select_all_skills,
|
||||
Skill,
|
||||
upsert_skill
|
||||
)
|
||||
from selene_util.github import download_repository_file, log_into_github
|
||||
|
||||
|
||||
class SkillRefresher(object):
|
||||
"""
|
||||
Reconcile a skill repository's README.md with the database
|
||||
"""
|
||||
def __init__(self, skill: Skill, github_metadata):
|
||||
self.skill = skill
|
||||
self.skill_metadata = github_metadata
|
||||
|
||||
def _skill_meta_changed(self) -> bool:
|
||||
"""
|
||||
Determine if any of the skill metadata fields will be updated.
|
||||
|
||||
This is important to know whether or not the last update timestamp
|
||||
needs a new value. Changes in the metadata will result in an update
|
||||
of the timestamp whereas the timestamp will stay the same if nothing
|
||||
has changed.
|
||||
"""
|
||||
return (
|
||||
self.skill.categories != self.skill_metadata.get('categories', []) or
|
||||
self.skill.credits != self.skill_metadata.get('credits', []) or
|
||||
self.skill.description != self.skill_metadata['description'] or
|
||||
self.skill.icon != self.skill_metadata.get('icon') or
|
||||
self.skill.icon_image != self.skill_metadata.get('icon_img') or
|
||||
self.skill.platforms != self.skill_metadata['platforms'] or
|
||||
self.skill.repository_owner != self.skill_metadata['github_username'] or
|
||||
self.skill.repository_url != self.skill_metadata['repo'] or
|
||||
self.skill.summary != self.skill_metadata.get('short_desc') or
|
||||
self.skill.tags != self.skill_metadata['tags'] or
|
||||
self.skill.title != self.skill_metadata['title'] or
|
||||
self.skill.triggers != self.skill_metadata.get('examples')
|
||||
)
|
||||
|
||||
def refresh(self):
|
||||
"""
|
||||
Refresh the skill database with the repository README.md file
|
||||
"""
|
||||
if self._skill_meta_changed():
|
||||
self.skill.branch = environ['SKILL_BRANCH']
|
||||
self.skill.categories = self.skill_metadata.get('categories')
|
||||
self.skill.credits = self.skill_metadata.get('credits')
|
||||
self.skill.description = self.skill_metadata['description']
|
||||
self.skill.last_update = datetime.now()
|
||||
self.skill.icon = self.skill_metadata.get('icon')
|
||||
self.skill.icon_image = self.skill_metadata.get('icon_img')
|
||||
self.skill.platforms = self.skill_metadata['platforms']
|
||||
self.skill.repository_owner = self.skill_metadata['github_username']
|
||||
self.skill.repository_url = self.skill_metadata['repo']
|
||||
self.skill.skill_name = self.skill_metadata['name']
|
||||
self.skill.summary = self.skill_metadata.get('short_desc')
|
||||
self.skill.tags = self.skill_metadata.get('tags')
|
||||
self.skill.title = self.skill_metadata['title']
|
||||
self.skill.triggers = self.skill_metadata.get('examples')
|
||||
upsert_skill(self.skill)
|
||||
|
||||
|
||||
connect_to_skill_db()
|
||||
skills_in_db = {skill.skill_name: skill for skill in select_all_skills()}
|
||||
|
||||
# TODO figure out a way to paramaterize these
|
||||
github = log_into_github('dev@mycroft.ai', 'pFuG8z5ngmqVDla1aaED2rKl3yke5vZ7')
|
||||
file_contents = download_repository_file(
|
||||
github,
|
||||
'mycroft-skills-data',
|
||||
'18.08',
|
||||
'skill-metadata.json'
|
||||
)
|
||||
skills_metadata = json.loads(file_contents)
|
||||
for skill_identifier, skill_metadata in skills_metadata.items():
|
||||
skill_in_db = skills_in_db.get(skill_identifier, Skill())
|
||||
skill_refresher = SkillRefresher(skill_in_db, skill_metadata)
|
||||
skill_refresher.refresh()
|
Loading…
Reference in New Issue