sorry, disregard my last message, false alarm, still has some local mods. 2008/6/19 Matthew Russell <[EMAIL PROTECTED]>:
> Sean, > > all tests fail for me (python2.5) wth r1113, i'm looking into it now. > > > Matt > > 2008/6/19 Sean Gillies <[EMAIL PROTECTED]>: > >> Cool. In that case, we might be ready for a beta or a release candidate? >> >> Matthew Russell wrote: >> > Hi Sean, >> > >> > i'm ok with the optional dependance :) >> > So we'll keep the current api. including dump and load, >> > just make the them raise NotImplementedError with a hint to install >> > simplejson or see README on how to use something another lib, or roll >> your >> > own. >> > >> > >> > Cheers, >> > Matt >> > >> > 2008/6/19 Sean Gillies <[EMAIL PROTECTED]>: >> > >> >> Matt, >> >> >> >> That seems good to me. I would, however, very much like to keep the >> >> optional dependence on simplejson for dumps/loads. BTW, simplejson is >> in >> >> the 2.6/3.0 standard library: >> >> >> >> http://bugs.python.org/issue2750 >> >> >> >> Sean >> >> >> >> >> >> Matthew Russell wrote: >> >>> Sean, Eric, those interested, >> >>> >> >>> Another option is to abandon my abstracton idea, and just get ride of >> >>> dumps/dump/load/loads/encode/decode in favour of: >> >>> >> >>> # 'feature' in this example, could be >> >> geojson.GeoJSON.to_instance({"type": >> >>> ..., ...}) >> >>> feature = >> geojsonlib.Feature(geometry=geojsonlib.Point(coordinates=[x, >> >> y])) >> >>> d = dict(feature) >> >>> myjsonlib.[encode|write|dumps](d, ...) >> >>> >> >>> (Where myjsonlib is simplejson, json.py, jsonlib, cjson etc) >> >>> >> >>> since this is all that needs to happen, and is exactly what each >> 'codec' >> >> in >> >>> my hooks idea would accomplish, except we gain the advantage of not >> >> having >> >>> to track each JSON library api, give the user (us too) one less level >> of >> >>> indirection to follow. >> >>> >> >>> We'd also not have dependancy on simplejson, and have no other >> >> dependancies. >> >>> The GeoJSON spec declares that geojson can have arbitrary members, >> this >> >> is >> >>> still possible, >> >>> just less convienient syntax: >> >>> >> >>> d = {"blog": >> >>> {"placename": "California", >> >>> "location": feature} >> >>> } >> >>> json1 = cjson.write(d) >> >>> json 2 = simplejson.dumps(d, encoding="utf-8") >> >>> >> >>> So, now I think this is (probably) the right way to go... what do you >> >> think? >> >>> >> >>> >> >>> 2008/6/19 Matthew Russell <[EMAIL PROTECTED]>: >> >>> >> >>>> Sean, >> >>>> >> >>>> I've done a bit of digging, an unfortunatly, writing a cjson codec >> would >> >> be >> >>>> non-trivial, or impossible; unless the author(s) of that package >> >> provided a >> >>>> hook (like JSONEcoder.default is) >> >>>> >> >>>> jsonlib's write (equivilent of dumps/encode) has an 'on_unknown' >> hook, >> >> so >> >>>> that'd work, >> >>>> as would all other pure-python json libraries. >> >>>> >> >>>> A jsonlib codec might look like: >> >>>> >> >>>> class JsonlibCodec(object): >> >>>> def encode(self, obj, **kwargs): >> >>>> def on_unknown(value): >> >>>> d = dict(gejsonlib.GeoJSON.to_instance(value)) >> >>>> return jsonlib.write(d) >> >>>> kwargs["on_unknown"] = on_unknown >> >>>> return jsonlib.write(obj, **kwargs) >> >>>> >> >>>> def decode(self, json, **kwargs): >> >>>> obj_hooj = kwargs.get("object_hook", hoo) >> >>>> o = jsonlib.read(json) >> >>>> if obj_hook: >> >>>> o = obj_hook(o) >> >>>> return o >> >>>> >> >>>> A json-py codec might look like: >> >>>> >> >>>> >> >>>> import json >> >>>> class JsonPyCodec(object): >> >>>> def encode(self, obj, *args, **kwargs): >> >>>> json_writer = json.JsonWriter() >> >>>> try: >> >>>> return json_writer.write(obj) >> >>>> except json.WriteException: # not a python object >> corrospondng >> >> to >> >>>> 'primative' json type >> >>>> return >> >>>> json_writer.write(dict(geojsonlib.GeoJSON.to_instance(obj))) >> >>>> >> >>>> def decode(obj, *args, **kwargs): >> >>>> obj_hook = kwargs.pop("object_hook", lambda x: obj) >> >>>> return json.JsonReader().read(obj_hooj(obj)) >> >>>> >> >>>> >> >>>> Matt >> >>>> >> >>>> >> >>>> >> >>>> 2008/6/18 Matthew Russell <[EMAIL PROTECTED]>: >> >>>> >> >>>>> Sean, >> >>>>> >> >>>>> >> >>>>> I'd be ok with keeping loads/dumps as functions in >> >> geojsonlib/__init__.py >> >>>>> They could even raise DepricationWaring. >> >>>>> >> >>>>> I've seen r1113's encoding.py, and it's similar to what I had in >> mind, >> >> but >> >>>>> not quite. >> >>>>> >> >>>>> There's an extra level of indirection, geojsonlib/__init__ would >> >> define: >> >>>>> # nb. in the following, geojsonlib.encoding is renamed to codecs >> >>>>> >> >>>>> def encode(obj, codec=None, *args, **kwargs): >> >>>>> codec = codec or geojsonlib.codecs.default >> >>>>> return codec.encode(obj, *args, **kwargs) >> >>>>> >> >>>>> decode would be much the same. >> >>>>> Then I can write a CJson() codec (which defines encode and decode), >> and >> >>>>> have that used instead. >> >>>>> >> >>>>> in geojsonlib.codecs, my hacked up version of the module goes >> something >> >>>>> like: >> >>>>> >> >>>>> class JSONCodec(objet): >> >>>>> def encode(self, obj, **kwargs): raise NotImplemented >> >>>>> def decode(self, obj, **kwargs): raise NotImplemented >> >>>>> >> >>>>> try: >> >>>>> import simplejson >> >>>>> except ImportError: >> >>>>> default = Codec() >> >>>>> else: >> >>>>> class SimpleJSONCodec(JSONCodec): >> >>>>> >> >>>>> def encode(self obj, **kwargs): >> >>>>> return simplejson.dumps(obj, **kwargs) >> >>>>> >> >>>>> def decode(self, obj, **kwargs): >> >>>>> return simplejson.loads(obj, **kwargs) >> >>>>> >> >>>>> default = SimepJSONCodec >> >>>>> >> >>>>> >> >>>>> Cheers, >> >>>>> Matt >> >>>>> >> >>>>> 2008/6/18 Sean Gillies <[EMAIL PROTECTED]>: >> >>>>> >> >>>>> Matt, >> >>>>>> What would you think about keeping geojsonlib.dumps/loads as is for >> >>>>>> convenience and just raise exceptions if simplejson can't be >> imported? >> >>>>>> See rev 1113 -- I marked the dump/load feature as an "extra" in >> >> setup.py. >> >>>>>> Sean >> >>>>>> >> >>>>>> Matthew Russell wrote: >> >>>>>>> Hi, >> >>>>>>> >> >>>>>>> this is a proposal which Sean already +1'd in the recent >> "[Community] >> >>>>>> [Fwd: >> >>>>>>> [Geojson] GeoJSON 1.0 Released]" thread. >> >>>>>>> >> >>>>>>> The proposal is to remove the reliance on simplejson from >> geojsonlib >> >>>>>> (but >> >>>>>>> keeping simplejson as the default). >> >>>>>>> >> >>>>>>> I'n slight alteration to my previous api suggestion for the >> interface >> >>>>>> for >> >>>>>>> simplejson's peers, >> >>>>>>> I'd like to change the api from: >> >>>>>>> >> >>>>>>> geojsonlib.{dumps, dump, loads, load} >> >>>>>>> >> >>>>>>> to: >> >>>>>>> >> >>>>>>> json = geojsonlib.encode(obj, codec="geojsonlib.defaultcodec", >> >>>>>> *codec_args, >> >>>>>>> **codec_kwargs) >> >>>>>>> - where obj is any python object supporting the geointerface, or >> a >> >>>>>> mapping >> >>>>>>> - returns unicode or str >> >>>>>>> >> >>>>>>> obj = geojsonlib.decode(json, codec="geojsonlib.defaultcodec", >> >>>>>> *codec_args, >> >>>>>>> **codec_kwargs) >> >>>>>>> >> >>>>>>> - where 'json' is a unicode or str instance. >> >>>>>>> - reutrns a geojsonlib.GeoJSON instance or subclass thereof. >> >>>>>>> >> >>>>>>> The primary motivation for this is file encoding. >> >>>>>>> I'd like to keep the serialisation to file-like objects within the >> >>>>>> control >> >>>>>>> of the user at the I/O boundaries. >> >>>>>>> Removing the dump and load functions from geojsonlib would acheive >> >>>>>> this. >> >>>>>>> I also think the names encode and decode are better, since load >> and >> >>>>>> dumps >> >>>>>>> indicate serialization to disk. >> >>>>>>> >> >>>>>>> So, does anyone object if the api changes from: >> >>>>>>> geojsonlib.dumps -> geojson.encode >> >>>>>>> geojsonlib.loads -> geojson.decode >> >>>>>>> geojsonlib.dump -> file_like.write(geojsonlib.encode(obj)) >> >>>>>>> geojsonlib.load -> geojsonlib.decode(file_like.read()) >> >>>>>>> >> >>>>>>> ? >> >>>>>>> >> >>>>>>> Once this is implemented, simplejson will only be required in the >> >>>>>> default >> >>>>>>> case: >> >>>>>>> >> >>>>>>> .encode(obj), .decode(obj) >> >>>>>>> >> >>>>>>> and not if you want to use another JSON library, and have an >> adapter: >> >>>>>>> >> >>>>>>> e.g >> >>>>>>> >> >>>>>>> class CjsonEncoder: >> >>>>>>> def encode(self, obj): >> >>>>>>> ... >> >>>>>>> >> >>>>>>> .encode(obj, codec=CjsonEncoder) >> >>>>>>> >> >>>>>>> N.B: >> >>>>>>> >> >>>>>>> 'codec' can be a dotted path, or any namespace with a .encode or >> >>>>>> .decode >> >>>>>>> callable attribute as releveant. >> >>>>>>> >> >>>>>>> -- >> >>>>>>> Cheers, >> >>>>>>> Matt >> >> _______________________________________________ >> >> Community mailing list >> >> [email protected] >> >> http://lists.gispython.org/mailman/listinfo/community >> >> >> > >> > >> > >> > >> > ------------------------------------------------------------------------ >> > >> > _______________________________________________ >> > Community mailing list >> > [email protected] >> > http://lists.gispython.org/mailman/listinfo/community >> >> _______________________________________________ >> Community mailing list >> [email protected] >> http://lists.gispython.org/mailman/listinfo/community >> > > > > -- > Cheers, > Matt -- Cheers, Matt
_______________________________________________ Community mailing list [email protected] http://lists.gispython.org/mailman/listinfo/community
