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
>



-- 
Cheers,
Matt
_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to