configurationengine/source/cone/report/generation_report.py
author m2lahtel
Wed, 08 Sep 2010 12:20:56 +0300
changeset 4 0951727b8815
parent 3 e7e0ae78773e
permissions -rw-r--r--
Updated to 1.2.13 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     1
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     3
# All rights reserved.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     4
# This component and the accompanying materials are made available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     6
# which accompanies this distribution, and is available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     8
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     9
# Initial Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    11
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    12
# Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    13
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    14
# Description:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    15
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    16
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    17
import os, logging, pickle
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
import time
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    19
import types
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
from time import strftime
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
from cone.public import api, exceptions, utils, plugin
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
from cone.confml import model
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
from cone.report import report_util 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
SERIALISATION_FORMAT = 'pickle'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    28
def pickle_persistent_id(obj):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    29
    """
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    30
    Prepare report data for pickler.
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    31
    """
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    32
    if isinstance(obj, (logging.Logger, types.ModuleType)):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    33
        return ""
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    34
    elif isinstance(obj, (api.Configuration, api.ConfigurationProxy)):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    35
        try:    project_path = os.path.abspath(obj.get_project().get_storage().get_path())
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    36
        except: project_path = None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    37
        return "conf:" + repr(pickle.dumps((project_path, obj.path)))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    38
    else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    39
        return None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    40
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    41
def persistent_load(persid):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    42
    """
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    43
    Prepare pickler for unpickling report data.
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    44
    """
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    45
    global loaded_project
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    46
    if persid.startswith("impl:"):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    47
        type_id, ref, lineno = pickle.loads(eval(persid[5:]))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    48
        impl = plugin.ImplBase(ref, None)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    49
        impl.IMPL_TYPE_ID = type_id
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    50
        impl.lineno = lineno
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    51
        return impl
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    52
    elif persid.startswith("conf:"):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    53
        project_path, config_path = pickle.loads(eval(persid[5:]))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    54
        configuration = api.ConfigurationProxy(config_path)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    55
        if project_path:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    56
            if not loaded_project:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    57
                loaded_project = api.Project(api.Storage.open(project_path))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    58
            configuration._set_parent(loaded_project)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    59
        return configuration
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    60
    else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    61
        return None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    62
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
def save_report_data(rep_data, file_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
    Save report data into an intermediary report data file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
    dir = os.path.dirname(file_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
    if dir != '' and not os.path.exists(dir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
        os.makedirs(dir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
    f = open(file_path, 'wb')
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    71
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
        if SERIALISATION_FORMAT == 'yaml':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
            yaml.dump(rep_data, f)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
        elif SERIALISATION_FORMAT == 'pickle':
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    76
            pickler = pickle.Pickler(f)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    77
            pickler.persistent_id = pickle_persistent_id
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    78
            pickler.dump(rep_data)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
        elif SERIALISATION_FORMAT == 'pickle/2':
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    80
            pickler = pickle.Pickler(f, 2)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    81
            pickler.persistent_id = pickle_persistent_id
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    82
            pickler.dump(rep_data)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
    finally:    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
        f.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    85
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    86
def load_report_data(file_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    87
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    88
    Load report data from an intermediary report data file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    89
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    90
    try:        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    91
        f = open(file_path, "rb")
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    92
        unpickler = pickle.Unpickler(f)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    93
        global loaded_project
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    94
        loaded_project = None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    95
        unpickler.persistent_load = persistent_load
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    96
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    97
        if SERIALISATION_FORMAT == 'yaml':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    98
            data = yaml.load(f)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    99
        elif SERIALISATION_FORMAT == 'pickle':
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   100
            data = unpickler.load()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   101
        elif SERIALISATION_FORMAT == 'pickle/2':
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   102
            data = unpickler.load()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   103
    finally:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   104
        f.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   105
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   106
    data.label = get_generation_run_label(file_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   107
    return data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   108
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   109
def get_generation_run_label(datafile_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   110
    filename = os.path.split(datafile_path)[1]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   111
    filename_noext = os.path.splitext(filename)[0]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   112
    return filename_noext
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   113
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   114
def _get_parent_sequence_or_self(feature):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   115
    current = feature._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   116
    while current is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   117
        if isinstance(current, api.FeatureSequence):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   118
            return current
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   119
        current = current._parent
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   120
    return feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   121
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   122
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   123
def generate_report(rep_data, report_file_path, template_file_path=None, template_paths=[], report_options=[]):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   124
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   125
    Generate a generation report based on the given report data.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   126
    @param rep_data: The report data.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   127
    @param report_file_path: Path to the report file to generate.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   128
    @param template_file_path: Path to the template file to use.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   129
        If None, the default template is used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   130
    @param template_paths: the additional search paths for templates. The default location cone.report is 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   131
    always included.   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   132
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   133
    # Determine the template file and directory to use
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   134
    if template_file_path is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   135
        template_file_path = 'gen_report_template.html'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   136
    contexts = [report_data.context for report_data in rep_data]
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   137
    merged_context = plugin.MergedContext(contexts)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   138
    report_data = {'rep_data' : rep_data, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   139
                   'report_options' : report_options,
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   140
                   'merged_context' : merged_context}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   141
    report_util.generate_report(template_file_path, report_file_path, report_data, template_paths)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   142
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   143
def normalize_slash(path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   144
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   145
    Normalize backslashes to slashes to make testing easier (no differences
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   146
    between reports in linux and windows).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   147
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   148
    return path.replace('\\', '/')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   149
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   150
class ReportData(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   151
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   152
    Data object that stores all information used in report generation.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   153
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   154
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   155
    def __init__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   156
        self.project = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   157
        self.generation_timestamp = time.time()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   158
        self.generation_time = strftime("%d.%m.%Y %H:%M:%S")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   159
        self.options = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   160
        self.duration = 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   161
        self.output_dir = os.getcwd()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   162
        self.project_dir = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   163
        self.context = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   164
        self.label = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   165
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   166
    def set_output_dir(self, dir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   167
        self.output_dir = os.path.abspath(os.path.normpath(dir))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   168
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   169
    def set_duration(self, duration):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   170
        self.duration = duration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   171
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   172
    def set_options(self, options):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   173
        self.options = options
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   174
        self.project_dir = os.path.abspath(options.project)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   175
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   176
    def set_report_filename(self, filename):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   177
        self.report_filename = filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   178
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   179
    def __repr__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   180
        return "ReportData(%s)" % [self.generation_timestamp, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   181
                                   self.generation_time,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   182
                                   self.options,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   183
                                   self.duration,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   184
                                   self.output_dir,
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   185
                                   self.project_dir]
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   186
    
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   187
    def __getstate__(self):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   188
        state = self.__dict__.copy()
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   189
        if self.project:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   190
            state['project_path'] = os.path.abspath(self.project.get_path())
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   191
        else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   192
            state['project_path'] = None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   193
        del state['project']
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   194
        return state
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   195
    
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   196
    def __setstate__(self, dict):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   197
        project_path = dict['project_path']
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   198
        if project_path is None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   199
            self.project = None
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   200
        else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   201
            self.project = api.Project(api.Storage.open(project_path))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   202
        
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   203
        self.__dict__.update(dict)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   204
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   205
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   206
class RefLine(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   207
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   208
    Data object that stores information for one ref in report generation.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   209
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   210
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   211
    def __init__(self, ref, type):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   212
        self.ref = ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   213
        self.feat_type = type 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   214
        self.feat_name = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   215
        self.feat_value = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   216
        self.config_path = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   217
        self.impls = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   218
        self.output = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   219
        self.nbr_impls = 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   220
        self.nbr_outputfiles = 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   221
        self.datas = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   222
        self.nbr_of_datas = 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   223
        self.nbr_of_rows = 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   224
        self.seq_data = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   225
        self.is_temp_feature = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   226
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   227
    def add_impl(self, impl_file, impl_type, outputfiles):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   228
        self.impls.append(ImplLine(impl_file, impl_type, outputfiles))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   229
        self.nbr_impls = len(self.impls)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   230
        self.nbr_outputfiles = len(outputfiles) + self.nbr_outputfiles
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   231
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   232
    def add_data(self, layer, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   233
        self.datas.append(DataLine(layer,value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   234
        self.nbr_of_datas = len(self.datas)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   235
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   236
    def add_sequence(self, subsetting, values):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   237
        self.seq_data.append([subsetting, values])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   238
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   239
    def set_feat_name(self, name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   240
        self.feat_name = name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   241
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   242
    def set_feat_value(self, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   243
        self.feat_value = value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   244
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   245
    def set_config_path(self, filename):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   246
        self.config_path = normalize_slash(os.path.normpath(filename))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   247
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   248
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   249
class ImplLine():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   250
    def __init__(self, impl_file, impl_type, outputfiles, generation_runs=[]):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   251
        self.name = normalize_slash(os.path.normpath(impl_file))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   252
        self.type = impl_type
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   253
        files = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   254
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   255
        for outputfile in outputfiles:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   256
            files.append(Outputfile(outputfile))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   257
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   258
        self.outputfiles = files
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   259
        self.generation_runs = generation_runs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   260
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   261
class Outputfile():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   262
    def __init__(self, filename):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   263
        self.filename = normalize_slash(os.path.normpath(filename))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   264
        self.abs_filename = normalize_slash(os.path.abspath(filename))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   265
        self.exists = os.path.isfile(self.abs_filename)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   266
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   267
    def __eq__(self, other):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   268
        if type(self) is type(other):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   269
            return self.filename == other.filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   270
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   271
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   272
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   273
class DataLine():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   274
    def __init__(self, layer, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   275
        self.layer = normalize_slash(os.path.normpath(layer))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   276
        self.value = value