provide a command to show global requirements not being used directly

This commit is contained in:
Doug Hellmann 2014-11-12 15:42:25 +00:00
parent ef53551c45
commit c260168967
5 changed files with 93 additions and 8 deletions

View File

@ -0,0 +1,30 @@
"""add global_requirement table
Revision ID: 17770a76e3c7
Revises: 203851643975
Create Date: 2014-11-12 12:58:13.309422
"""
# revision identifiers, used by Alembic.
revision = '17770a76e3c7'
down_revision = '203851643975'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
'global_requirement',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('line_id', sa.Integer,
sa.ForeignKey('line.id', name='fk_requirement_line_id')),
sa.Column('name', sa.String()),
)
pass
def downgrade():
op.drop_table('global_requirement')
pass

View File

@ -8,6 +8,8 @@ from aeromancer import utils
from cliff.lister import Lister
from sqlalchemy import distinct
class List(Lister):
"""List the requirements for a project"""
@ -53,3 +55,18 @@ class Uses(Lister):
).order_by(models.Project.name)
return (('Name', 'Spec', 'File'),
((r.project.name, r.line.content.strip(), r.line.file.name) for r in query.all()))
class Unused(Lister):
"""List global requirements not used by any projects"""
log = logging.getLogger(__name__)
def take_action(self, parsed_args):
session = self.app.get_db_session()
used_requirements = session.query(distinct(req_models.Requirement.name))
query = session.query(req_models.GlobalRequirement).filter(
req_models.GlobalRequirement.name.notin_(used_requirements)
).order_by(req_models.GlobalRequirement.name)
return (('Name', 'Spec'),
((r.name, r.line.content.strip()) for r in query.all()))

View File

@ -2,8 +2,9 @@ import logging
import pkg_resources
from aeromancer.db import models as models
from aeromancer.filehandler import base
from . import models
from aeromancer.requirements import models as req_models
LOG = logging.getLogger(__name__)
@ -37,7 +38,7 @@ class RequirementsHandler(base.FileHandler):
parent_project = file_obj.project
for dist_name, line in read_requirements_file(file_obj):
LOG.debug('requirement: %s', dist_name)
new_r = models.Requirement(
new_r = req_models.Requirement(
name=dist_name,
line=line,
project=parent_project,
@ -46,10 +47,33 @@ class RequirementsHandler(base.FileHandler):
def delete_data_for_file(self, session, file_obj):
LOG.debug('deleting requirements from %r', file_obj.path)
for line in file_obj.lines:
query = session.query(models.Requirement).filter(
models.Requirement.line_id == line.id
)
for req in query.all():
session.delete(req)
query = session.query(req_models.Requirement).join(models.Line).filter(
models.Line.file_id == file_obj.id
)
for r in query.all():
session.delete(r)
return
class GlobalRequirementsHandler(base.FileHandler):
INTERESTING_PATTERNS = [
'global-requirements.txt',
]
def process_file(self, session, file_obj):
LOG.info('loading global requirements from %s', file_obj.project_path)
parent_project = file_obj.project
for dist_name, line in read_requirements_file(file_obj):
LOG.debug('global requirement: %s', dist_name)
new_r = req_models.GlobalRequirement(
name=dist_name,
line=line,
)
session.add(new_r)
def delete_data_for_file(self, session, file_obj):
LOG.debug('deleting global requirements from %r', file_obj.path)
query = session.query(req_models.GlobalRequirement)
query.delete()
return

View File

@ -19,3 +19,15 @@ class Requirement(models.Base):
models.Project,
backref='requirements',
)
class GlobalRequirement(models.Base):
__tablename__ = 'global_requirement'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
line_id = Column(Integer, ForeignKey('line.id'))
line = relationship(
models.Line,
uselist=False,
single_parent=True,
)

View File

@ -56,7 +56,9 @@ aeromancer.cli =
rescan = aeromancer.cli.project:Rescan
discover = aeromancer.cli.project:Discover
requirements list = aeromancer.requirements.cli:List
requirements unused = aeromancer.requirements.cli:Unused
what uses = aeromancer.requirements.cli:Uses
aeromancer.filehandler =
requirements = aeromancer.requirements.handler:RequirementsHandler
global_requirements = aeromancer.requirements.handler:GlobalRequirementsHandler