#/usr/bin/env python
'''
Created on 07-Jan-2013

@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.


'''

import re
from configobj import ConfigObj
class iniparser:
    '''
    Manages authoring, parsing and execution of the test. Sub components are
    Test-Topology parser
    Module that parses the test from plain English and topology
    from a specification file and prepares for execution.
    Test sequencer
    Module that executes the tests case by case,
    step by step adding ability for step by step pause and debug later.
    Object loader
    Module that connects and loads all the component connection objects
    for access in the test
    '''
    def __init__(self) :
        self.default = ''

    def parse(self,fileName):
        '''
         This will parse the params or topo or cfg file and return content in the file as Dictionary
        '''
        self.fileName = fileName
        matchFileName = re.match(r'(.*)\.(params|topo)',self.fileName,re.M|re.I)
        if matchFileName:
            try :
                parsedInfo = ConfigObj(self.fileName)
                return parsedInfo
            except Exception:
                print "There is no such file to parse "+fileName
        else:
            return 0

    def parseParams(self,paramsPath):
        '''
        It will take the params file path and will return the params dictionary
        '''

        paramsPath = re.sub("\.","/",paramsPath)
        paramsPath = re.sub("tests|examples","",paramsPath)
        #print main.tests_path+"/"+paramsPath+".params"
        params = self.parse(main.tests_path+paramsPath+".params")
        paramsAsString = str(params)
        return eval(paramsAsString)

    def parseTopology(self,topologyPath):
        '''
        It will take topology file path and will return topology dictionary
        '''
        topologyPath = re.sub("\.","/",topologyPath)
        topologyPath = re.sub("tests|examples","",topologyPath)
        topology = self.parse(main.tests_path+"/"+topologyPath+".topo")
        topoAsString = str(topology)
        return eval(topoAsString)

