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
