Total Complexity | 60 |
Total Lines | 393 |
Duplicated Lines | 33.84 % |
Changes | 6 | ||
Bugs | 0 | Features | 0 |
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:
Complex classes like CapakeyGateway often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | # -*- coding: utf-8 -*- |
||
63 | class CapakeyGateway(object): |
||
64 | ''' |
||
65 | A gateway to the capakey webservice. |
||
66 | |||
67 | .. deprecated:: 0.8.0 |
||
68 | Will be removed in version `0.9.0`. Please use the :class:`CapakeyRestGateway`. |
||
69 | ''' |
||
70 | |||
71 | caches = {} |
||
72 | |||
73 | @deprecate(DEPRECATIONWARNING.format('')) |
||
74 | def __init__(self, client, **kwargs): |
||
75 | self.client = client |
||
76 | cache_regions = ['permanent', 'long', 'short'] |
||
77 | for cr in cache_regions: |
||
78 | self.caches[cr] = make_region(key_mangler=str) |
||
79 | if 'cache_config' in kwargs: |
||
80 | for cr in cache_regions: |
||
81 | if ('%s.backend' % cr) in kwargs['cache_config']: |
||
82 | log.debug('Configuring %s region on CapakeyGateway', cr) |
||
83 | self.caches[cr].configure_from_config( |
||
84 | kwargs['cache_config'], |
||
85 | '%s.' % cr |
||
86 | ) |
||
87 | |||
88 | @deprecate(DEPRECATIONWARNING.format('.list_gemeenten')) |
||
89 | def list_gemeenten(self, sort=1): |
||
90 | ''' |
||
91 | List all `gemeenten` in Vlaanderen. |
||
92 | |||
93 | :param integer sort: What field to sort on. |
||
94 | :rtype: A :class:`list` of :class:`Gemeente`. |
||
95 | ''' |
||
96 | def creator(): |
||
97 | res = capakey_gateway_request( |
||
98 | self.client, 'ListAdmGemeenten', sort |
||
99 | ) |
||
100 | return [ |
||
101 | Gemeente(r.Niscode, r.AdmGemeentenaam) |
||
102 | for r in res.AdmGemeenteItem |
||
103 | ] |
||
104 | if self.caches['permanent'].is_configured: |
||
105 | key = 'ListAdmGemeenten#%s' % sort |
||
106 | gemeente = self.caches['permanent'].get_or_create(key, creator) |
||
107 | else: |
||
108 | gemeente = creator() |
||
109 | for g in gemeente: |
||
110 | View Code Duplication | g.set_gateway(self) |
|
|
|||
111 | return gemeente |
||
112 | |||
113 | @deprecate(DEPRECATIONWARNING.format('.get_gemeente_by_id')) |
||
114 | def get_gemeente_by_id(self, id): |
||
115 | ''' |
||
116 | Retrieve a `gemeente` by id (the NIScode). |
||
117 | |||
118 | :rtype: :class:`Gemeente` |
||
119 | ''' |
||
120 | def creator(): |
||
121 | try: |
||
122 | res = capakey_gateway_request( |
||
123 | self.client, 'GetAdmGemeenteByNiscode', id |
||
124 | ) |
||
125 | except GatewayRuntimeException: |
||
126 | raise GatewayResourceNotFoundException() |
||
127 | return Gemeente( |
||
128 | res.Niscode, |
||
129 | res.AdmGemeentenaam, |
||
130 | (res.CenterX, res.CenterY), |
||
131 | (res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY) |
||
132 | ) |
||
133 | if self.caches['long'].is_configured: |
||
134 | key = 'GetAdmGemeenteByNiscode#%s' % id |
||
135 | gemeente = self.caches['long'].get_or_create(key, creator) |
||
136 | else: |
||
137 | gemeente = creator() |
||
138 | gemeente.set_gateway(self) |
||
139 | return gemeente |
||
140 | |||
141 | @deprecate(DEPRECATIONWARNING.format('.list_kadastrale_afdelingen')) |
||
142 | def list_kadastrale_afdelingen(self, sort=1): |
||
143 | ''' |
||
144 | List all `kadastrale afdelingen` in Flanders. |
||
145 | |||
146 | :param integer sort: Field to sort on. |
||
147 | :rtype: A :class:`list` of :class:`Afdeling`. |
||
148 | ''' |
||
149 | def creator(): |
||
150 | res = capakey_gateway_request( |
||
151 | self.client, 'ListKadAfdelingen', sort |
||
152 | ) |
||
153 | return [ |
||
154 | Afdeling( |
||
155 | id=r.KadAfdelingcode, |
||
156 | naam=r.KadAfdelingnaam, |
||
157 | gemeente=Gemeente(r.Niscode) |
||
158 | ) for r in res.KadAfdelingItem] |
||
159 | if self.caches['permanent'].is_configured: |
||
160 | key = 'ListKadAfdelingen#%s' % sort |
||
161 | afdelingen = self.caches['permanent'].get_or_create(key, creator) |
||
162 | else: |
||
163 | afdelingen = creator() |
||
164 | for a in afdelingen: |
||
165 | a.set_gateway(self) |
||
166 | return afdelingen |
||
167 | |||
168 | @deprecate(DEPRECATIONWARNING.format('.list_kadastrale_afdelingen_by_gemeente')) |
||
169 | def list_kadastrale_afdelingen_by_gemeente(self, gemeente, sort=1): |
||
170 | ''' |
||
171 | List all `kadastrale afdelingen` in a `gemeente`. |
||
172 | |||
173 | :param gemeente: The :class:`Gemeente` for which the \ |
||
174 | `afdelingen` are wanted. |
||
175 | :param integer sort: Field to sort on. |
||
176 | :rtype: A :class:`list` of :class:`Afdeling`. |
||
177 | ''' |
||
178 | try: |
||
179 | gid = gemeente.id |
||
180 | except AttributeError: |
||
181 | gid = gemeente |
||
182 | gemeente = self.get_gemeente_by_id(gid) |
||
183 | gemeente.clear_gateway() |
||
184 | |||
185 | def creator(): |
||
186 | res = capakey_gateway_request( |
||
187 | self.client, 'ListKadAfdelingenByNiscode', gid, sort |
||
188 | ) |
||
189 | try: |
||
190 | return [ |
||
191 | Afdeling( |
||
192 | id=r.KadAfdelingcode, |
||
193 | naam=r.KadAfdelingnaam, |
||
194 | gemeente=gemeente |
||
195 | ) for r in res.KadAfdelingItem] |
||
196 | except AttributeError: |
||
197 | # Handle bad error handling on the CAPAKEY side |
||
198 | return [] |
||
199 | if self.caches['permanent'].is_configured: |
||
200 | key = 'ListKadAfdelingenByNiscode#%s#%s' % (gid, sort) |
||
201 | afdelingen = self.caches['permanent'].get_or_create(key, creator) |
||
202 | else: |
||
203 | afdelingen = creator() |
||
204 | for a in afdelingen: |
||
205 | a.set_gateway(self) |
||
206 | return afdelingen |
||
207 | |||
208 | @deprecate(DEPRECATIONWARNING.format('.get_kadastrale_afdeling_by_id')) |
||
209 | def get_kadastrale_afdeling_by_id(self, id): |
||
210 | ''' |
||
211 | Retrieve a 'kadastrale afdeling' by id. |
||
212 | |||
213 | :param id: An id of a `kadastrale afdeling`. |
||
214 | :rtype: A :class:`Afdeling`. |
||
215 | ''' |
||
216 | def creator(): |
||
217 | try: |
||
218 | res = capakey_gateway_request( |
||
219 | self.client, 'GetKadAfdelingByKadAfdelingcode', id |
||
220 | ) |
||
221 | except GatewayRuntimeException: |
||
222 | raise GatewayResourceNotFoundException() |
||
223 | return Afdeling( |
||
224 | id=res.KadAfdelingcode, |
||
225 | naam=res.KadAfdelingnaam, |
||
226 | gemeente=Gemeente(res.Niscode, res.AdmGemeentenaam), |
||
227 | centroid=(res.CenterX, res.CenterY), |
||
228 | bounding_box=( |
||
229 | res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY |
||
230 | ) |
||
231 | ) |
||
232 | if self.caches['long'].is_configured: |
||
233 | key = 'GetKadAfdelingByKadAfdelingcode#%s' % id |
||
234 | afdeling = self.caches['long'].get_or_create(key, creator) |
||
235 | else: |
||
236 | afdeling = creator() |
||
237 | View Code Duplication | afdeling.set_gateway(self) |
|
238 | return afdeling |
||
239 | |||
240 | @deprecate(DEPRECATIONWARNING.format('.list_secties_by_afdeling')) |
||
241 | def list_secties_by_afdeling(self, afdeling): |
||
242 | ''' |
||
243 | List all `secties` in a `kadastrale afdeling`. |
||
244 | |||
245 | :param afdeling: The :class:`Afdeling` for which the `secties` are \ |
||
246 | wanted. Can also be the id of and `afdeling`. |
||
247 | :rtype: A :class:`list` of `Sectie`. |
||
248 | ''' |
||
249 | try: |
||
250 | aid = afdeling.id |
||
251 | except AttributeError: |
||
252 | aid = afdeling |
||
253 | afdeling = self.get_kadastrale_afdeling_by_id(aid) |
||
254 | afdeling.clear_gateway() |
||
255 | |||
256 | def creator(): |
||
257 | res = capakey_gateway_request( |
||
258 | self.client, 'ListKadSectiesByKadAfdelingcode', aid |
||
259 | ) |
||
260 | try: |
||
261 | return [ |
||
262 | Sectie( |
||
263 | r.KadSectiecode, |
||
264 | afdeling |
||
265 | ) for r in res.KadSectieItem |
||
266 | ] |
||
267 | except AttributeError: |
||
268 | # Handle bad error handling on the CAPAKEY side |
||
269 | return [] |
||
270 | if self.caches['long'].is_configured: |
||
271 | key = 'ListKadSectiesByKadAfdelingcode#%s' % aid |
||
272 | secties = self.caches['long'].get_or_create(key, creator) |
||
273 | else: |
||
274 | secties = creator() |
||
275 | for s in secties: |
||
276 | s.set_gateway(self) |
||
277 | return secties |
||
278 | |||
279 | @deprecate(DEPRECATIONWARNING.format('.get_sectie_by_id_and_afdeling')) |
||
280 | def get_sectie_by_id_and_afdeling(self, id, afdeling): |
||
281 | ''' |
||
282 | Get a `sectie`. |
||
283 | |||
284 | :param id: An id of a sectie. eg. "A" |
||
285 | :param afdeling: The :class:`Afdeling` for in which the `sectie` can \ |
||
286 | be found. Can also be the id of and `afdeling`. |
||
287 | :rtype: A :class:`Sectie`. |
||
288 | ''' |
||
289 | try: |
||
290 | aid = afdeling.id |
||
291 | except AttributeError: |
||
292 | aid = afdeling |
||
293 | afdeling = self.get_kadastrale_afdeling_by_id(aid) |
||
294 | afdeling.clear_gateway() |
||
295 | |||
296 | def creator(): |
||
297 | try: |
||
298 | res = capakey_gateway_request( |
||
299 | self.client, 'GetKadSectieByKadSectiecode', aid, id |
||
300 | ) |
||
301 | except GatewayRuntimeException: |
||
302 | raise GatewayResourceNotFoundException() |
||
303 | return Sectie( |
||
304 | res.KadSectiecode, |
||
305 | afdeling, |
||
306 | (res.CenterX, res.CenterY), |
||
307 | (res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY), |
||
308 | ) |
||
309 | if self.caches['long'].is_configured: |
||
310 | key = 'GetKadSectieByKadSectiecode#%s#%s' % (aid, id) |
||
311 | sectie = self.caches['long'].get_or_create(key, creator) |
||
312 | else: |
||
313 | sectie = creator() |
||
314 | sectie.set_gateway(self) |
||
315 | return sectie |
||
316 | |||
317 | @deprecate(DEPRECATIONWARNING.format('.list_percelen_by_sectie')) |
||
318 | def list_percelen_by_sectie(self, sectie, sort=1): |
||
319 | ''' |
||
320 | List all percelen in a `sectie`. |
||
321 | |||
322 | :param sectie: The :class:`Sectie` for which the percelen are wanted. |
||
323 | :param integer sort: Field to sort on. |
||
324 | :rtype: A :class:`list` of :class:`Perceel`. |
||
325 | ''' |
||
326 | sectie.clear_gateway() |
||
327 | |||
328 | def creator(): |
||
329 | res = capakey_gateway_request( |
||
330 | self.client, 'ListKadPerceelsnummersByKadSectiecode', |
||
331 | sectie.afdeling.id, sectie.id, sort |
||
332 | ) |
||
333 | try: |
||
334 | return [ |
||
335 | Perceel( |
||
336 | r.KadPerceelsnummer, |
||
337 | sectie, |
||
338 | r.CaPaKey, |
||
339 | r.PERCID, |
||
340 | ) for r in res.KadPerceelsnummerItem |
||
341 | ] |
||
342 | except AttributeError: |
||
343 | # Handle bad error handling on the CAPAKEY side |
||
344 | return [] |
||
345 | if self.caches['short'].is_configured: |
||
346 | key = 'ListKadPerceelsnummersByKadSectiecode#%s#%s#%s' % (sectie.afdeling.id, sectie.id, sort) |
||
347 | percelen = self.caches['short'].get_or_create(key, creator) |
||
348 | else: |
||
349 | percelen = creator() |
||
350 | for p in percelen: |
||
351 | View Code Duplication | p.set_gateway(self) |
|
352 | return percelen |
||
353 | |||
354 | @deprecate(DEPRECATIONWARNING.format('.get_perceel_by_id_and_sectie')) |
||
355 | def get_perceel_by_id_and_sectie(self, id, sectie): |
||
356 | ''' |
||
357 | Get a `perceel`. |
||
358 | |||
359 | :param id: An id for a `perceel`. |
||
360 | :param sectie: The :class:`Sectie` that contains the perceel. |
||
361 | :rtype: :class:`Perceel` |
||
362 | ''' |
||
363 | sectie.clear_gateway() |
||
364 | |||
365 | def creator(): |
||
366 | try: |
||
367 | res = capakey_gateway_request( |
||
368 | self.client, 'GetKadPerceelsnummerByKadPerceelsnummer', |
||
369 | sectie.afdeling.id, sectie.id, id |
||
370 | ) |
||
371 | except GatewayRuntimeException: |
||
372 | raise GatewayResourceNotFoundException() |
||
373 | return Perceel( |
||
374 | res.KadPerceelsnummer, |
||
375 | sectie, |
||
376 | res.CaPaKey, |
||
377 | res.PERCID, |
||
378 | res.CaPaTy, |
||
379 | res.CaShKey, |
||
380 | (res.CenterX, res.CenterY), |
||
381 | (res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY) |
||
382 | ) |
||
383 | if self.caches['short'].is_configured: |
||
384 | key = 'GetKadPerceelsnummerByKadPerceelsnummer#%s#%s#%s' % (sectie.afdeling.id, sectie.id, id) |
||
385 | perceel = self.caches['short'].get_or_create(key, creator) |
||
386 | else: |
||
387 | perceel = creator() |
||
388 | View Code Duplication | perceel.set_gateway(self) |
|
389 | return perceel |
||
390 | |||
391 | @deprecate(DEPRECATIONWARNING.format('.get_perceel_by_capakey')) |
||
392 | def get_perceel_by_capakey(self, capakey): |
||
393 | ''' |
||
394 | Get a `perceel`. |
||
395 | |||
396 | :param capakey: An capakey for a `perceel`. |
||
397 | :rtype: :class:`Perceel` |
||
398 | ''' |
||
399 | def creator(): |
||
400 | try: |
||
401 | res = capakey_gateway_request( |
||
402 | self.client, 'GetKadPerceelsnummerByCaPaKey', capakey |
||
403 | ) |
||
404 | except GatewayRuntimeException: |
||
405 | raise GatewayResourceNotFoundException() |
||
406 | return Perceel( |
||
407 | res.KadPerceelsnummer, |
||
408 | Sectie(res.KadSectiecode, Afdeling(res.KadAfdelingcode)), |
||
409 | res.CaPaKey, |
||
410 | res.PERCID, |
||
411 | res.CaPaTy, |
||
412 | res.CaShKey, |
||
413 | (res.CenterX, res.CenterY), |
||
414 | (res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY) |
||
415 | ) |
||
416 | if self.caches['short'].is_configured: |
||
417 | key = 'GetKadPerceelsnummerByCaPaKey#%s' % capakey |
||
418 | perceel = self.caches['short'].get_or_create(key, creator) |
||
419 | else: |
||
420 | perceel = creator() |
||
421 | perceel.set_gateway(self) |
||
422 | return perceel |
||
423 | |||
424 | @deprecate(DEPRECATIONWARNING.format('.get_perceel_by_percid')) |
||
425 | def get_perceel_by_percid(self, percid): |
||
426 | ''' |
||
427 | Get a `perceel`. |
||
428 | |||
429 | :param percid: A percid for a `perceel`. |
||
430 | :rtype: :class:`Perceel` |
||
431 | ''' |
||
432 | def creator(): |
||
433 | try: |
||
434 | res = capakey_gateway_request( |
||
435 | self.client, 'GetKadPerceelsnummerByPERCID', percid |
||
436 | ) |
||
437 | except GatewayRuntimeException: |
||
438 | raise GatewayResourceNotFoundException() |
||
439 | return Perceel( |
||
440 | res.KadPerceelsnummer, |
||
441 | Sectie(res.KadSectiecode, Afdeling(res.KadAfdelingcode)), |
||
442 | res.CaPaKey, |
||
443 | res.PERCID, |
||
444 | res.CaPaTy, |
||
445 | res.CaShKey, |
||
446 | (res.CenterX, res.CenterY), |
||
447 | (res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY) |
||
448 | ) |
||
449 | if self.caches['short'].is_configured: |
||
450 | key = 'GetKadPerceelsnummerByPERCID#%s' % percid |
||
451 | perceel = self.caches['short'].get_or_create(key, creator) |
||
452 | else: |
||
453 | perceel = creator() |
||
454 | perceel.set_gateway(self) |
||
455 | return perceel |
||
456 | |||
1288 |