remove the skill service that was used for the marketplace before he rewrite

pull/144/head
Chris Veilleux 2019-05-20 16:53:51 -05:00
parent 1d62a30c68
commit c607624781
13 changed files with 0 additions and 268 deletions

View File

@ -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>')

View File

@ -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

View File

@ -1,2 +0,0 @@
from .all_skills import AllSkillsEndpoint
from .skill_detail import SkillDetailEndpoint

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,2 +0,0 @@
from .db import connect_to_skill_db
from .skill import select_all_skills, Skill, upsert_skill

View File

@ -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)

View File

@ -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()

View File

@ -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()