Download Detección código no usado por usuarios en Python

Document related concepts
no text concepts found
Transcript
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Miguel Ángel Moreno Ruiz
Backend Developer
[email protected]
@emigue
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Podemos encontrar código no referenciado
(código muerto):
●
Librería Vulture
●
Pycharm code inspector
●
Scripts en bash sobre ficheros
Pero: ¿Cómo detectar código referenciado pero
no ejecutado por los usuarios? Código inútil
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Librería Coverage.py
●
●
●
Es una herramienta para medir la cobertura de
código en programas Python.
Habitualmente se usa para medir la cobertura
de pruebas en un sistema Python.
Nosotros la usaremos para saber el código que
usan los usuarios.
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Comandos básicos de coverage.py:
$ coverage run my_program.py arg1 arg2
$ coverage report -m
Name
Stmts
Miss Cover
Missing
------------------------------------------------------my_program.py
20
4
80%
33-35, 39
my_other_module.py
56
6
89%
17-23
------------------------------------------------------TOTAL
76
10
87%
$ coverage html
$ coverage xml
$ coverage combine
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Contenido fichero .coverage
!coverage.py: This is a private format, don't read it directly!{"file_tracers":
{"/home/emigue/code/ppap/fusion/templates/fusion/main.html":
"django_coverage_plugin.DjangoTemplatePlugin"}, "lines": {"/home/emigue/code/ppap/fusion/views.py":
[36, 37, 38, 44, 45, 46, 47, 48, 18, 19, 20, 21, 22, 24, 25, 26], "/home/emigue/code/ppap/fusion/forms.py":
[], "/home/emigue/code/ppap/ppap/settings.py": [128, 129, 130, 131, 134, 135, 136, 137, 11, 13, 16, 23, 26,
28, 34, 35, 36, 37, 38, 39, 40, 44, 45, 46, 47, 48, 49, 50, 53, 56, 57, 58, 59, 60, 62, 63, 64, 65, 67, 72, 78,
79, 80, 81, 90, 91, 93, 94, 96, 97, 99, 100, 108, 110, 112, 114, 116, 122, 124, 126, 127],
"/home/emigue/code/ppap/ppap/__init__.py": [1], "/home/emigue/code/ppap/fusion/tests.py": [],
"/home/emigue/code/ppap/fusion/migrations/0001_initial.py": [],
"/home/emigue/code/ppap/fusion/admin.py": [32, 1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 24, 25, 27, 28, 29,
30, 31], "/home/emigue/code/ppap/ppap/wsgi.py": [],
"/home/emigue/code/ppap/fusion/migrations/__init__.py": [], "/home/emigue/code/ppap/manage.py": [],
"/home/emigue/code/ppap/fusion/__init__.py": [1], "/home/emigue/code/ppap/ppap/urls.py": [],
"/home/emigue/code/ppap/fusion/templates/fusion/main.html": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 56], "/home/emigue/code/ppap/fusion/models.py": [1, 3, 6, 8, 9, 11,
12, 13, 22, 23, 26, 27, 30, 31, 34, 36, 37, 40, 42, 43, 45, 46, 48], "/home/emigue/code/ppap/fusion/apps.py":
[]}}
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Contenido fichero .coverage
!coverage.py: This is a private format, don't read it directly!
{
"file_tracers":{
"/home/emigue/code/ppap/fusion/templates/fusion/main.html":"django_coverage_plugin.DjangoTemplatePlugin"
},
"lines":{
"/home/emigue/code/ppap/fusion/views.py":[36, 37, 38, 44, 45, 46, 47, 48, 18, 19, 20, 21, 22, 24, 25, 26],
"/home/emigue/code/ppap/fusion/forms.py":[],
}
}
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Ejemplo de detalle de cobertura en html:
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Configuración de coverage.py (.coveragerc)
# .coveragerc to control coverage.py
[run]
data_file = .coverage
parallel = True
[report]
# Regexes for lines to exclude from consideration
exclude_lines =
# Don't complain if tests don't hit defensive
assertion code:
raise AssertionError
raise NotImplementedError
if __name__ == .__main__.:
ignore_errors = True
[html]
directory = coverage_html_report
[xml]
output = coverage.xml
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Coverage API. Ejemplo básico:
import coverage
cov = coverage.Coverage()
cov.start()
# .. call your code ..
cov.stop()
cov.save()
cov.html_report()
●
Generar resultados si
import coverage
coverage.process_startup()
COVERAGE_PROCESS_START
$ export COVERAGE_PROCESS_START=.coveragerc
# .. call your code ..
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Cobertura en comandos Django (manage.py)
import os
import sys
import coverage
import warnings
from coverage.misc import CoverageException
from django.core.management import execute_from_command_line
def run_project_command():
""" Run django project command.
To run with coverage, set COVERAGE_PROCESS_START=.coveragerc as environment variable
To set django settings, set DJANGO_SETTINGS_MODULE as environment variable
:return: None
"""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bos.settings.ebury.devel")
if os.environ.get("COVERAGE_PROCESS_START"):
warnings.warn("Running command with coverage mode")
try:
coverage.process_startup()
except CoverageException as ex:
warnings.warn("Error loading coverage. Running without coverage")
execute_from_command_line(sys.argv)
if __name__ == "__main__":
run_project_command()
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Procesos habituales en Django:
–
Lanzar el servidor web (ok)
●
●
–
python manage.py runserver
gunicorn wsgi.py
Procesos con Celery (no va)
●
Require usar la opción -P threads en los workers e
incluir la librería threadpool como requerimiento.
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Recolección cobertura distribuida:
–
Múltiples servidores recibiendo peticiones de usuarios.
–
Procesos de celery usando el mismo código.
–
Necesitamos la cobertura total usada.
–
Usando la opción parallel de coverage.py obtenemos ficheros:
.coverage.<machine-name>.<pid>.<id>
–
Podemos subir los ficheros a un repositorio remoto como Amazon S3
–
Descargarlos a una sóla máquina y combinarlos.
–
Generar el informe de resultados en html.
–
Analizamos fichero a fichero las líneas en rojo. Este código no ha sido
utilizado por ningún usuario en ninguna de las ejecuciones de los
servidores.
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
Aplicación web Pen-Pineapple-Apple-Pen:
APPLE
PINEAPPLE
PEN
MEMBRILLO
Vídeo introducción
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
$ coverage html
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Coverage in Django Templates: django_coverage_plugin
# requirements.txt
coverage
django_coverage_plugin
# .coveragerc
[run]
plugins =
django_coverage_plugin
#settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
],
'debug': True
},
},
]
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
●
●
Referencias:
–
Coverage.py: https://coverage.readthedocs.io/en/coverage-4.2/
–
Problema de coverage.py con celery:
–
http://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-python
–
https://chrisarndt.de/projects/threadpool/
–
Coverage for django templates: django_coverage_plugin
https://pypi.python.org/pypi/django_coverage_plugin
–
Librería vulture: https://pypi.python.org/pypi/vulture
–
Video PPAP: https://www.youtube.com/watch?v=d9TpRfDdyU0
Créditos:
–
Imagen Fondo diseñado por Kjpargeter – Freepik.com
–
Algunos ejemplos extraídos de la documentación de coverage.py
Málaga Python Meetup – Noviembre 2016
Detección código no usado por usuarios en Python
Gracias por vuestra atención
Málaga Python Meetup – Noviembre 2016