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

Reply via email to