loglan_db.model_db.addons.addon_word_getter   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 101
Duplicated Lines 19.8 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 46
dl 20
loc 101
ccs 39
cts 39
cp 1
rs 10
c 0
b 0
f 0
wmc 13

4 Methods

Rating   Name   Duplication   Size   Complexity  
A AddonWordGetter._filter_event() 0 4 1
A AddonWordGetter.by_name() 0 19 3
A AddonWordGetter.by_key() 0 27 5
A AddonWordGetter.by_event() 20 20 4

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
# -*- coding: utf-8 -*-
2 1
"""
3
This module contains an addon for basic Word Model,
4
which makes it possible to get words by event, name or key
5
"""
6 1
from typing import Union
7
8 1
from flask_sqlalchemy import BaseQuery
9 1
from sqlalchemy import or_
10
11 1
from loglan_db.model_db.base_connect_tables import t_connect_keys
12 1
from loglan_db.model_db.base_definition import BaseDefinition
13 1
from loglan_db.model_db.base_event import BaseEvent
14 1
from loglan_db.model_db.base_key import BaseKey
15 1
from loglan_db.model_db.base_word import BaseWord
16 1
from loglan_db.model_db.base_word import db
17
18
19 1
class AddonWordGetter:
20
    """AddonWordGetter model"""
21
22 1
    query: BaseQuery = None
23 1
    name: db.Column = None
24 1
    event_start_id: db.Column = None
25 1
    event_end_id: db.Column = None
26
27 1 View Code Duplication
    @classmethod
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
28 1
    def by_event(
29
            cls, event_id: Union[BaseEvent, int] = None,
30
            add_to: BaseQuery = None) -> BaseQuery:
31
        """Query filtered by specified Event (latest by default)
32
33
        Args:
34
          event_id: Union[BaseEvent, int]: Event object or Event.id (int) (Default value = None)
35
          add_to:
36
        Returns:
37
          BaseQuery
38
39
        """
40 1
        if not event_id:
41 1
            event_id = BaseEvent.latest().id
42
43 1
        event_id = BaseEvent.id if isinstance(event_id, BaseEvent) else int(event_id)
44
45 1
        request = add_to if add_to else cls.query
46 1
        return cls._filter_event(event_id, request).order_by(cls.name)
47
48 1
    @staticmethod
49 1
    def _filter_event(event_id: Union[BaseEvent, int], add_to: BaseQuery) -> BaseQuery:
50 1
        return add_to.filter(BaseWord.event_start_id <= event_id) \
51
            .filter(or_(BaseWord.event_end_id > event_id, BaseWord.event_end_id.is_(None)))
52
53 1
    @classmethod
54 1
    def by_name(cls, name: str, event_id: Union[BaseEvent, int] = None, case_sensitive: bool = False,
55
                add_to: BaseQuery = None) -> BaseQuery:
56
        """Word.Query filtered by specified name
57
58
        Args:
59
          event_id:
60
          name: str:
61
          case_sensitive: bool:  (Default value = False)
62
          add_to:
63
        Returns:
64
          BaseQuery
65
66
        """
67
68 1
        request = add_to if add_to else cls.query
69 1
        name = name.replace("*", "%")
70 1
        return cls.by_event(event_id, request).filter(
71
            BaseWord.name.like(name) if case_sensitive else BaseWord.name.ilike(name)
72
        )
73
74 1
    @classmethod
75 1
    def by_key(cls, key: Union[BaseKey, str], language: str = None, event_id: Union[BaseEvent, int] = None,
76
               case_sensitive: bool = False, add_to: BaseQuery = None) -> BaseQuery:
77
        """Word.Query filtered by specified key
78
79
        Args:
80
          key: Union[BaseKey, str]:
81
          language: str: Language of key (Default value = None)
82
          event_id: Union[BaseEvent, int]:  (Default value = None)
83
          case_sensitive: bool:  (Default value = False)
84
          add_to:
85
        Returns:
86
          BaseQuery
87
88
        """
89
90 1
        request = add_to if add_to else cls.query
91 1
        request = cls.by_event(event_id, request)
92
93 1
        key = (BaseKey.word if isinstance(key, BaseKey) else str(key)).replace("*", "%")
94 1
        request = request.join(BaseDefinition, t_connect_keys, BaseKey).filter(
95
            BaseKey.word.like(key) if case_sensitive else BaseKey.word.ilike(key))
96
97 1
        if language:
98 1
            request = request.filter(BaseKey.language == language)
99
100
        return request.order_by(cls.name)
101