Используйте класс и методы класса из другого класса в Python - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть пара классов в jira.py, предоставляя 2 для образца

class JiraCommand:

    name = "<default>"
    aliases = []
    summary = "<--- no summary --->"
    usage = ""
    mandatory = ""

    commands = None

    def __init__(self, commands):
        self.commands = commands

    def dispatch(self, logger, jira_env, args):
        """Return the exit code of the whole process"""
        if len(args) > 0 and args[0] in ("--help", "-h"):
            logger.info("")
            alias_text = ''
            first_alias = True
            for a in self.aliases:
                if first_alias:
                    if len(self.aliases) == 1:                
                        alias_text = " (alias: " + a          
                    else:                                     
                        alias_text = " (aliases: " + a        
                    first_alias = False                       
                else:                                         
                    alias_text +=  ", " + a                   
            if not first_alias:                               
                alias_text += ")"                             
            logger.info("%s: %s%s" % (self.name, self.summary, alias_text))  
            if self.usage == "":                              
                opts = ""                                     
            else:                                             
                opts = " [options]"                           
            logger.info("")                                   
            logger.info("Usage: %s %s %s%s" % \               
                  (sys.argv[0], self.name, self.mandatory, opts))
            logger.info(self.usage)                           
            return 0                                          
        results = self.run(logger, jira_env, args)            
        if results:                                           
            return self.render(logger, jira_env, args, results)
        else:                                                 
            return 1                                          

    def run(self, logger, jira_env, args):                    
        """Return a non-zero object for success"""            
        return 0                                              

    def render(self, logger, jira_env, args, results):        
        """Return 0 for success"""                            
        return 0 

и второй класс в том же файле "jira.py"

class JiraCat(JiraCommand):

    name = "cat"
    summary = "Show all the fields in an issue"
    usage = """
    <issue key>           Issue identifier, e.g. CA-1234
    """

    def run(self, logger, jira_env, args):
        global soap, auth
        if len(args) != 1:
            logger.error(self.usage)
            return 0
        issueKey = args[0]
        try:
            jira_env['fieldnames'] = soap.service.getFieldsForEdit(auth, issueKey)
        except Exception, e:
            # In case we don't have edit permission
            jira_env['fieldnames'] = {}
        try:
            return soap.service.getIssue(auth, issueKey)
        except Exception, e:
            logger.error(decode(e))

    def render(self, logger, jira_env, args, results):
        # For available field names, see the variables in
        # src/java/com/atlassian/jira/rpc/soap/beans/RemoteIssue.java
        fields = jira_env['fieldnames']
        for f in ['key','summary','reporter','assignee','description',
                  'environment','project',
                  'votes'
                  ]:
            logger.info(getName(f, fields) + ': ' + encode(results[f]))
        logger.info('Type: ' + getName(results['type'], jira_env['types']))
        logger.info('Status: ' + getName(results['status'], jira_env['statuses']))
        logger.info('Priority: ' + getName(results['priority'], jira_env['priorities']))
        logger.info('Resolution: ' + getName(results['resolution'], jira_env['resolutions']))
        for f in ['created', 'updated',
                  'duedate'
                  ]:
            logger.info(getName(f, fields) + ': ' + dateStr(results[f]))
        for f in results['components']:
            logger.info(getName('components', fields) + ': ' + encode(f['name']))
        for f in results['affectsVersions']:
            logger.info(getName('versions', fields) + ': ' + encode(f['name']))
        for f in results['fixVersions']:
            logger.info('Fix Version/s:' + encode(f['name']))

        # TODO bug in JIRA api - attachmentNames are not returned
        #logger.info(str(results['attachmentNames']))

        # TODO restrict some of the fields that are shown here                                               
        for f in results['customFieldValues']:                                                               
            fieldName = str(f['customfieldId'])                                                              
            for v in f['values']:                                                                            
                logger.info(getName(fieldName, fields) + ': ' + encode(v))                                   

        return 0 

Теперь,JiraCat использует JiraCommand в качестве аргумента

Как я могу использовать JiraCat для получения живых результатов

вот что я попробовал:

>>> from jira import JiraCommand
>>> dir(JiraCommand)
['__doc__', '__init__', '__module__', 'aliases', 'commands', 'dispatch', 'mandatory', 'name', 'render', 'run', 'summary', 'usage']

>>> jcmd = JiraCommand("http://jira.server.com:8080")

>>> from jira import JiraCat
>>> dir(JiraCat)
['__doc__', '__init__', '__module__', 'aliases', 'commands', 'dispatch', 'mandatory', 'name', 'render', 'run', 'summary', 'usage']
>>> jc = JiraCat(jcmd)
>>> print jc
<jira.JiraCat instance at 0x2356d88>

>>> jc.run("-s", "cat", "QA-65")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "jira.py", line 163, in run
    logger.error(self.usage)
AttributeError: 'str' object has no attribute 'error'

1 Ответ

2 голосов
/ 19 сентября 2011

DonCallisto понял все правильно.

Метод запуска JiraCat принимает три аргумента (logger, jira_env, args);первый должен быть объектом логгера, но вы передаете строку ("-s").

Таким образом, ошибка, сообщающая о строке (logger = "- s"), не имеет "error"атрибут означает только это.

Ваш комментарий о командной строке (subprocess.Popen (['python', 'jira', '-s', 'jira.server.com:8080' ;, 'catall', 'JIRA-65'])) - это не то же самое, что вызов метода run () с теми же аргументами.Посмотрите на нижнюю часть jira.py и посмотрите, что он делает с sys.argv ...

Edit (1): Прочитав код, следующий Python должен повторить вашвызов командной строки.Это немного сложно и пропускает всю обработку исключений и логику в самом jira.py, что может привести к ошибкам, и я не могу проверить это здесь.

import jira
import os

com = jira.Commands()
logger = jira.setupLogging()
jira_env = {'home':os.environ['HOME']}
command_name = "cat"
my_args = ["JIRA-65"]
server = "http://jira.server.com:8080" + "/rpc/soap/jirasoapservice-v2?wsdl"

class Options:
    pass

options = Options()
#You might want to set options.user and options.password here...

jira.soap = jira.Client(server)
jira.start_login(options, jira_env, command_name, com, logger)
com.run(command_name, logger, jira_env, my_args)
...