src.api   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 285
Duplicated Lines 27.02 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 107
dl 77
loc 285
ccs 65
cts 65
cp 1
rs 10
c 0
b 0
f 0
wmc 15

8 Methods

Rating   Name   Duplication   Size   Complexity  
A ApiData.return_scooter() 0 39 2
A ApiData.get_station() 0 27 2
A ApiData.rent_scooter() 0 37 2
A ApiData.update_rented_scooter() 37 37 2
A ApiData.get_city_data() 0 27 2
A ApiData.__init__() 0 5 1
A ApiData.get_scooter_data() 0 35 2
A ApiData.update_scooter() 40 40 2

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
#!/usr/bin/python3
2
# pylint: disable=broad-except
3
4 1
""" Get and update from the API """
5
6 1
import os
7 1
import requests
8
9 1
from src.scooter import Scooter
10
11
12 1
url = os.environ.get("API_URL")
13
14
15 1
class ApiData(Scooter):
16
    """ Api class """
17
    # API endpoint URL
18 1
    _URL = "http://localhost:1337/api/v1/graphql" if url is None else url
19
20
    # Set the headers
21 1
    _HEADERS = { "Content-Type": "application/json"}
22
23
24 1
    def __init__(self, user_id: int) -> None:
25
        """ Initialize class """
26 1
        super().__init__()
27 1
        self.user_id = user_id
28 1
        self.station = ""
29
30
31 1
    def get_scooter_data(self, scooter_id: int) -> dict:
32
        """ Get scooter data from API. """
33
        # Create the GraphQL query
34 1
        query = ''' query getScooterById($id: String!) {
35
            getScooterById(id: $id) {
36
                id
37
                latitude
38
                longitude
39
                speed
40
                battery
41
                status {
42
                    id
43
                    status
44
                }
45
                station {
46
                    id
47
                    station_name
48
                }
49
            }
50
        } '''
51
52 1
        payload = {
53
            'query': query,
54
            'variables': {
55
                'id': str(scooter_id)
56
            }
57
        }
58
59 1
        try:
60
            # Send the POST request
61 1
            response = requests.post(self._URL, json=payload, headers=self._HEADERS)
62
63 1
            return response.json()["data"]["getScooterById"][0]
64 1
        except (Exception, ConnectionError):
65 1
            return -1
66
67
68 1 View Code Duplication
    def update_scooter(self) -> None:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
69
        """ Update api with all scooters data. """
70 1
        mutation = ''' mutation updateScooterById(
71
            $id: String!,
72
            $battery: String!,
73
            $status_id: String!,
74
            $longitude: String!,
75
            $latitude: String!,
76
            $price_id: String!,
77
            $speed: String!,
78
            $station_id: String!) {
79
                updateScooterById(
80
                    id: $id,
81
                    battery: $battery,
82
                    status_id: $status_id,
83
                    longitude: $longitude,
84
                    latitude: $latitude,
85
                    price_id: $price_id,
86
                    speed: $speed,
87
                    station_id: $station_id) { id }
88
        } '''
89
90 1
        payload = {
91
            'query': mutation,
92
            'variables': {
93
                'id': self.data["id"],
94
                'status_id': str(self.data["status"]),
95
                'latitude': str(self.data["lat"]),
96
                'longitude': str(self.data["lon"]),
97
                'speed': str(self.data["speed"]),
98
                'battery': str(self.data["battery"]),
99
                'station_id': str(self.data["station"]),
100
                'price_id': "1"
101
            }
102
        }
103
104 1
        try:
105 1
            requests.post(self._URL, json=payload, headers=self._HEADERS)
106 1
        except (Exception, ConnectionError) as error:
107 1
            print(error)
108
109
110 1 View Code Duplication
    def update_rented_scooter(self) -> None:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
111
        """ Update api with scooter's new position, speed, status and battery level. """
112 1
        mutation = ''' mutation updateRentedScooterById(
113
            $id: String!,
114
            $battery: String!,
115
            $status_id: String!,
116
            $longitude: String!,
117
            $latitude: String!,
118
            $speed: String!) {
119
                updateRentedScooterById(
120
                    id: $id,
121
                    battery: $battery,
122
                    status_id: $status_id,
123
                    longitude: $longitude,
124
                    latitude: $latitude,
125
                    speed: $speed)
126
                    {
127
                        id
128
                    }
129
        } '''
130
131 1
        payload = {
132
            'query': mutation,
133
            'variables': {
134
                'id': self.data["id"],
135
                'status_id': str(self.data["status"]),
136
                'latitude': str(self.data["lat"]),
137
                'longitude': str(self.data["lon"]),
138
                'speed': str(self.data["speed"]),
139
                'battery': str(self.data["battery"]),
140
            }
141
        }
142
143 1
        try:
144 1
            requests.post(self._URL, json=payload, headers=self._HEADERS)
145 1
        except (Exception, ConnectionError) as error:
146 1
            print(error)
147
148
149 1
    def rent_scooter(self) -> None:
150
        """
151
        Create log. Data to be added is scooter's position, start date/time and scooter/user id.
152
        """
153 1
        mutation = ''' mutation rentScooter(
154
            $id: String!,
155
            $user_id: String!,
156
            $longitude: String!,
157
            $latitude: String!) {
158
                rentScooter(
159
                    id: $id,
160
                    user_id: $user_id,
161
                    longitude: $longitude,
162
                    latitude: $latitude)
163
                    { 
164
                        id 
165
                        success
166
                    }
167
        } '''
168
169 1
        payload = {
170
            'query': mutation,
171
            'variables': {
172
                'id': self.data["id"],
173
                'user_id': str(self.user_id),
174
                'longitude': str(self.data["lon"]),
175
                'latitude': str(self.data["lat"]),
176
            }
177
        }
178
179 1
        try:
180 1
            response = requests.post(self._URL, json=payload, headers=self._HEADERS)
181
182
            # save the station
183 1
            self.station = response.json()["data"]["rentScooter"]["success"]
184 1
        except (Exception, ConnectionError) as error:
185 1
            print(error)
186
187
188 1
    def return_scooter(self, time: int) -> None:
189
        """
190
        Create log. Data to be added is scooter's position, start date/time and scooter/user id.
191
        """
192 1
        mutation = ''' mutation returnScooter(
193
            $id: String!,
194
            $user_id: String!,
195
            $longitude: String!,
196
            $latitude: String!,
197
            $time: String!,
198
            $station: String!) {
199
                returnScooter(
200
                    id: $id,
201
                    user_id: $user_id,
202
                    longitude: $longitude,
203
                    latitude: $latitude,
204
                    time: $time,
205
                    station: $station)
206
                    { 
207
                        success
208
                    }
209
        } '''
210
211 1
        payload = {
212
            'query': mutation,
213
            'variables': {
214
                'id': self.data["id"],
215
                'user_id': str(self.user_id),
216
                'longitude': str(self.data["lon"]),
217
                'latitude': str(self.data["lat"]),
218
                'time': str(time),
219
                'station': self.station
220
            }
221
        }
222
223 1
        try:
224 1
            requests.post(self._URL, json=payload, headers=self._HEADERS)
225 1
        except (Exception, ConnectionError) as error:
226 1
            print(error)
227
228
229 1
    def get_city_data(self) -> dict:
230
        """
231
        Get city's center position, id and area where the scooter is located.
232
        And adds it to city dictionary.
233
        """
234 1
        query = ''' query getCityByScooterId($id: String!) {
235
            getCityByScooterId(id: $id) {
236
                id
237
                latitude
238
                longitude
239
                area
240
            }
241
        } '''
242
243 1
        payload = {
244
            'query': query,
245
            'variables': {
246
                'id': self.data["id"]
247
            }
248
        }
249
250 1
        try:
251 1
            response = requests.post(self._URL, json=payload, headers=self._HEADERS)
252
253 1
            return response.json()["data"]["getCityByScooterId"][0]
254 1
        except (Exception, ConnectionError):
255 1
            return -1
256
257
258 1
    def get_station(self, zone_id: str) -> dict:
259
        """
260
        return random charging/maintenance station data in the city where the scooter is located.
261
        Zone id: 1- Charging Station, 2- Parking Station, 3- Bike Statione, 4- Maintenance Station.
262
        """
263 1
        query = ''' query getStationByCityIdAndZoneId($cityId: String!, $zoneId: String!) {
264
            getStationByCityIdAndZoneId(cityId: $cityId, zoneId: $zoneId) {
265
                id
266
                latitude
267
                longitude
268
            }
269
        } '''
270
271 1
        payload = {
272
            'query': query,
273
            'variables': {
274
                'cityId': self.city["id"],
275
                'zoneId': zone_id
276
            }
277
        }
278
279 1
        try:
280 1
            response = requests.post(self._URL, json=payload, headers=self._HEADERS)
281
282 1
            return response.json()["data"]["getStationByCityIdAndZoneId"][0]
283 1
        except (Exception, ConnectionError):
284
            return -1
285