Changeset 193


Ignore:
Timestamp:
04/17/12 16:48:27 (13 months ago)
Author:
cyrusdaboo
Message:

Support generation of JSON format iCalendar data. Exact format is a work in progress.

Location:
PyCalendar/branches/json/src/pycalendar
Files:
1 added
20 edited

Legend:

Unmodified
Added
Removed
  • PyCalendar/branches/json/src/pycalendar/attribute.py

    r164 r193  
    104104            text = XML.SubElement(param, xmldefs.makeTag(namespace, xmldefs.value_text)) 
    105105            text.text = value 
     106 
     107    def writeJSON(self, jobject): 
     108        jobject[self.getName().lower()] = self.mValues if len(self.mValues) > 1 else self.mValues[0] 
     109 
  • PyCalendar/branches/json/src/pycalendar/calendar.py

    r169 r193  
    4242import collections 
    4343import xml.etree.cElementTree as XML 
     44import json 
    4445 
    4546class PyCalendar(PyCalendarComponentBase): 
     
    457458        super(PyCalendar, self).writeXML(root, xmldefs.iCalendar20_namespace) 
    458459        return root 
     460         
     461    def getTextJSON(self, includeTimezones=False): 
     462        jobject = self.writeJSON(includeTimezones) 
     463        return json.dumps(jobject, indent=2) 
     464 
     465    def writeJSON(self, includeTimezones=False): 
     466        # Make sure all required timezones are in this object 
     467        if includeTimezones: 
     468            self.includeTimezones() 
     469             
     470        # Root node structure 
     471        vcalendar = [] 
     472        super(PyCalendar, self).writeJSON(vcalendar) 
     473        return vcalendar 
    459474         
    460475    # Get expanded components 
  • PyCalendar/branches/json/src/pycalendar/componentbase.py

    r179 r193  
    309309        self.writeComponentsFilteredXML(comp, namespace, filter) 
    310310 
     311    def writeJSON(self, jobject): 
     312         
     313        # Component element 
     314        comp = {"type":self.getType().lower()} 
     315        jobject.append(comp) 
     316         
     317        # Each property 
     318        self.writePropertiesJSON(comp) 
     319     
     320        # Each component 
     321        self.writeComponentsJSON(comp) 
     322     
     323    def writeJSONFiltered(self, jobject, filter): 
     324        # Component element 
     325        comp = {"type":self.getType()} 
     326        jobject.append(comp) 
     327         
     328        # Each property 
     329        self.writePropertiesFilteredJSON(comp, filter) 
     330     
     331        # Each component 
     332        self.writeComponentsFilteredJSON(comp, filter) 
     333 
    311334    def sortedComponents(self): 
    312335         
     
    371394                    if subfilter is not None: 
    372395                        subcomp.writeFilteredXML(comps, namespace, subfilter) 
     396         
     397    def writeComponentsJSON(self, jobject): 
     398         
     399        if self.mComponents: 
     400            comps = [] 
     401            jobject["components"] = comps 
     402             
     403            # Write out the remainder  
     404            for component in self.sortedComponents(): 
     405                component.writeJSON(comps) 
     406 
     407    def writeComponentsFilteredJSON(self, jobject, filter): 
     408 
     409        if self.mComponents: 
     410            comps = [] 
     411            jobject["components"] = comps 
     412             
     413            # Shortcut for all sub-components 
     414            if filter.isAllSubComponents(): 
     415                self.writeJSON(comps) 
     416            elif filter.hasSubComponentFilters(): 
     417                for subcomp in self.sortedcomponents(): 
     418                    subfilter = filter.getSubComponentFilter(subcomp.getType()) 
     419                    if subfilter is not None: 
     420                        subcomp.writeFilteredJSON(comps, subfilter) 
    373421         
    374422    def loadValue(self, value_name): 
     
    530578                    prop.writeFilteredXML(props, namespace, filter) 
    531579 
     580    def writePropertiesJSON(self, jobject): 
     581 
     582        properties = {} 
     583        jobject["properties"] = properties 
     584         
     585        # Sort properties by name 
     586        keys = self.sortedPropertyKeys() 
     587        for key in keys: 
     588            props = self.mProperties[key] 
     589            for prop in props: 
     590                prop.writeJSON(properties) 
     591 
     592    def writePropertiesFilteredJSON(self, jobject, filter): 
     593 
     594        properties = {} 
     595        jobject["properties"] = properties 
     596         
     597        # Sort properties by name 
     598        keys = self.sortedPropertyKeys() 
     599 
     600        # Shortcut for all properties 
     601        if filter.isAllProperties(): 
     602            for key in keys: 
     603                for prop in self.getProperties(key): 
     604                    prop.writeJSON(properties) 
     605        elif filter.hasPropertyFilters(): 
     606            for key in keys: 
     607                for prop in self.getProperties(key): 
     608                    prop.writeFilteredJSON(properties, filter) 
     609 
    532610    def loadPrivateValue(self, value_name): 
    533611        # Read it in from properties list and then delete the property from the 
  • PyCalendar/branches/json/src/pycalendar/datetime.py

    r178 r193  
    814814                return "%04d-%02d-%02dT%02d:%02d:%02d" % ( self.mYear, self.mMonth, self.mDay, self.mHours, self.mMinutes, self.mSeconds ) 
    815815 
     816    getJSONText = getXMLText 
     817     
    816818    @classmethod 
    817819    def parseText(cls, data, fullISO=False): 
     
    966968        value.text = self.getXMLText() 
    967969 
     970    def writeJSON(self, jobject): 
     971        jobject["date" if self.isDateOnly() else "date-time"] = self.getJSONText() 
     972 
    968973    def normalise( self ): 
    969974        # Normalise seconds 
  • PyCalendar/branches/json/src/pycalendar/datetimevalue.py

    r164 r193  
    3939        self.mValue.writeXML(node, namespace) 
    4040 
     41    def writeJSON(self, jobject): 
     42        self.mValue.writeJSON(jobject) 
     43 
    4144    def getValue(self): 
    4245        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/duration.py

    r173 r193  
    254254    def writeXML(self, node, namespace): 
    255255        node.text = self.getText() 
     256 
     257    def writeJSON(self, jobject): 
     258        jobject["duration"] = self.getText() 
     259 
  • PyCalendar/branches/json/src/pycalendar/durationvalue.py

    r164 r193  
    4040        value.text = self.mValue.writeXML() 
    4141 
     42    def writeJSON(self, jobject): 
     43        self.mValue.writeJSON(jobject) 
     44 
    4245    def getValue(self): 
    4346        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/integervalue.py

    r164 r193  
    4545        value.text = str(self.mValue) 
    4646 
     47    def writeJSON(self, jobject): 
     48        jobject["integer"] = self.mValue 
     49 
    4750    def getValue(self): 
    4851        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/multivalue.py

    r189 r193  
    8383            iter.writeXML(node, namespace) 
    8484 
     85    def writeJSON(self, jobject): 
     86        mtype = None 
     87        values = [] 
     88        for iter in self.mValues: 
     89            result = {} 
     90            iter.writeJSON(result) 
     91            k, v = result.items()[0] 
     92            if mtype is None: 
     93                mtype = k 
     94            values.append(v) 
     95        jobject[mtype] = values 
     96 
    8597PyCalendarValue.registerType(PyCalendarValue.VALUETYPE_MULTIVALUE, PyCalendarMultiValue, None) 
  • PyCalendar/branches/json/src/pycalendar/period.py

    r164 r193  
    104104            end.text = self.mEnd.getXMLText() 
    105105 
     106    def writeJSON(self, jobject): 
     107         
     108        period = {} 
     109        jobject["period"] = period 
     110         
     111        period["start"] = self.mStart.getJSONText() 
     112         
     113        if self.mUseDuration: 
     114            period["duration"] = self.mDuration.getText() 
     115        else: 
     116            period["end"] = self.mEnd.getJSONText() 
     117         
    106118    def getStart( self ): 
    107119        return self.mStart 
  • PyCalendar/branches/json/src/pycalendar/periodvalue.py

    r164 r193  
    4040        value.text = self.mValue.writeXML() 
    4141 
     42    def writeJSON(self, jobject): 
     43        self.mValue.writeJSON(jobject) 
     44 
    4245    def getValue( self ): 
    4346        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/plaintextvalue.py

    r164 r193  
    4343        value.text = self.mValue 
    4444 
     45    def writeJSON(self, jobject): 
     46        jobject["text"] = self.mValue 
     47 
    4548    def getValue(self): 
    4649        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/property.py

    r191 r193  
    500500            self.mValue.writeXML(prop, namespace) 
    501501     
     502    def writeJSON(self, jobject): 
     503         
     504        prop = {} 
     505        if self.getName().lower() not in jobject: 
     506            jobject[self.getName().lower()] = prop 
     507        elif isinstance(jobject[self.getName().lower()], list): 
     508            jobject[self.getName().lower()].append(prop) 
     509        else: 
     510            jobject[self.getName().lower()] = [jobject[self.getName().lower()], prop] 
     511         
     512        # Write all attributes 
     513        if len(self.mAttributes): 
     514            params = {} 
     515            prop["parameters"] = params 
     516            for key in sorted(self.mAttributes.keys()): 
     517                for attr in self.mAttributes[key]: 
     518                    if attr.getName() != "VALUE": 
     519                        attr.writeJSON(params) 
     520 
     521        # Write value 
     522        if self.mValue: 
     523            self.mValue.writeJSON(prop) 
     524         
     525 
    502526    def _init_PyCalendarProperty(self): 
    503527        self.mName = "" 
  • PyCalendar/branches/json/src/pycalendar/recurrence.py

    r164 r193  
    673673                child.text = str(item) 
    674674                 
     675    def writeJSON(self, jobject): 
     676 
     677        recur = {} 
     678        jobject["recur"] = recur 
     679 
     680        recur["freq"] = self.cFreqToXMLMap[self.mFreq] 
     681 
     682        if self.mUseCount: 
     683            recur["count"] = self.mCount 
     684        elif self.mUseUntil: 
     685            recur["until"] = self.mUntil.getJSONText() 
     686 
     687        if self.mInterval > 1: 
     688            recur["interval"] = self.mInterval 
     689 
     690        if self.mBySeconds is not None and len(self.mBySeconds) != 0: 
     691            recur["bysecond"] = self.mBySeconds 
     692        if self.mByMinutes is not None and len(self.mByMinutes) != 0: 
     693            recur["byminute"] = self.mByMinutes 
     694        if self.mByHours is not None and len(self.mByHours) != 0: 
     695            recur["byhour"] = self.mByHours 
     696             
     697        if self.mByDay is not None and len(self.mByDay) != 0: 
     698            bydays = [] 
     699            for iter in self.mByDay: 
     700                data = "" 
     701                if iter[0] != 0: 
     702                    data = str(iter[0]) 
     703                data += self.cWeekdayRecurMap.get(iter[1], "") 
     704                bydays.append(data) 
     705            recur["byday"] = bydays 
     706 
     707        if self.mByMonthDay is not None and len(self.mByMonthDay) != 0: 
     708            recur["bymonthday"] = self.mByMonthDay 
     709        if self.mByYearDay is not None and len(self.mByYearDay) != 0: 
     710            recur["byyearday"] = self.mByYearDay 
     711        if self.mByWeekNo is not None and len(self.mByWeekNo) != 0: 
     712            recur["byweekno"] = self.mByWeekNo 
     713        if self.mByMonth is not None and len(self.mByMonth) != 0: 
     714            recur["bymonth"] = self.mByMonth 
     715        if self.mBySetPos is not None and len(self.mBySetPos) != 0: 
     716            recur["bysetpos"] = self.mBySetPos 
     717 
     718        # MO is the default so we do not need it 
     719        if self.mWeekstart != definitions.eRecurrence_WEEKDAY_MO: 
     720            recur["wkst"] = self.cWeekdayRecurMap.get(self.mWeekstart, definitions.cICalValue_RECUR_WEEKDAY_MO) 
     721 
    675722     
    676723    def hasBy(self): 
  • PyCalendar/branches/json/src/pycalendar/recurrencevalue.py

    r164 r193  
    3939        self.mValue.writeXML(node, namespace) 
    4040 
     41    def writeJSON(self, jobject): 
     42        self.mValue.writeJSON(jobject) 
     43 
    4144    def getValue( self ): 
    4245        return self.mValue 
  • PyCalendar/branches/json/src/pycalendar/requeststatusvalue.py

    r172 r193  
    9191        if len(self.mValue) == 3 and self.mValue[2]: 
    9292            data = XML.SubElement(node, xmldefs.makeTag(namespace, xmldefs.req_status_data)) 
    93             data.text = self.mValue[1] 
     93            data.text = self.mValue[2] 
     94 
     95    def writeJSON(self, jobject): 
     96        jobject["request-status"] = { 
     97            "code": self.mValue[0], 
     98            "description": self.mValue[1] 
     99        } 
     100        if len(self.mValue) == 3 and self.mValue[2]: 
     101            jobject["request-status"]["data"] = self.mValue[2] 
    94102 
    95103    def getValue(self): 
  • PyCalendar/branches/json/src/pycalendar/tests/test_xml.py

    r191 r193  
    2020import unittest 
    2121 
    22 class TestCalendar(unittest.TestCase): 
     22class TestXML(unittest.TestCase): 
    2323     
    2424    data = ( 
  • PyCalendar/branches/json/src/pycalendar/utcoffsetvalue.py

    r164 r193  
    8989    def writeXML(self, node, namespace): 
    9090         
    91         os = StringIO.StringIO() 
     91        os = StringIO() 
    9292        self.generate(os) 
    9393        text = os.getvalue() 
     
    9696        value = self.getXMLNode(node, namespace) 
    9797        value.text = text 
     98 
     99    def writeJSON(self, jobject): 
     100         
     101        os = StringIO() 
     102        self.generate(os) 
     103        text = os.getvalue() 
     104        text = text[:-2] + ":" + text[-2:] 
     105 
     106        jobject["utc-offset"] = text 
    98107 
    99108    def getValue( self ): 
  • PyCalendar/branches/json/src/pycalendar/value.py

    r191 r193  
    8989        raise NotImplementedError 
    9090 
     91    def writeJSON(self, jobject): 
     92        raise NotImplementedError 
     93 
    9194    def getXMLNode(self, node, namespace): 
    9295        return XML.SubElement(node, xmldefs.makeTag(namespace, self._xmlMap[self.getType()])) 
  • PyCalendar/branches/json/src/pycalendar/valueutils.py

    r164 r193  
    4343    def writeXML(self, node, namespace): 
    4444        raise NotImplementedError 
     45 
     46    def writeJSON(self, jobject): 
     47        raise NotImplementedError 
Note: See TracChangeset for help on using the changeset viewer.