Passed
Push — master ( 33fcc4...1be489 )
by Alexander
01:49
created

things3.things3_api.Things3API.api()   A

Complexity

Conditions 2

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nop 2
dl 0
loc 12
rs 9.9
c 0
b 0
f 0
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
"""Simple read-only Things 3 Web Serivce."""
5
6
from __future__ import print_function
7
8
__author__ = "Alexander Willner"
9
__copyright__ = "Copyright 2020 Alexander Willner"
10
__credits__ = ["Alexander Willner"]
11
__license__ = "Apache License 2.0"
12
__version__ = "2.1.2"
13
__maintainer__ = "Alexander Willner"
14
__email__ = "[email protected]"
15
__status__ = "Development"
16
17
import sys
18
from os import getcwd
19
import json
20
from flask import Flask
21
from flask import Response
22
from things3.things3 import Things3
23
24
25
class Things3API():
26
    """API Wrapper for the simple read-only API for Things 3."""
27
28
    PORT = 8088
29
    APP = Flask(__name__)
30
    PATH = getcwd() + '/resources/'
31
    things3 = None
32
33
    # @APP.route('/<url>')
34
35
    def on_get(self, url):
36
        """Handles other GET requests"""
37
        filename = self.PATH + url
38
        content_type = 'application/json'
39
        if filename.endswith('css'):
40
            content_type = 'text/css'
41
        if filename.endswith('html'):
42
            content_type = 'text/html'
43
        if filename.endswith('js'):
44
            content_type = 'text/javascript'
45
        if filename.endswith('png'):
46
            content_type = 'image/png'
47
        if filename.endswith('jpg'):
48
            content_type = 'image/jpeg'
49
        if filename.endswith('ico'):
50
            content_type = 'image/x-ico'
51
        with open(filename, 'rb') as source:
52
            data = source.read()
53
        return Response(response=data, content_type=content_type)
54
55
    # @APP.route('/api/<command>')
56
57
    def api(self, command):
58
        """Return database as JSON strings."""
59
        if command in self.things3.functions:
60
            func = self.things3.functions[command]
61
            data = json.dumps(
62
                self.things3.convert_tasks_to_model(func(self.things3)))
63
            return Response(response=data, content_type='application/json')
64
65
        data = json.dumps(self.things3.convert_tasks_to_model(
66
            self.things3.get_not_implemented()))
67
        return Response(response=data, content_type='application/json',
68
                        status=404)
69
70
    def __init__(self, database=None):
71
        self.things3 = Things3(database=database)
72
73
    def main(self):
74
        """"Main function."""
75
        print("Starting up...")
76
77
        try:
78
            self.APP.add_url_rule('/api/<command>', view_func=self.api)
79
            self.APP.add_url_rule('/<url>', view_func=self.on_get)
80
            self.APP.run(port=self.PORT)
81
        except KeyboardInterrupt:
82
            print("Shutting down...")
83
            sys.exit(0)
84
85
86
if __name__ == "__main__":
87
    Things3API().main()
88